From bcda04ee86e27deeaddf954cfcf328e5437f8e28 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Mon, 15 May 2023 07:38:53 -0700 Subject: [PATCH 001/299] [AC-358] SelfHosted update subscription page (#5101) * [AC-358] Add selfHostSubscriptionExpiration property to organization-subscription.response.ts * [AC-358] Update selfHost org subscription template - Replace "Subscription" with "SubscriptionExpiration" - Add question mark help link - Add helper text for grace period - Add support for graceful fallback in case of missing grace period in subscription response * Update libs/common/src/billing/models/response/organization-subscription.response.ts Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> * [AC-358] Remove unnecessary hypen Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> * [AC-358] Introduce SelfHostedOrganizationSubscription view - Encapsulate expiration/grace period logic in the new view object. - Remove API response getters from the angular component - Replace the API response object with the new view * [AC-358] Clarify name for new expiration without grace period field * [AC-358] Update constructor parameter name * [AC-358] Simplify new selfhost subscription view - Make expiration date properties public - Remove obsolete expiration date getters - Update the component to use new properties - Add helper to component for determining if the subscription should be rendered as expired (red text) * [AC-358] Rename isExpired to isExpiredAndOutsideGracePeriod to be more explicit --------- Co-authored-by: Thomas Rittson <31796059+eliykat@users.noreply.github.com> --- ...ation-subscription-selfhost.component.html | 42 +++++++++---- ...ization-subscription-selfhost.component.ts | 24 +++++--- apps/web/src/locales/en/messages.json | 12 ++++ .../organization-subscription.response.ts | 2 + ...f-hosted-organization-subscription.view.ts | 61 +++++++++++++++++++ 5 files changed, 122 insertions(+), 19 deletions(-) create mode 100644 libs/common/src/billing/models/view/self-hosted-organization-subscription.view.ts diff --git a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html index 08fb12e76eb..03771c5896f 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html +++ b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html @@ -22,25 +22,45 @@ [providerName]="userOrg.providerName" > - +
{{ "billingPlan" | i18n }}
-
{{ sub.plan.name }}
-
{{ "expiration" | i18n }}
-
- {{ sub.expiration | date : "mediumDate" }} - - - {{ "licenseIsExpired" | i18n }} - -
-
{{ "neverExpires" | i18n }}
+
{{ subscription.planName }}
{{ "lastLicenseSync" | i18n }}
{{ lastLicenseSync != null ? (lastLicenseSync | date : "medium") : ("never" | i18n) }}
+
+ {{ + "subscriptionExpiration" | i18n + }} + + + {{ "licensePaidFeaturesHelp" | i18n }} + +
+
+ {{ + (subscription.hasSeparateGracePeriod + ? subscription.expirationWithoutGracePeriod + : subscription.expirationWithGracePeriod + ) | date : "mediumDate" + }} +
+ {{ + "selfHostGracePeriodHelp" + | i18n : (subscription.expirationWithGracePeriod | date : "mediumDate") + }} +
+
+
{{ "neverExpires" | i18n }}
Date: Mon, 15 May 2023 17:38:40 +0200 Subject: [PATCH 002/299] fix(deps): update dependency tldts to v6 (#5449) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- apps/cli/package.json | 2 +- package-lock.json | 18 +++++++++--------- package.json | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index ba6da1e8f6c..20bdefae64d 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -71,7 +71,7 @@ "papaparse": "5.4.1", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", - "tldts": "5.7.112", + "tldts": "6.0.5", "zxcvbn": "4.4.2" } } diff --git a/package-lock.json b/package-lock.json index 2d62c7ce117..7b62ac030be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "qrious": "4.0.2", "rxjs": "7.8.1", "sweetalert2": "10.16.11", - "tldts": "5.7.112", + "tldts": "6.0.5", "utf-8-validate": "5.0.10", "zone.js": "0.12.0", "zxcvbn": "4.4.2" @@ -217,7 +217,7 @@ "papaparse": "5.4.1", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", - "tldts": "5.7.112", + "tldts": "6.0.5", "zxcvbn": "4.4.2" }, "bin": { @@ -41794,20 +41794,20 @@ "dev": true }, "node_modules/tldts": { - "version": "5.7.112", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-5.7.112.tgz", - "integrity": "sha512-6VSJ/C0uBtc2PQlLsp4IT8MIk2UUh6qVeXB1HZtK+0HiXlAPzNcfF3p2WM9RqCO/2X1PIa4danlBLPoC2/Tc7A==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.0.5.tgz", + "integrity": "sha512-2JQhXcZbp8eh2Ka81yvu5WzBa7NPKhGhXHy+dz0grD7w3DjgK0CsryEwNjVs6i170VF4sZAkwP8pGb1q53wiiQ==", "dependencies": { - "tldts-core": "^5.7.112" + "tldts-core": "^6.0.5" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "5.7.112", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.112.tgz", - "integrity": "sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q==" + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.0.5.tgz", + "integrity": "sha512-DBpylEmOYzU+x8oiJU6pULwr1WPIoW1YYXxf8K88N+mEtIB9QOSCsMj0KdARoJFS/rMDWRguB4dRKL0zqq6LWQ==" }, "node_modules/tmp": { "version": "0.0.33", diff --git a/package.json b/package.json index 08eef85efc4..243c35449e7 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "qrious": "4.0.2", "rxjs": "7.8.1", "sweetalert2": "10.16.11", - "tldts": "5.7.112", + "tldts": "6.0.5", "utf-8-validate": "5.0.10", "zone.js": "0.12.0", "zxcvbn": "4.4.2" From c7150b8981966621d0136445d2a453fdcfdfd3c0 Mon Sep 17 00:00:00 2001 From: Cesar Gonzalez Date: Mon, 15 May 2023 11:42:01 -0500 Subject: [PATCH 003/299] [PM-1796] The autofill keyboard shortcut does not prompt a user to unlock a locked extension within an incognito browsing session (#5337) * [PM-1796] The autofill keyboard shortcut does not prompt a user to unlock a locked extension within an incongito browsing session * [PM-1796] Implementing fixes for how we handle focus redirection when logging a user in and attempting to autofill within the Firefox Workspaces addon * [PM-1796] Removing the `openerTab` value from the createNewTab method within brwoserApi.ts * [PM-1796] Removing async declaration from createNewTab * [PM-1796] Removing unnecessary param from the call to openBitwardenExtrensionTab --- .../src/background/runtime.background.ts | 6 ++-- apps/browser/src/browser/browserApi.ts | 35 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index da9e196410b..7a6f293f8d1 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -75,6 +75,8 @@ export default class RuntimeBackground { this.systemService.cancelProcessReload(); if (item) { + await BrowserApi.focusWindow(item.commandToRetry.sender.tab.windowId); + await BrowserApi.focusTab(item.commandToRetry.sender.tab.id); await BrowserApi.tabSendMessageData( item.commandToRetry.sender.tab, "unlockCompleted", @@ -103,7 +105,7 @@ export default class RuntimeBackground { await this.main.openPopup(); break; case "promptForLogin": - BrowserApi.openBitwardenExtensionTab("popup/index.html", true, sender.tab); + BrowserApi.openBitwardenExtensionTab("popup/index.html", true); break; case "openAddEditCipher": { const addEditCipherUrl = @@ -111,7 +113,7 @@ export default class RuntimeBackground { ? "popup/index.html#/edit-cipher" : "popup/index.html#/edit-cipher?cipherId=" + msg.data.cipherId; - BrowserApi.openBitwardenExtensionTab(addEditCipherUrl, true, sender.tab); + BrowserApi.openBitwardenExtensionTab(addEditCipherUrl, true); break; } case "closeTab": diff --git a/apps/browser/src/browser/browserApi.ts b/apps/browser/src/browser/browserApi.ts index 22c8f68c524..e93fcceb0df 100644 --- a/apps/browser/src/browser/browserApi.ts +++ b/apps/browser/src/browser/browserApi.ts @@ -129,24 +129,27 @@ export class BrowserApi { return Promise.resolve(chrome.extension.getViews({ type: "popup" }).length > 0); } - static createNewTab(url: string, active = true, openerTab?: chrome.tabs.Tab) { - chrome.tabs.create({ url: url, active: active, openerTabId: openerTab?.id }); + static createNewTab(url: string, active = true): Promise { + return new Promise((resolve) => + chrome.tabs.create({ url: url, active: active }, (tab) => resolve(tab)) + ); } - static openBitwardenExtensionTab( - relativeUrl: string, - active = true, - openerTab?: chrome.tabs.Tab - ) { - if (relativeUrl.includes("uilocation=tab")) { - this.createNewTab(relativeUrl, active, openerTab); - return; + static async focusWindow(windowId: number) { + await chrome.windows.update(windowId, { focused: true }); + } + + static async openBitwardenExtensionTab(relativeUrl: string, active = true) { + let url = relativeUrl; + if (!relativeUrl.includes("uilocation=tab")) { + const fullUrl = chrome.extension.getURL(relativeUrl); + const parsedUrl = new URL(fullUrl); + parsedUrl.searchParams.set("uilocation", "tab"); + url = parsedUrl.toString(); } - const fullUrl = chrome.extension.getURL(relativeUrl); - const parsedUrl = new URL(fullUrl); - parsedUrl.searchParams.set("uilocation", "tab"); - this.createNewTab(parsedUrl.toString(), active, openerTab); + const createdTab = await this.createNewTab(url, active); + this.focusWindow(createdTab.windowId); } static async closeBitwardenExtensionTab() { @@ -163,10 +166,6 @@ export class BrowserApi { const tabToClose = tabs[tabs.length - 1]; chrome.tabs.remove(tabToClose.id); - - if (tabToClose.openerTabId) { - this.focusTab(tabToClose.openerTabId); - } } static messageListener( From 74fb485f9d2df972dcb04f233e3c6ead9aaab026 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 18:44:09 +0200 Subject: [PATCH 004/299] chore(deps): update dependency @types/node to v18 (#5452) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 56 ++++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b62ac030be..63b93a86ad2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,7 +103,7 @@ "@types/koa-json": "2.0.20", "@types/lowdb": "1.0.11", "@types/lunr": "2.3.4", - "@types/node": "16.18.29", + "@types/node": "18.16.9", "@types/node-fetch": "2.6.3", "@types/node-forge": "1.3.2", "@types/node-ipc": "9.2.0", @@ -7124,6 +7124,12 @@ } } }, + "node_modules/@storybook/angular/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/angular/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7478,6 +7484,12 @@ "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", "dev": true }, + "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/builder-webpack4/node_modules/@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -9176,6 +9188,12 @@ } } }, + "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/builder-webpack5/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -9899,6 +9917,12 @@ "semver": "bin/semver.js" } }, + "node_modules/@storybook/core-common/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/core-common/node_modules/@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -11015,6 +11039,12 @@ } } }, + "node_modules/@storybook/core-server/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/core-server/node_modules/@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -11881,6 +11911,12 @@ "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", "dev": true }, + "node_modules/@storybook/manager-webpack4/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/manager-webpack4/node_modules/@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -13503,6 +13539,12 @@ } } }, + "node_modules/@storybook/manager-webpack5/node_modules/@types/node": { + "version": "16.18.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.30.tgz", + "integrity": "sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==", + "dev": true + }, "node_modules/@storybook/manager-webpack5/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -14803,9 +14845,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.29.tgz", - "integrity": "sha512-cal+XTYF4JBwG82kw3m9ktTOyUj7GXcO9i2o+t49y/OF+3asYfpHqTROF1UbV91e71g/UB5wNeL5hfqPthzp8Q==", + "version": "18.16.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz", + "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==", "dev": true }, "node_modules/@types/node-fetch": { @@ -22412,12 +22454,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/electron/node_modules/@types/node": { - "version": "18.16.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", - "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", - "dev": true - }, "node_modules/element-resize-detector": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz", diff --git a/package.json b/package.json index 243c35449e7..c70deaa4bab 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "@types/koa-json": "2.0.20", "@types/lowdb": "1.0.11", "@types/lunr": "2.3.4", - "@types/node": "16.18.29", + "@types/node": "18.16.9", "@types/node-fetch": "2.6.3", "@types/node-forge": "1.3.2", "@types/node-ipc": "9.2.0", From 0986a58c45de0f1b897486cab617014aa494ab57 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 19:29:26 +0200 Subject: [PATCH 005/299] chore(deps): update dependency concurrently to v8 (#5454) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 42 ++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63b93a86ad2..aa2d3a66f2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -118,7 +118,7 @@ "buffer": "6.0.3", "chromatic": "6.17.4", "clean-webpack-plugin": "4.0.0", - "concurrently": "7.6.0", + "concurrently": "8.0.1", "copy-webpack-plugin": "11.0.0", "cross-env": "7.0.3", "css-loader": "6.7.3", @@ -20104,27 +20104,27 @@ } }, "node_modules/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", + "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", + "chalk": "^4.1.2", + "date-fns": "^2.29.3", "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", + "rxjs": "^7.8.0", + "shell-quote": "^1.8.0", + "spawn-command": "0.0.2-1", + "supports-color": "^8.1.1", "tree-kill": "^1.2.2", - "yargs": "^17.3.1" + "yargs": "^17.7.1" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + "node": "^14.13.0 || >=16.0.0" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" @@ -20145,6 +20145,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/concurrently/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/conf": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", diff --git a/package.json b/package.json index c70deaa4bab..81b73a26bfe 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "buffer": "6.0.3", "chromatic": "6.17.4", "clean-webpack-plugin": "4.0.0", - "concurrently": "7.6.0", + "concurrently": "8.0.1", "copy-webpack-plugin": "11.0.0", "cross-env": "7.0.3", "css-loader": "6.7.3", From ace7ce773c95bba5ac114e750a862faf5e933cd9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 19:42:07 +0200 Subject: [PATCH 006/299] chore(deps): update dependency wait-on to v7 (#5456) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 27 ++++++++++++++------------- package.json | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa2d3a66f2a..7d312f99524 100644 --- a/package-lock.json +++ b/package-lock.json @@ -173,7 +173,7 @@ "typescript": "4.9.5", "url": "0.11.0", "util": "0.12.5", - "wait-on": "6.0.1", + "wait-on": "7.0.1", "webpack": "5.82.1", "webpack-cli": "4.10.0", "webpack-dev-server": "4.15.0", @@ -17589,12 +17589,13 @@ } }, "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.14.7" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, "node_modules/axobject-query": { @@ -43489,22 +43490,22 @@ } }, "node_modules/wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", + "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "dev": true, "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", + "axios": "^0.27.2", + "joi": "^17.7.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" + "minimist": "^1.2.7", + "rxjs": "^7.8.0" }, "bin": { "wait-on": "bin/wait-on" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" } }, "node_modules/walker": { diff --git a/package.json b/package.json index 81b73a26bfe..1fc4f50849d 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "typescript": "4.9.5", "url": "0.11.0", "util": "0.12.5", - "wait-on": "6.0.1", + "wait-on": "7.0.1", "webpack": "5.82.1", "webpack-cli": "4.10.0", "webpack-dev-server": "4.15.0", From 909d54e3268c2a3aa77c7cc1a6f2f52b02a43ab3 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Mon, 15 May 2023 12:18:06 -0700 Subject: [PATCH 007/299] [AC-358] Update help doc link (#5455) --- .../organization-subscription-selfhost.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html index 03771c5896f..400d34a1840 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html +++ b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html @@ -37,7 +37,7 @@ "subscriptionExpiration" | i18n }} Date: Tue, 16 May 2023 11:22:39 +0200 Subject: [PATCH 008/299] fix(deps): pin dependencies (#5438) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Hinton --- apps/desktop/desktop_native/Cargo.lock | 6 ++-- apps/desktop/desktop_native/Cargo.toml | 50 +++++++++++++------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index 1d2d79f2e9e..468bdbc7b0e 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -48,9 +48,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c70beb79cbb5ce9c4f8e20849978f34225931f665bb49efa6982875a4d5facb3" +checksum = "24a6904aef64d73cf10ab17ebace7befb918b82164785cb89907993be7f83813" [[package]] name = "block-buffer" @@ -578,7 +578,7 @@ version = "2.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556470a21074b55be8adee5f27ca04389cfdaca323a28b4b0e9c15466de94731" dependencies = [ - "bitflags 2.1.0", + "bitflags 2.2.1", "ctor", "napi-derive", "napi-sys", diff --git a/apps/desktop/desktop_native/Cargo.toml b/apps/desktop/desktop_native/Cargo.toml index 60b330ea751..f005ed9d50c 100644 --- a/apps/desktop/desktop_native/Cargo.toml +++ b/apps/desktop/desktop_native/Cargo.toml @@ -9,30 +9,30 @@ version = "0.0.0" crate-type = ["cdylib"] [features] -default=[] -manual_test=[] +default = [] +manual_test = [] [dependencies] -aes = "0.8.2" -anyhow = "1.0" -base64 = "0.21.0" -cbc = { version = "0.1.2", features = ["alloc"] } -napi = {version = "2.9.1", features = ["async"]} -napi-derive = "2.9.1" -rand = "0.8.5" -retry = "2.0.0" -scopeguard = "1.1.0" -sha2 = "0.10.6" -thiserror = "1.0.38" -tokio = {version = "1.17.0", features = ["full"]} -typenum = "1.16.0" +aes = "=0.8.2" +anyhow = "=1.0.70" +base64 = "=0.21.0" +cbc = { version = "=0.1.2", features = ["alloc"] } +napi = { version = "=2.12.4", features = ["async"] } +napi-derive = "=2.12.3" +rand = "=0.8.5" +retry = "=2.0.0" +scopeguard = "=1.1.0" +sha2 = "=0.10.6" +thiserror = "=1.0.40" +tokio = { version = "=1.27.0", features = ["full"] } +typenum = "=1.16.0" [build-dependencies] -napi-build = "2.0.1" +napi-build = "=2.0.1" [target.'cfg(windows)'.dependencies] -widestring = "0.5.1" -windows = {version = "0.48.0", features = [ +widestring = "=0.5.1" +windows = { version = "=0.48.0", features = [ "Foundation", "Security_Credentials_UI", "Security_Cryptography", @@ -42,16 +42,16 @@ windows = {version = "0.48.0", features = [ "Win32_System_WinRT", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_WindowsAndMessaging", -]} +] } [target.'cfg(windows)'.dev-dependencies] -keytar = "0.1.6" +keytar = "=0.1.6" [target.'cfg(target_os = "macos")'.dependencies] -core-foundation = "0.9.3" -security-framework = "2.6.1" -security-framework-sys = "2.6.1" +core-foundation = "=0.9.3" +security-framework = "=2.8.2" +security-framework-sys = "=2.8.0" [target.'cfg(target_os = "linux")'.dependencies] -gio = "0.15.6" -libsecret = "0.1.4" +gio = "=0.15.12" +libsecret = "=0.1.5" From 665fe971e0f5640fd126cb18ea7d30574edb97b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 11:23:40 +0200 Subject: [PATCH 009/299] chore(deps): update dependency webpack-cli to v5 (#5458) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 94 +++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d312f99524..ce3166df245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -175,7 +175,7 @@ "util": "0.12.5", "wait-on": "7.0.1", "webpack": "5.82.1", - "webpack-cli": "4.10.0", + "webpack-cli": "5.1.1", "webpack-dev-server": "4.15.0", "webpack-node-externals": "3.0.0" }, @@ -16049,34 +16049,42 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", + "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -43907,44 +43915,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", + "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.0", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.4", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -43953,16 +43959,34 @@ } } }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webpack-cli/node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/webpack-dev-middleware": { diff --git a/package.json b/package.json index 1fc4f50849d..5891939745d 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "util": "0.12.5", "wait-on": "7.0.1", "webpack": "5.82.1", - "webpack-cli": "4.10.0", + "webpack-cli": "5.1.1", "webpack-dev-server": "4.15.0", "webpack-node-externals": "3.0.0" }, From 177d7952928b0196d27153f5f2a5e6957bf4bea4 Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Tue, 16 May 2023 11:28:21 +0200 Subject: [PATCH 010/299] Remove tapable as dependency as we don't use it (#5457) tapable is a package which is used by other packages we depend on, but we don't actually use it anywhere. --- package-lock.json | 1 - package.json | 1 - 2 files changed, 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce3166df245..4fbe4960def 100644 --- a/package-lock.json +++ b/package-lock.json @@ -165,7 +165,6 @@ "storybook-addon-designs": "6.3.1", "style-loader": "3.3.2", "tailwindcss": "3.3.2", - "tapable": "1.1.3", "ts-jest": "28.0.8", "ts-loader": "9.4.2", "tsconfig-paths-webpack-plugin": "3.5.2", diff --git a/package.json b/package.json index 5891939745d..c701317cdb0 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,6 @@ "storybook-addon-designs": "6.3.1", "style-loader": "3.3.2", "tailwindcss": "3.3.2", - "tapable": "1.1.3", "ts-jest": "28.0.8", "ts-loader": "9.4.2", "tsconfig-paths-webpack-plugin": "3.5.2", From 1caae996ff012206199552610a12d34e3be95645 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 08:01:07 -0600 Subject: [PATCH 011/299] chore(deps): update crazy-max/ghaction-import-gpg digest to 72b6676 (#5446) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/version-bump.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 58b40bae25a..cc6344617d6 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -55,7 +55,7 @@ jobs: secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@c8bb57c57e8df1be8c73ff3d59deab1dbc00e0d1 # v5.3.0 + uses: crazy-max/ghaction-import-gpg@72b6676b71ab476b77e676928516f6982eef7a41 # v5.3.0 with: gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} From c58b0c0753d97713552d080fba36125af68afb65 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Tue, 16 May 2023 10:20:40 -0400 Subject: [PATCH 012/299] Return error code when any tsc typecheck fails (#5459) * Return error code when any tsc typecheck fails * Try with bash `sh ./scripts/test-types.s` resulted in errors missing `[[`, which is a bash builtin. It's possible the ubuntu runner is using some other shell. * Fix spec type errors * Switch to node for Windows compatibility --- .eslintignore | 2 ++ .../models/data/server-config.data.spec.ts | 17 ++++------- .../src/services/import.service.spec.ts | 5 ++-- package.json | 2 +- scripts/test-types.js | 29 +++++++++++++++++++ 5 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 scripts/test-types.js diff --git a/.eslintignore b/.eslintignore index f34b9683158..e1fbda38133 100644 --- a/.eslintignore +++ b/.eslintignore @@ -27,3 +27,5 @@ apps/cli/config/config.js tailwind.config.js libs/components/tailwind.config.base.js libs/components/tailwind.config.js + +scripts/*.js diff --git a/libs/common/src/models/data/server-config.data.spec.ts b/libs/common/src/models/data/server-config.data.spec.ts index 1c4e890ab80..30dc46cf1bc 100644 --- a/libs/common/src/models/data/server-config.data.spec.ts +++ b/libs/common/src/models/data/server-config.data.spec.ts @@ -7,7 +7,7 @@ import { describe("ServerConfigData", () => { describe("fromJSON", () => { it("should create a ServerConfigData from a JSON object", () => { - const serverConfigData = ServerConfigData.fromJSON({ + const json = { version: "1.0.0", gitHash: "1234567890", server: { @@ -22,18 +22,11 @@ describe("ServerConfigData", () => { sso: "https://sso.com", }, utcDate: "2020-01-01T00:00:00.000Z", - }); + featureStates: { feature: "state" }, + }; + const serverConfigData = ServerConfigData.fromJSON(json); - expect(serverConfigData.version).toEqual("1.0.0"); - expect(serverConfigData.gitHash).toEqual("1234567890"); - expect(serverConfigData.server.name).toEqual("test"); - expect(serverConfigData.server.url).toEqual("https://test.com"); - expect(serverConfigData.environment.vault).toEqual("https://vault.com"); - expect(serverConfigData.environment.api).toEqual("https://api.com"); - expect(serverConfigData.environment.identity).toEqual("https://identity.com"); - expect(serverConfigData.environment.notifications).toEqual("https://notifications.com"); - expect(serverConfigData.environment.sso).toEqual("https://sso.com"); - expect(serverConfigData.utcDate).toEqual("2020-01-01T00:00:00.000Z"); + expect(serverConfigData).toEqual(json); }); it("should be an instance of ServerConfigData", () => { diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index 9dafaed14f8..6dd6438b019 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -62,8 +62,9 @@ describe("ImportService", () => { }); it("has the promptForPassword_callback set", async () => { - expect(importer.promptForPassword_callback).not.toBeNull(); - expect(await importer.promptForPassword_callback()).toEqual(password); + // Cast to any to access private property. Note: assumes instance of BitwardenPasswordProtectedImporter + expect((importer as any).promptForPassword_callback).not.toBeNull(); + expect(await (importer as any).promptForPassword_callback()).toEqual(password); }); it("has the appropriate organization Id", () => { diff --git a/package.json b/package.json index c701317cdb0..3a29fa4ab76 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test": "jest", "test:watch": "jest --clearCache && jest --watch", "test:watch:all": "jest --watchAll", - "test:types": "for p in libs/**/tsconfig.spec.json; do echo \"Typechecking $p\"; tsc --noEmit --project $p; done", + "test:types": "node ./scripts/test-types.js", "docs:json": "compodoc -p ./tsconfig.json -e json -d .", "storybook": "npm run docs:json && start-storybook -p 6006", "build-storybook": "npm run docs:json && build-storybook", diff --git a/scripts/test-types.js b/scripts/test-types.js new file mode 100644 index 00000000000..0fc27f3646d --- /dev/null +++ b/scripts/test-types.js @@ -0,0 +1,29 @@ +const concurrently = require("concurrently"); +const path = require("path"); +const fs = require("fs"); + +function getFiles(dir) { + results = []; + fs.readdirSync(dir).forEach((file) => { + file = path.join(dir, file); + const stat = fs.statSync(file); + if (stat && stat.isDirectory()) { + results = results.concat(getFiles(file)); + } else { + results.push(file); + } + }); + return results; +} + +const files = getFiles(path.join(__dirname, "..", "libs")).filter((file) => { + const name = path.basename(file); + return name === "tsconfig.spec.json"; +}); + +concurrently( + files.map((file) => ({ + name: path.basename(path.dirname(file)), + command: `npx tsc --noEmit --project ${file}`, + })) +); From 8e61184c0f8d94cdc0d0b33bd5668ce4cb473fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Tue, 16 May 2023 16:26:01 +0200 Subject: [PATCH 013/299] [PM-2197] Fix memory leaks in Safari (#5451) * Remove reference cycle between ThemingService and the global window object * Deregister messageListeners on a safari popup to avoid mem leaks * Use pagehide event instead of unload --- apps/browser/src/browser/browserApi.ts | 22 ++++++++++++++----- .../src/services/theming/theming.service.ts | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/browser/src/browser/browserApi.ts b/apps/browser/src/browser/browserApi.ts index e93fcceb0df..b1313ebda6f 100644 --- a/apps/browser/src/browser/browserApi.ts +++ b/apps/browser/src/browser/browserApi.ts @@ -168,15 +168,27 @@ export class BrowserApi { chrome.tabs.remove(tabToClose.id); } + private static registeredMessageListeners: any[] = []; + static messageListener( name: string, callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => void ) { - chrome.runtime.onMessage.addListener( - (msg: any, sender: chrome.runtime.MessageSender, response: any) => { - callback(msg, sender, response); - } - ); + chrome.runtime.onMessage.addListener(callback); + + // Keep track of all the events registered in a Safari popup so we can remove + // them when the popup gets unloaded, otherwise we cause a memory leak + if (BrowserApi.isSafariApi && !BrowserApi.isBackgroundPage(window)) { + BrowserApi.registeredMessageListeners.push(callback); + + // The MDN recommend using 'visibilitychange' but that event is fired any time the popup window is obscured as well + // 'pagehide' works just like 'unload' but is compatible with the back/forward cache, so we prefer using that one + window.onpagehide = () => { + for (const callback of BrowserApi.registeredMessageListeners) { + chrome.runtime.onMessage.removeListener(callback); + } + }; + } } static sendMessage(subscriber: string, arg: any = {}) { diff --git a/libs/angular/src/services/theming/theming.service.ts b/libs/angular/src/services/theming/theming.service.ts index 270cd92c4fe..fbae277cabb 100644 --- a/libs/angular/src/services/theming/theming.service.ts +++ b/libs/angular/src/services/theming/theming.service.ts @@ -63,7 +63,7 @@ export class ThemingService implements AbstractThemingService { protected monitorSystemThemeChanges(): void { fromEvent( - this.window.matchMedia("(prefers-color-scheme: dark)"), + window.matchMedia("(prefers-color-scheme: dark)"), "change" ).subscribe((event) => { this.updateSystemTheme(event.matches ? ThemeType.Dark : ThemeType.Light); From cd6868feee36ec0f92d2a562ec7b6a7aaafa8a3a Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Tue, 16 May 2023 10:35:57 -0500 Subject: [PATCH 014/299] Hide +New Project on secret edit (#5370) --- .../secrets/dialog/secret-dialog.component.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts index 0e374719708..64b75511ff4 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts @@ -68,6 +68,9 @@ export class SecretDialogComponent implements OnInit { throw new Error(`The secret dialog was not called with the appropriate operation values.`); } else if (this.data.operation == OperationType.Add) { await this.loadProjects(true); + if (this.data.projectId == null || this.data.projectId == "") { + this.addNewProjectOptionToProjectsDropDown(); + } } if (this.data.projectId) { @@ -78,10 +81,6 @@ export class SecretDialogComponent implements OnInit { this.formGroup.get("project").removeValidators(Validators.required); this.formGroup.get("project").updateValueAndValidity(); } - - if (this.data.projectId == null || this.data.projectId == "") { - this.addNewProjectOptionToProjectsDropDown(); - } } async loadData() { From 0d9345db8f1598b440b224660c5ba75eee257b86 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 16 May 2023 20:23:16 +0200 Subject: [PATCH 015/299] [PM-2194] Tweak the CL search inputs reset button (#5409) --- .../src/search/close-button-white.svg | 3 +++ .../src/search/search.component.css | 19 +++++++++++++++++++ libs/components/src/tw-theme.css | 2 ++ 3 files changed, 24 insertions(+) create mode 100644 libs/components/src/search/close-button-white.svg create mode 100644 libs/components/src/search/search.component.css diff --git a/libs/components/src/search/close-button-white.svg b/libs/components/src/search/close-button-white.svg new file mode 100644 index 00000000000..8eff9f53f39 --- /dev/null +++ b/libs/components/src/search/close-button-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/libs/components/src/search/search.component.css b/libs/components/src/search/search.component.css new file mode 100644 index 00000000000..87c38348bce --- /dev/null +++ b/libs/components/src/search/search.component.css @@ -0,0 +1,19 @@ +/** + * Tailwind doesn't have a good way to style search-cancel-button. + */ +bit-search input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; + appearance: none; + height: 21px; + width: 21px; + margin: 0; + cursor: pointer; + background-repeat: no-repeat; + mask-image: url("./close-button-white.svg"); + -webkit-mask-image: url("./close-button-white.svg"); + background-color: rgba(var(--color-text-muted)); +} + +bit-search input[type="search"]::-webkit-search-cancel-button:hover { + background-color: rgba(var(--color-text-main)); +} diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css index f5d9febcebf..ba4efe60e79 100644 --- a/libs/components/src/tw-theme.css +++ b/libs/components/src/tw-theme.css @@ -79,3 +79,5 @@ --tw-ring-offset-color: #1f242e; } + +@import "./search/search.component.css"; From aa2da5713962fa9e19b9f7730cd9a532796ae8d1 Mon Sep 17 00:00:00 2001 From: Cesar Gonzalez Date: Tue, 16 May 2023 18:00:09 -0500 Subject: [PATCH 016/299] [PM-595] Autofill doesn't work for logins without passwords (#5325) --- apps/browser/src/autofill/services/autofill.service.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index 8a4046f59cd..090acf35dc3 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -373,12 +373,6 @@ export default class AutofillService implements AutofillServiceInterface { fillScript.untrustedIframe = this.inUntrustedIframe(pageDetails.url, options); - if (!login.password || login.password === "") { - // No password for this login. Maybe they just wanted to auto-fill some custom fields? - fillScript = AutofillService.setFillScriptForFocus(filledFields, fillScript); - return fillScript; - } - let passwordFields = AutofillService.loadPasswordFields( pageDetails, false, From 3da7fc7cb39f575a96c52a6a17a4eba8cf651093 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Wed, 17 May 2023 12:27:27 +0200 Subject: [PATCH 017/299] Deprecated broadcaster (#5461) --- apps/desktop/src/app/app.component.ts | 6 ++++++ apps/web/src/app/app.component.ts | 6 ++++++ libs/common/src/abstractions/broadcaster.service.ts | 12 ++++++++++++ 3 files changed, 24 insertions(+) diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index c87a2eacfc5..835b568c8cb 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -156,6 +156,12 @@ export class AppComponent implements OnInit, OnDestroy { window.onkeypress = () => this.recordActivity(); }); + /// ############ DEPRECATED ############ + /// Please do not use the AppComponent to send events between services. + /// + /// Services that depends on other services, should do so through Dependency Injection + /// and subscribe to events through that service observable. + /// this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => { this.ngZone.run(async () => { switch (message.command) { diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index e3e93840e15..feea3c5de8e 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -98,6 +98,12 @@ export class AppComponent implements OnDestroy, OnInit { window.onkeypress = () => this.recordActivity(); }); + /// ############ DEPRECATED ############ + /// Please do not use the AppComponent to send events between services. + /// + /// Services that depends on other services, should do so through Dependency Injection + /// and subscribe to events through that service observable. + /// this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => { this.ngZone.run(async () => { switch (message.command) { diff --git a/libs/common/src/abstractions/broadcaster.service.ts b/libs/common/src/abstractions/broadcaster.service.ts index 9d080d03632..5df3c033433 100644 --- a/libs/common/src/abstractions/broadcaster.service.ts +++ b/libs/common/src/abstractions/broadcaster.service.ts @@ -2,8 +2,20 @@ export interface MessageBase { command: string; } +/** + * @deprecated Use the observable from the appropriate service instead. + */ export abstract class BroadcasterService { + /** + * @deprecated Use the observable from the appropriate service instead. + */ send: (message: MessageBase, id?: string) => void; + /** + * @deprecated Use the observable from the appropriate service instead. + */ subscribe: (id: string, messageCallback: (message: MessageBase) => void) => void; + /** + * @deprecated Use the observable from the appropriate service instead. + */ unsubscribe: (id: string) => void; } From 3f7a63b2c6789b263b29421776aa77be07b9e384 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Thu, 18 May 2023 10:32:18 -0700 Subject: [PATCH 018/299] [PM-2102] Implement logic to keep row control enable/disable status in sync with the access item properties whenever the parent control is enabled/disabled (#5433) Angular 15 introduced a breaking change that calls setDisabledState() whenever a CVA is added. This was re-enabling all the internal form group rows (even those that should have remained disabled). --- .../access-selector.component.ts | 73 +++++++++++++------ libs/angular/src/utils/form-selection-list.ts | 14 ++++ 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts index 7767953b309..d268a6ca5e6 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts @@ -1,7 +1,14 @@ import { Component, forwardRef, Input, OnDestroy, OnInit } from "@angular/core"; -import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from "@angular/forms"; +import { + ControlValueAccessor, + FormBuilder, + FormControl, + FormGroup, + NG_VALUE_ACCESSOR, +} from "@angular/forms"; import { Subject, takeUntil } from "rxjs"; +import { ControlsOf } from "@bitwarden/angular/types/controls-of"; import { FormSelectionList } from "@bitwarden/angular/utils/form-selection-list"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { SelectItemView } from "@bitwarden/components/src/multi-select/models/select-item-view"; @@ -47,6 +54,40 @@ export class AccessSelectorComponent implements ControlValueAccessor, OnInit, On private notifyOnTouch: () => void; private pauseChangeNotification: boolean; + /** + * Updates the enabled/disabled state of provided row form group based on the item's readonly state. + * If a row is enabled, it also updates the enabled/disabled state of the permission control + * based on the item's accessAllItems state and the current value of `permissionMode`. + * @param controlRow - The form group for the row to update + * @param item - The access item that is represented by the row + */ + private updateRowControlDisableState = ( + controlRow: FormGroup>, + item: AccessItemView + ) => { + // Disable entire row form group if readonly + if (item.readonly) { + controlRow.disable(); + } else { + controlRow.enable(); + + // The enable() above also enables the permission control, so we need to disable it again + // Disable permission control if accessAllItems is enabled or not in Edit mode + if (item.accessAllItems || this.permissionMode != PermissionMode.Edit) { + controlRow.controls.permission.disable(); + } + } + }; + + /** + * Updates the enabled/disabled state of ALL row form groups based on each item's readonly state. + */ + private updateAllRowControlDisableStates = () => { + this.selectionList.forEachControlItem((controlRow, item) => { + this.updateRowControlDisableState(controlRow as FormGroup>, item); + }); + }; + /** * The internal selection list that tracks the value of this form control / component. * It's responsible for keeping items sorted and synced with the rendered form controls @@ -55,21 +96,13 @@ export class AccessSelectorComponent implements ControlValueAccessor, OnInit, On protected selectionList = new FormSelectionList((item) => { const permissionControl = this.formBuilder.control(this.initialPermission); - const fg = this.formBuilder.group({ - id: item.id, - type: item.type, + const fg = this.formBuilder.group>({ + id: new FormControl(item.id), + type: new FormControl(item.type), permission: permissionControl, }); - // Disable entire row form group if readonly - if (item.readonly) { - fg.disable(); - } - - // Disable permission control if accessAllItems is enabled - if (item.accessAllItems || this.permissionMode != PermissionMode.Edit) { - permissionControl.disable(); - } + this.updateRowControlDisableState(fg, item); return fg; }, this._itemComparator.bind(this)); @@ -124,14 +157,8 @@ export class AccessSelectorComponent implements ControlValueAccessor, OnInit, On set permissionMode(value: PermissionMode) { this._permissionMode = value; - // Toggle any internal permission controls - for (const control of this.selectionList.formArray.controls) { - if (value == PermissionMode.Edit) { - control.get("permission").enable(); - } else { - control.get("permission").disable(); - } - } + // Update any internal permission controls + this.updateAllRowControlDisableStates(); } private _permissionMode: PermissionMode = PermissionMode.Hidden; @@ -189,6 +216,10 @@ export class AccessSelectorComponent implements ControlValueAccessor, OnInit, On this.formGroup.disable(); } else { this.formGroup.enable(); + + // The enable() above automatically enables all the row controls, + // so we need to disable the readonly ones again + this.updateAllRowControlDisableStates(); } } diff --git a/libs/angular/src/utils/form-selection-list.ts b/libs/angular/src/utils/form-selection-list.ts index 026ef367a4c..aa454e81e44 100644 --- a/libs/angular/src/utils/form-selection-list.ts +++ b/libs/angular/src/utils/form-selection-list.ts @@ -198,4 +198,18 @@ export class FormSelectionList< this.selectItem(selectedItem.id, selectedItem); } } + + /** + * Helper method to iterate over each "selected" form control and its corresponding item + * @param fn - The function to call for each form control and its corresponding item + */ + forEachControlItem( + fn: (control: AbstractControl, TControlValue>, value: TItem) => void + ) { + for (let i = 0; i < this.formArray.length; i++) { + // The selectedItems array and formArray are explicitly kept in sync, + // so we can safely assume the index of the form control and item are the same + fn(this.formArray.at(i), this.selectedItems[i]); + } + } } From 3577b7c1009f8373b55acbb00f28e9f91a9ddb02 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Thu, 18 May 2023 13:35:13 -0400 Subject: [PATCH 019/299] [PM-1072] Convert autofill.js to Typescript (#5376) * Rename autofill.js to ts and update webpack * Remove wrapping function * Remove unreachable data-onepassword-title code * Remove unused post-submit logic * Run prettier * Remove unused fake tested code * Add typing * Disable certain eslint rules or fix eslint violations * Update modifications list * Remove unnecessary/confusing types * Checkout autofill.js from master * Add ENV switch for autofill versions * Rename autofill.ts to avoid confusion * Use string union type for FillScriptOp --- apps/browser/package.json | 1 + .../src/autofill/content/autofillv2.ts | 1391 +++++++++++++++++ .../src/autofill/models/autofill-script.ts | 27 +- apps/browser/webpack.config.js | 11 +- 4 files changed, 1423 insertions(+), 7 deletions(-) create mode 100644 apps/browser/src/autofill/content/autofillv2.ts diff --git a/apps/browser/package.json b/apps/browser/package.json index 0057704287d..b29ab9c27b3 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -6,6 +6,7 @@ "build:mv3": "cross-env MANIFEST_VERSION=3 webpack", "build:watch": "webpack --watch", "build:watch:mv3": "cross-env MANIFEST_VERSION=3 webpack --watch", + "build:watch:autofill": "cross-env AUTOFILL_VERSION=2 webpack --watch", "build:prod": "cross-env NODE_ENV=production webpack", "build:prod:watch": "cross-env NODE_ENV=production webpack --watch", "dist": "npm run build:prod && gulp dist", diff --git a/apps/browser/src/autofill/content/autofillv2.ts b/apps/browser/src/autofill/content/autofillv2.ts new file mode 100644 index 00000000000..8bf16ff879c --- /dev/null +++ b/apps/browser/src/autofill/content/autofillv2.ts @@ -0,0 +1,1391 @@ +/* eslint-disable no-var, no-console, no-prototype-builtins */ +// These eslint rules are disabled because the original JS was not written with them in mind and we don't want to fix +// them all now + +/* + 1Password Extension + + Lovingly handcrafted by Dave Teare, Michael Fey, Rad Azzouz, and Roustem Karimov. + Copyright (c) 2014 AgileBits. All rights reserved. + + ================================================================================ + + Copyright (c) 2014 AgileBits Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ + +/* + MODIFICATIONS FROM ORIGINAL + + 1. Populate isFirefox + 2. Remove isChrome and isSafari since they are not used. + 3. Unminify and format to meet Mozilla review requirements. + 4. Remove unnecessary input types from getFormElements query selector and limit number of elements returned. + 5. Remove fakeTested prop. + 6. Rename com.agilebits.* stuff to com.bitwarden.* + 7. Remove "some useful globals" on window + 8. Add ability to autofill span[data-bwautofill] elements + 9. Add new handler, for new command that responds with page details in response callback + 10. Handle sandbox iframe and sandbox rule in CSP + 11. Work on array of saved urls instead of just one to determine if we should autofill non-https sites + 12. Remove setting of attribute com.browser.browser.userEdited on user-inputs + 13. Handle null value URLs in urlNotSecure + 14. Convert to Typescript, add typings and remove dead code (not marked with START/END MODIFICATION) + */ +import AutofillForm from "../models/autofill-form"; +import AutofillPageDetails from "../models/autofill-page-details"; +import AutofillScript, { + AutofillScriptOptions, + FillScript, + FillScriptOp, +} from "../models/autofill-script"; + +/** + * The Document with additional custom properties added by this script + */ +type AutofillDocument = Document & { + elementsByOPID: Record; + elementForOPID: (opId: string) => Element; +}; + +/** + * A HTMLElement (usually a form element) with additional custom properties added by this script + */ +type ElementWithOpId = T & { + opid: string; +}; + +/** + * This script's definition of a Form Element (only a subset of HTML form elements) + * This is defined by getFormElements + */ +type FormElement = HTMLInputElement | HTMLSelectElement | HTMLSpanElement; + +/** + * A Form Element that we can set a value on (fill) + */ +type FillableControl = HTMLInputElement | HTMLSelectElement; + +function collect(document: Document) { + // START MODIFICATION + var isFirefox = + navigator.userAgent.indexOf("Firefox") !== -1 || navigator.userAgent.indexOf("Gecko/") !== -1; + // END MODIFICATION + + (document as AutofillDocument).elementsByOPID = {}; + + function getPageDetails(theDoc: Document, oneShotId: string) { + // start helpers + + /** + * For a given element `el`, returns the value of the attribute `attrName`. + * @param {HTMLElement} el + * @param {string} attrName + * @returns {string} The value of the attribute + */ + function getElementAttrValue(el: any, attrName: string) { + var attrVal = el[attrName]; + if ("string" == typeof attrVal) { + return attrVal; + } + attrVal = el.getAttribute(attrName); + return "string" == typeof attrVal ? attrVal : null; + } + + /** + * Returns the value of the given element. + * @param {HTMLElement} el + * @returns {any} Value of the element + */ + function getElementValue(el: any) { + switch (toLowerString(el.type)) { + case "checkbox": + return el.checked ? "✓" : ""; + + case "hidden": + el = el.value; + if (!el || "number" != typeof el.length) { + return ""; + } + 254 < el.length && (el = el.substr(0, 254) + "...SNIPPED"); + return el; + + default: + // START MODIFICATION + if (!el.type && el.tagName.toLowerCase() === "span") { + return el.innerText; + } + // END MODIFICATION + return el.value; + } + } + + /** + * If `el` is a ` - +
- diff --git a/apps/browser/src/auth/popup/home.component.ts b/apps/browser/src/auth/popup/home.component.ts index 9f864fa2ad5..361218c6e4b 100644 --- a/apps/browser/src/auth/popup/home.component.ts +++ b/apps/browser/src/auth/popup/home.component.ts @@ -1,7 +1,9 @@ -import { Component, OnInit } from "@angular/core"; +import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { FormBuilder, Validators } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; +import { Router } from "@angular/router"; +import { Subject, takeUntil } from "rxjs"; +import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -12,9 +14,12 @@ import { LoginService } from "@bitwarden/common/auth/abstractions/login.service" selector: "app-home", templateUrl: "home.component.html", }) -export class HomeComponent implements OnInit { - loginInitiated = false; +export class HomeComponent implements OnInit, OnDestroy { + @ViewChild(EnvironmentSelectorComponent, { static: true }) + environmentSelector!: EnvironmentSelectorComponent; + private destroyed$: Subject = new Subject(); + loginInitiated = false; formGroup = this.formBuilder.group({ email: ["", [Validators.required, Validators.email]], rememberEmail: [false], @@ -27,9 +32,9 @@ export class HomeComponent implements OnInit { private router: Router, private i18nService: I18nService, private environmentService: EnvironmentService, - private route: ActivatedRoute, private loginService: LoginService ) {} + async ngOnInit(): Promise { let savedEmail = this.loginService.getEmail(); const rememberEmail = this.loginService.getRememberEmail(); @@ -48,6 +53,18 @@ export class HomeComponent implements OnInit { }); } } + + this.environmentSelector.onOpenSelfHostedSettings + .pipe(takeUntil(this.destroyed$)) + .subscribe(() => { + this.setFormValues(); + this.router.navigate(["environment"]); + }); + } + + ngOnDestroy(): void { + this.destroyed$.next(); + this.destroyed$.complete(); } submit() { diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index a0cd5e8887b..3b8501be447 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -10,6 +10,7 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { BrowserModule } from "@angular/platform-browser"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component"; import { BitwardenToastModule } from "@bitwarden/angular/components/toastr.component"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { ColorPasswordCountPipe } from "@bitwarden/angular/pipes/color-password-count.pipe"; @@ -153,6 +154,7 @@ import "./locales"; AboutComponent, HelpAndFeedbackComponent, AutofillComponent, + EnvironmentSelectorComponent, ], providers: [CurrencyPipe, DatePipe], bootstrap: [AppComponent], diff --git a/apps/browser/src/popup/images/eu-flag.png b/apps/browser/src/popup/images/eu-flag.png new file mode 100644 index 0000000000000000000000000000000000000000..592bc95e0ce80551d890e7867335df7c8206ccdb GIT binary patch literal 4549 zcmZ`+2Q*w;)E+@}MsLCB-OLz78H4DeMf4JN^wGsAF;31hbN6@m{=U8UIp?ms){WEGRi_|jAq4;c6q*_;1{ap$Vp0)b zy|~Yz6r2G7a(NeJWqnO$Wsts)r=yEI5&+PM%P=7_z1_=@XOWhwc!NYmQENp9xT>l} zEE*AJ*si8=C5px#6#H>lm2gsw%SPEmmClL`MWEpWoRReFOoZdG$nk3Bv?Nvj_U=`yg}$ zqTzTqnhc{y>97XTx9N_;run3@D7;|+Ay>-^9twcD@EB|l?UEWfK~z;33#P*>7>xRO zT`pLbW8NY5)zc& z=$$8}ca0()O~G9Et^sfRu-3`^Mo#;VoyF+=9AaL?<7{@;@*b**{)P7oG4}1|gj~kc zpcIgk-O-%sQA8W)-N!1AZ~-y3-aVxpR^Y3Zgxhb;ZfONi8>Z58jb`82NK0od+(_vD z)*M0k4!>y`#>75AjEv$el{748$`4I$!gwtt}KBg28t1PZ>VQdjJkHBNpP-FoD zf{Pt1)gziz3G$%@fL|mJ0E^^5$WrS`71_ryY$HN>2Oy&_S^V1%Nb+vvP;@9Vgk-)C zj*D)37s;>B{VOIwjE+6=I$8Y7)7f>R+F41FQW6u_qDb~9YmtxMg6u%hhfLZv?LWM& zr&+0D^e_UtSfVW%>E!K$sOM2q9rhhMH{`xW;wP3Cn5$?C0#;~?iSu4A!-{mP>q;|l(`SCqZ!Xj%O zm>@E#u&hq)_FlhbN?Ek?v>MZc;Fz%O6s;=$$hiT(%Yut#>s-U5m5YYW4OPg2#7s4$V%#*cchb+dG{cZ1{WER|Z^Q?72T&YRKLng@xc6P^=a;ZuL> z%k<9A$Is`A;sNHCyR|3N?)lXY?7me!afLU>a9dkj)pld09^jf(cwg%&Zg7odnr{wq z&sI`TsQ31Y*Hk1RfW#j=vL8kb!JqJg>$Xv#@i9Pxu5b+?8BMz((>>XoZ!{3vempWI zY5}|#Z9)2!bzz$}*FO?bMg)10=Un~Ph8!aGh&b^&@C#=wplZU;rzYU!G>l4K;p~bf zw2P7EWRC^YL`88AYjC9{7IAW^#P=&PaPs!B6kVH&Hso&QQhzYoqgq7Kkl+WB?{QnC zjeqJ|D&-n${;cp8)x-PIPpekwBq(yj8441H>7AL)?{BHD4~?!M_xV00w7qq9@2j}$Rl;6I>z6T!p zG+mobn*2I&TvuD z<)j@KG*UVnn}dzR=A+|3s%`Kbq-*fVr?K_M&}q)6`Dm&ZB^5Onr5CvsiH#7^8`0a- z^Jmy(@X$Zdda70So;`zBXwopREQHT3RkY{MqK0@rJfSJADRNq)MQe)-Q{rs!QULML zRO>2|vpCV;GFc^~(niHv?H^%lgyWRsDX!+Ob*}EUy{-ne^scxu z-Le^@VC7;1(Xz8K9#=7c!rH8$=;PSqaJA<$L(&om6yjBcu{usIxJ=i$Uf-!q&j_p! zHc}`GHEK4Ad}&+OJ~8LoKUz8@UG8mBXq{dmqXsj8S@&6x9u-h2fTZJDrp zwQ25DBfH8plQ>wix00|Tx8k&F^+^RKj7q*6eK+m^vB|KBU=w9y%thyh6EW8_<*P9z+av)KO{JdQeOpVt?XSLeyiV$u;D5OOW$d)5dyH(PZ_MJA z$?HRXj>-D*`~rpBnCdgL(=QJ`aW|{)sxhR%rFZl2Ty5NdD9C3UTswVas4{maP`T=> zS|=>JS&f_+cj9ch5CTH_LCR`ib6?S(aQr6zO4LXIN!m6&bW>s;_yYU1@1& z<~fBbc6(PPR9RjXWTR7iP@QLMg}m1p?Yv-{?o!=bGR{!zU#nC9s#D|uymd^06z%Bh1{q65QH9uF1hF_@XbDRzgk3;*sV-`-K z=Js7lg4af+muu5s(S9iFSdE5_%X|!M@r~RQW|U(L?{mzQtMHrLskmvGZQ0t`fYY3I zoe7#Am`R@zp79KJ4ps>iImFIsekcE)vmMyKSD2Y?QZcFYy0vMu8P5{2ca(LO8NE^M`mFRFTGuXHNce zf_&yZAs`t!i3p`T$p~pYnGjVFojXeogC*@W<2;MF+@hfXr-X=~{|YLZGp4(2c|XaQ z<9dLl?_+aQZPUPy3tpeSG|>xazhBrLw{C^l%2=T4n0kbU?&7DOm|MoTV9!Fc6?1@+ zPwhHJSD?eb&pvby*_XWAhzn$71>(dHLUa6cBq{{&$cOrb`2RYIYKxL2*`!t1%aPmh zc^3K%QpFkfkS@OlR)#ScD*BP$$cNJv%L;LeAAk5ukn#DN-auARNY=5$R*iCR)MC`4 ze6Kb3!L*PEhLpcpyf~$M88z2Dcd|FR6HI`Jkc@CDLzKB0;6_76CQ5!3ofK!59Fk6T z__-f8nd6WsLjmgdQ+eDAc3j zn|cztsNL(*GagO!Q`o?5Rc|C2KHC)EL_0oy3ov^jP%W2Q? z`T+DvwU=(U<-{~qLC-)OkK~5Gub&W!OQCZ^h1fpE0Ibmj|qEi%k9W&vZ69*;<(y7~dKn4<97gF6}g0{jg5OwwjvZ_Xbc8E&uEjOOZ$W^Ls^K`*QAMJ+$7 zwsivMkRbw=;p@M8$qu_-O`m4UrC1<5)>f3K-?}b|b zQrhm^N@3^tfYCbI-`ML17lD!1s1~VEvXcWFP_T_+e}>nRIvzP`Ru*a7x)ng57O$Z5 zgc+GOf5s1vogWlZpHr}X$9C(^G@$f;#s<>|1YsMVz#}ryb-F2P!~{pd;GnWN+9Z8e z7{1=OR&D!nmGF6e*%p()pXR+0SH}S zVgMl?4FLZF;ayw+JQe`qZwvrv;j#XW4e$j1aIOFVF)jdtKOFN5dpR^N=7su?y;5-H zZw5mF{@;7pJiPv z5PTT{L&YHA|B@lmF8`10GV+(~_qzTn2fs`vtLNi_ylD8cEd&()yTJeP{nH-&GK;Lf z3mWNes^Wq|diY*y#32wk_&+26sWkgX35CJ_t^8Nyj}i{P+^2u-+h2$B+k0^;2vRus z?-NFlGJ*A9T)Yoinkq_$($xNjI&QSL=;YHi`Ji#VkBdfC%v)258}&uh$_sE<6U(v} z&o(hYOr(W{0P)sX^SmxEfr1hvp}i4Jg662iL`l-7!b6p0nU?VcP{W0i;ryx%hG`6o#A3qY2M76Bk?nHpu4EVKImNz%i$X~zWMH#A-$)tU_U|!y~Homj%@nwB{L6UWvmD-N=QGKG*G(Bk?!+=r)AQ@ zbR3p#ZihPpl2gB*r+n~!sDk@U%11%AG;3JH9`=C7+5D`KMTuxY>MIFrIuXJ90njsB zBC7yTK{2r2qX&`P)He`B-U}V#?6a0dR$;oWnEstbWHMwKlIi9k>Vm$Ozrcj5ZYZ9c zcc#inj;Hs@xJfn^tnv-vJtV>Cqi<~lz45%4pFk@KXh%(yEysqV=h3>y^8B0OF|e!I z4!@pXuJm=O2Enz(6_*{2q2#U9BwD`(Ix`x|9; zV})+hMCtw|mI^jK9hlfs?frt=V8(K0_zRcExE7wTa(Z1}Wm#%zmB@KW!0V5rP}(I`pV`pV z(MTz=l;PI!`6UD5BULuI5RlvXdk4?cb7rA_>EJ0nmXIk{){1KMG@i9~OxhRar%M$_ ZL?0{(q>lp{lP?@ppeT!2RtK#pA#Ml+ z2kNvat6mGGumVSn4=Uk~39_0i=qXW|5P=<()&+wbAQ9Z$YnCmg^=d$qgXdfQhw0K6 zG9F8JYzNX)q;Ud&@s#RgpP&E<0w13%hF^zradHZ&X##N*03>z*-sEI98zrSDIQn>N zP03z00M^%Ur+RD8C(g~HIn5HGPQdc%&O01SsFe-CaT_i$Q&A9XL3DoY>; zC||D=HcVBk9rl3gC~%rnES1Df1i*_jE@dYH81j7)*~Qo=gpA^s=SD!NfLQ~fmr0+^Cw^2kH zeqg_CC}#7rMmlA<&03#i-t;~~k-gmz6ad=!egMjShPJoEwlay%eJ`^Z0N_}vz{R1& zmN*e1N(SWL5RVbX(3dzuSQfiRXfh>HxnTQUTuC`0L|RGW${@nb&ZIcBUwake%HiH5 zY!;uF;>OQ$v4#e!^u!Mm4p~ux3uGNLxMJc1U*eT3XxQ9)Ib`D~Cnat9S(!EVMTZNi zTcs=&Mb=!`jy6ZjAmU_x9ow>PX*B!1Xm_(bq9^Lh$m7r*@ z>p{o+`{hv*+rh+}wcJXuBVG{cI2Z&CqCyb9Boz)U%dcsqZR9Zw2GXj^GJpWS`8H)L z!SzblGljAMrvy&{i^Tgx2{nYWOkV;Rhj=p%zz@Hsa&0{&$dJd9w93->C4cmd46E-5 z;nHF|4fhhHVu}$bih6T4yM|viE6V?hKo6A{!j!Ta@}eDV2^M-rcdxQ#-_30LCRw;< z0Jlah{-&fv+}1&8VW?QERjazZ^ta917TMPN&lcpQ7s+&&Sig4}&%H<(rY38C43@U; zq_2gSb(v%_(`@3))X57N(bw?v^;t{@+-xB;Q?OTg#GboIZXNJ$|7XT+qtrD}H2>J0 zB^7dqk6Mir3Ic6s6#?CF=243_f%5!umUY-8hPnvGwpAddbfl=cUfF^$>~>v7x9wO~ zjh#0vB|+tgEFi>8_eIaGE`~0qE=W|hv0S5LJl^`sya9!Up^sn^?!}F3oGR@ebRB4S zwEH#LgMj;vW-fF)7kI6;dnPqEO5Kd2od^MV5qQ=P?FEuUaYkKX8qFjaoB+`E&LC9~5k-p*-D4^24+o%N*vFL^i}#}$`I*o;_{8-99YmW&R*#cOew~FyCp2!Er85H8GF*a% zDFQ+f8p<}P%98!qLr;cWWX{hpmZK<>_#@QXa|sXf#-++hLJ1DjW4m z3>9IRlY5`+*^{vB@@1;qBkcJzi%HkH;s4=*G4I49#8Wlw|xi!6!zu2*!y zpkg$U92P|{ucw7mTjlFh>qd*VZuv1fborFWOOO{X+?!?^nA3uh{`e;H)BDK1{?=^l z*th;8&w8A#wkGmd*KvXwTcVp;?y={Q+fYQ^$PY~qWecrv74RhgN*<|*HyE`{I%df# z6e5vUi>-~U&BR2FE3dO3B&o8?Br^7dQ>o1-x~nPW#pX5SCFMEf2@c^?Kcu#z=6Y`a zoSph9A{$Zkk?A=l@0diQ8e?= zS0P_ppy>PyJ4({rCEAmu{I&l0!cPVkaoU6ndz-y#j&8ZFx*&4&;z$iq8% z{tp}ULf%*uwT#Z8`i5V9mMC^J$~8+Wl~fkd7BTX8zr@rZojPO4E^xO5EYLV=S+Zeh zTPd|dHxn~Zu)7?+EWK>IVlt`d#OD0epjI1I{SGNSlsH_e&>CUy#}$joZQ12I`61}&F zTFhfLBbixu9t2dJ8=QT8I?2|cvZG8B50lu*0HVwtKu*vp^ST!55Pt=>HjqO3H{~{w zum)vfwt!sXTu)`L7@wGx&c;sp1mou>0@0_bjw1F#$Brl@ zgRP<6huOVs`i{Of{t?G?gCv8@_vOc!UCAZUr9=L18YY?*nw$IsM)ft7@9vcuTN=1b zIORKZl=GGqm;0EjR~=MjSePImw}sg)SR~n3^c0NHRC!jZ*OZhspu#8LPY`T~O;p9Q z#_ZhUV0b9HTHTN;(+mI9*xA??^bNGBwXC)E)4lR|IdAZ_N+$DJ|KNyFuUq)SnUJAX zXDrXHVTq-xq!P+cMXf7gA|sOH-i;n1yL`0Lv_ZW#$P{z4;Go=hS`@|HN*2_wD8;r|FfB$-Ql=-)InNIK+6xS26I>)mb?f z#ut%|*`{gML59UAyk5K1WkxcOz5TdV-js4@HlXlA28_kzArFW|1r7kur?|*M*Y^e&VTY(biQD|k(id4s(5AclVnlH z+q1Q(h2)*Roiu77^$8ydZ}P*&+4fnqQ^m#7q(GPvqS|kgciP9+sJr?DZ*TF?M*D{M zROV*HtlK$lyjii=>K6aRv1hWK-pS_jO#jH{$cQiT!J9X74tb(7zFb>QGqkmDvqu{r zP5F18C*sTn?lte4B?UBiLf6fQS>hF{!Uah6n6jC9N)=XZM)pSv$7;mc#VQ#Yy()_a z>$baHNSijKY~0_>*A8qy=i=s~$)uAoaD8|2>_}&8rE)l3eK>V9GX=Axyc@doqQb%! zf+d1`Ey31Kdx+q)aVC2oFnftz`M-Ldlh;aXO(l2g*0xj(rwvz2KbSe$?K?U--kf?g zpE_GLJcjc&v##a6+p$f1f3=ZY&E|B5U)>q$g~s8`o4U7~-)Bzz0$OldL*~O7$nG-J z!-{{kEybU0IB#@GUz09{#d-TRC5;`=s|_SUOrkTjGhe_({B>tGzC3=zRa>}!ocF^7 z(hh+i(wr3?+kU^hmK=VubFqe)ZEq~qOVq=8o7^<$Td`KsJ5_N0>Re^(-Rxt3vs1aP zw#|4Z=1&2LqrLUrK1dz}Y39@@=1+8TU=H>*m+gD*`dtM`OqiNV*t})}(4qupwVlu- z6X(ylAQAHeyee~dEIJtPn@$5>J$b%P_X&>M4CH=61Qw^7Acv1KXAKM}2xIh;X8Dj$ zZfpUKaFENJlRQMtWjVDT=b*!%4Bh%B%|Cycu{8Q>39brbF8?PmNPRUMb#(ymCB6Z` z1yTTTE)nqZ0st8RxW6#~fB@e78*2l(|8TAW0O9t4>wh?gm-cF?Ud~JPAA2q9+TRSC zES$eF*%h^)jg9Wo5V)!ucmM!Ilvfi7NX1?{ui@J3=%e-3?@3v?I0;%m zDgX>4bqSr2XbUjL$;*JE12|@*-tZ+gw z7z}f_wvp0SRQ@Bse3D_cL!(`#AP_GvFF`L6K^J#hh>)bDBm^o95f&D>WC(b8JEJWy z0?r<6evUD|dTWw7rWn_$sf3rHdz8hL!cI(BI>)KGF6z|5S4J__M6b1wyVO z5FtS*vQQgd|D}A-5v8&2PF#P>n(c1S3jR6|o z%xYUz%HF z2jzg~#!N$-#VgQJ$InTtNe^CM)IZ|ubcHH|@GNOLw)EqSn!N{3_qOSirG2w%d%F4w zj*akQJB#ejgxY - +
-
+
Bitwarden

{{ "loginOrCreateNewAccount" | i18n }}

@@ -37,9 +25,7 @@ />
- +
+ + © {{ year }} Bitwarden Inc.
{{ "versionNumber" | i18n : version }}
diff --git a/apps/web/src/app/layouts/frontend-layout.component.ts b/apps/web/src/app/layouts/frontend-layout.component.ts index 9b397afd29e..cdbaa94f0e5 100644 --- a/apps/web/src/app/layouts/frontend-layout.component.ts +++ b/apps/web/src/app/layouts/frontend-layout.component.ts @@ -1,6 +1,9 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { Utils } from "@bitwarden/common/misc/utils"; @Component({ selector: "app-frontend-layout", @@ -9,12 +12,22 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti export class FrontendLayoutComponent implements OnInit, OnDestroy { version: string; year = "2015"; + isEuServer = true; + euServerFlagEnabled: boolean; - constructor(private platformUtilsService: PlatformUtilsService) {} + constructor( + private platformUtilsService: PlatformUtilsService, + private configService: ConfigServiceAbstraction + ) {} async ngOnInit() { this.year = new Date().getFullYear().toString(); this.version = await this.platformUtilsService.getApplicationVersion(); + this.euServerFlagEnabled = await this.configService.getFeatureFlagBool( + FeatureFlag.DisplayEuEnvironmentFlag + ); + this.isEuServer = Utils.getDomain(window.location.href).includes(".eu"); + document.body.classList.add("layout_frontend"); } diff --git a/apps/web/src/images/eu_flag.png b/apps/web/src/images/eu_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..592bc95e0ce80551d890e7867335df7c8206ccdb GIT binary patch literal 4549 zcmZ`+2Q*w;)E+@}MsLCB-OLz78H4DeMf4JN^wGsAF;31hbN6@m{=U8UIp?ms){WEGRi_|jAq4;c6q*_;1{ap$Vp0)b zy|~Yz6r2G7a(NeJWqnO$Wsts)r=yEI5&+PM%P=7_z1_=@XOWhwc!NYmQENp9xT>l} zEE*AJ*si8=C5px#6#H>lm2gsw%SPEmmClL`MWEpWoRReFOoZdG$nk3Bv?Nvj_U=`yg}$ zqTzTqnhc{y>97XTx9N_;run3@D7;|+Ay>-^9twcD@EB|l?UEWfK~z;33#P*>7>xRO zT`pLbW8NY5)zc& z=$$8}ca0()O~G9Et^sfRu-3`^Mo#;VoyF+=9AaL?<7{@;@*b**{)P7oG4}1|gj~kc zpcIgk-O-%sQA8W)-N!1AZ~-y3-aVxpR^Y3Zgxhb;ZfONi8>Z58jb`82NK0od+(_vD z)*M0k4!>y`#>75AjEv$el{748$`4I$!gwtt}KBg28t1PZ>VQdjJkHBNpP-FoD zf{Pt1)gziz3G$%@fL|mJ0E^^5$WrS`71_ryY$HN>2Oy&_S^V1%Nb+vvP;@9Vgk-)C zj*D)37s;>B{VOIwjE+6=I$8Y7)7f>R+F41FQW6u_qDb~9YmtxMg6u%hhfLZv?LWM& zr&+0D^e_UtSfVW%>E!K$sOM2q9rhhMH{`xW;wP3Cn5$?C0#;~?iSu4A!-{mP>q;|l(`SCqZ!Xj%O zm>@E#u&hq)_FlhbN?Ek?v>MZc;Fz%O6s;=$$hiT(%Yut#>s-U5m5YYW4OPg2#7s4$V%#*cchb+dG{cZ1{WER|Z^Q?72T&YRKLng@xc6P^=a;ZuL> z%k<9A$Is`A;sNHCyR|3N?)lXY?7me!afLU>a9dkj)pld09^jf(cwg%&Zg7odnr{wq z&sI`TsQ31Y*Hk1RfW#j=vL8kb!JqJg>$Xv#@i9Pxu5b+?8BMz((>>XoZ!{3vempWI zY5}|#Z9)2!bzz$}*FO?bMg)10=Un~Ph8!aGh&b^&@C#=wplZU;rzYU!G>l4K;p~bf zw2P7EWRC^YL`88AYjC9{7IAW^#P=&PaPs!B6kVH&Hso&QQhzYoqgq7Kkl+WB?{QnC zjeqJ|D&-n${;cp8)x-PIPpekwBq(yj8441H>7AL)?{BHD4~?!M_xV00w7qq9@2j}$Rl;6I>z6T!p zG+mobn*2I&TvuD z<)j@KG*UVnn}dzR=A+|3s%`Kbq-*fVr?K_M&}q)6`Dm&ZB^5Onr5CvsiH#7^8`0a- z^Jmy(@X$Zdda70So;`zBXwopREQHT3RkY{MqK0@rJfSJADRNq)MQe)-Q{rs!QULML zRO>2|vpCV;GFc^~(niHv?H^%lgyWRsDX!+Ob*}EUy{-ne^scxu z-Le^@VC7;1(Xz8K9#=7c!rH8$=;PSqaJA<$L(&om6yjBcu{usIxJ=i$Uf-!q&j_p! zHc}`GHEK4Ad}&+OJ~8LoKUz8@UG8mBXq{dmqXsj8S@&6x9u-h2fTZJDrp zwQ25DBfH8plQ>wix00|Tx8k&F^+^RKj7q*6eK+m^vB|KBU=w9y%thyh6EW8_<*P9z+av)KO{JdQeOpVt?XSLeyiV$u;D5OOW$d)5dyH(PZ_MJA z$?HRXj>-D*`~rpBnCdgL(=QJ`aW|{)sxhR%rFZl2Ty5NdD9C3UTswVas4{maP`T=> zS|=>JS&f_+cj9ch5CTH_LCR`ib6?S(aQr6zO4LXIN!m6&bW>s;_yYU1@1& z<~fBbc6(PPR9RjXWTR7iP@QLMg}m1p?Yv-{?o!=bGR{!zU#nC9s#D|uymd^06z%Bh1{q65QH9uF1hF_@XbDRzgk3;*sV-`-K z=Js7lg4af+muu5s(S9iFSdE5_%X|!M@r~RQW|U(L?{mzQtMHrLskmvGZQ0t`fYY3I zoe7#Am`R@zp79KJ4ps>iImFIsekcE)vmMyKSD2Y?QZcFYy0vMu8P5{2ca(LO8NE^M`mFRFTGuXHNce zf_&yZAs`t!i3p`T$p~pYnGjVFojXeogC*@W<2;MF+@hfXr-X=~{|YLZGp4(2c|XaQ z<9dLl?_+aQZPUPy3tpeSG|>xazhBrLw{C^l%2=T4n0kbU?&7DOm|MoTV9!Fc6?1@+ zPwhHJSD?eb&pvby*_XWAhzn$71>(dHLUa6cBq{{&$cOrb`2RYIYKxL2*`!t1%aPmh zc^3K%QpFkfkS@OlR)#ScD*BP$$cNJv%L;LeAAk5ukn#DN-auARNY=5$R*iCR)MC`4 ze6Kb3!L*PEhLpcpyf~$M88z2Dcd|FR6HI`Jkc@CDLzKB0;6_76CQ5!3ofK!59Fk6T z__-f8nd6WsLjmgdQ+eDAc3j zn|cztsNL(*GagO!Q`o?5Rc|C2KHC)EL_0oy3ov^jP%W2Q? z`T+DvwU=(U<-{~qLC-)OkK~5Gub&W!OQCZ^h1fpE0Ibmj|qEi%k9W&vZ69*;<(y7~dKn4<97gF6}g0{jg5OwwjvZ_Xbc8E&uEjOOZ$W^Ls^K`*QAMJ+$7 zwsivMkRbw=;p@M8$qu_-O`m4UrC1<5)>f3K-?}b|b zQrhm^N@3^tfYCbI-`ML17lD!1s1~VEvXcWFP_T_+e}>nRIvzP`Ru*a7x)ng57O$Z5 zgc+GOf5s1vogWlZpHr}X$9C(^G@$f;#s<>|1YsMVz#}ryb-F2P!~{pd;GnWN+9Z8e z7{1=OR&D!nmGF6e*%p()pXR+0SH}S zVgMl?4FLZF;ayw+JQe`qZwvrv;j#XW4e$j1aIOFVF)jdtKOFN5dpR^N=7su?y;5-H zZw5mF{@;7pJiPv z5PTT{L&YHA|B@lmF8`10GV+(~_qzTn2fs`vtLNi_ylD8cEd&()yTJeP{nH-&GK;Lf z3mWNes^Wq|diY*y#32wk_&+26sWkgX35CJ_t^8Nyj}i{P+^2u-+h2$B+k0^;2vRus z?-NFlGJ*A9T)Yoinkq_$($xNjI&QSL=;YHi`Ji#VkBdfC%v)258}&uh$_sE<6U(v} z&o(hYOr(W{0P)sX^SmxEfr1hvp}i4Jg662iL`l-7!b6p0nU?VcP{W0i;ryx%hG`6o#A3qY2M76Bk?nHpu4EVKImNz%i$X~zWMH#A-$)tU_U|!y~Homj%@nwB{L6UWvmD-N=QGKG*G(Bk?!+=r)AQ@ zbR3p#ZihPpl2gB*r+n~!sDk@U%11%AG;3JH9`=C7+5D`KMTuxY>MIFrIuXJ90njsB zBC7yTK{2r2qX&`P)He`B-U}V#?6a0dR$;oWnEstbWHMwKlIi9k>Vm$Ozrcj5ZYZ9c zcc#inj;Hs@xJfn^tnv-vJtV>Cqi<~lz45%4pFk@KXh%(yEysqV=h3>y^8B0OF|e!I z4!@pXuJm=O2Enz(6_*{2q2#U9BwD`(Ix`x|9; zV})+hMCtw|mI^jK9hlfs?frt=V8(K0_zRcExE7wTa(Z1}Wm#%zmB@KW!0V5rP}(I`pV`pV z(MTz=l;PI!`6UD5BULuI5RlvXdk4?cb7rA_>EJ0nmXIk{){1KMG@i9~OxhRar%M$_ ZL?0{(q>lp{lP?@ppeT!2RtK#pA#Ml+ z2kNvat6mGGumVSn4=Uk~39_0i=qXW|5P=<()&+wbAQ9Z$YnCmg^=d$qgXdfQhw0K6 zG9F8JYzNX)q;Ud&@s#RgpP&E<0w13%hF^zradHZ&X##N*03>z*-sEI98zrSDIQn>N zP03z00M^%Ur+RD8C(g~HIn5HGPQdc%&O01SsFe-CaT_i$Q&A9XL3DoY>; zC||D=HcVBk9rl3gC~%rnES1Df1i*_jE@dYH81j7)*~Qo=gpA^s=SD!NfLQ~fmr0+^Cw^2kH zeqg_CC}#7rMmlA<&03#i-t;~~k-gmz6ad=!egMjShPJoEwlay%eJ`^Z0N_}vz{R1& zmN*e1N(SWL5RVbX(3dzuSQfiRXfh>HxnTQUTuC`0L|RGW${@nb&ZIcBUwake%HiH5 zY!;uF;>OQ$v4#e!^u!Mm4p~ux3uGNLxMJc1U*eT3XxQ9)Ib`D~Cnat9S(!EVMTZNi zTcs=&Mb=!`jy6ZjAmU_x9ow>PX*B!1Xm_(bq9^Lh$m7r*@ z>p{o+`{hv*+rh+}wcJXuBVG{cI2Z&CqCyb9Boz)U%dcsqZR9Zw2GXj^GJpWS`8H)L z!SzblGljAMrvy&{i^Tgx2{nYWOkV;Rhj=p%zz@Hsa&0{&$dJd9w93->C4cmd46E-5 z;nHF|4fhhHVu}$bih6T4yM|viE6V?hKo6A{!j!Ta@}eDV2^M-rcdxQ#-_30LCRw;< z0Jlah{-&fv+}1&8VW?QERjazZ^ta917TMPN&lcpQ7s+&&Sig4}&%H<(rY38C43@U; zq_2gSb(v%_(`@3))X57N(bw?v^;t{@+-xB;Q?OTg#GboIZXNJ$|7XT+qtrD}H2>J0 zB^7dqk6Mir3Ic6s6#?CF=243_f%5!umUY-8hPnvGwpAddbfl=cUfF^$>~>v7x9wO~ zjh#0vB|+tgEFi>8_eIaGE`~0qE=W|hv0S5LJl^`sya9!Up^sn^?!}F3oGR@ebRB4S zwEH#LgMj;vW-fF)7kI6;dnPqEO5Kd2od^MV5qQ=P?FEuUaYkKX8qFjaoB+`E&LC9~5k-p*-D4^24+o%N*vFL^i}#}$`I*o;_{8-99YmW&R*#cOew~FyCp2!Er85H8GF*a% zDFQ+f8p<}P%98!qLr;cWWX{hpmZK<>_#@QXa|sXf#-++hLJ1DjW4m z3>9IRlY5`+*^{vB@@1;qBkcJzi%HkH;s4=*G4I49#8Wlw|xi!6!zu2*!y zpkg$U92P|{ucw7mTjlFh>qd*VZuv1fborFWOOO{X+?!?^nA3uh{`e;H)BDK1{?=^l z*th;8&w8A#wkGmd*KvXwTcVp;?y={Q+fYQ^$PY~qWecrv74RhgN*<|*HyE`{I%df# z6e5vUi>-~U&BR2FE3dO3B&o8?Br^7dQ>o1-x~nPW#pX5SCFMEf2@c^?Kcu#z=6Y`a zoSph9A{$Zkk?A=l@0diQ8e?= zS0P_ppy>PyJ4({rCEAmu{I&l0!cPVkaoU6ndz-y#j&8ZFx*&4&;z$iq8% z{tp}ULf%*uwT#Z8`i5V9mMC^J$~8+Wl~fkd7BTX8zr@rZojPO4E^xO5EYLV=S+Zeh zTPd|dHxn~Zu)7?+EWK>IVlt`d#OD0epjI1I{SGNSlsH_e&>CUy#}$joZQ12I`61}&F zTFhfLBbixu9t2dJ8=QT8I?2|cvZG8B50lu*0HVwtKu*vp^ST!55Pt=>HjqO3H{~{w zum)vfwt!sXTu)`L7@wGx&c;sp1mou>0@0_bjw1F#$Brl@ zgRP<6huOVs`i{Of{t?G?gCv8@_vOc!UCAZUr9=L18YY?*nw$IsM)ft7@9vcuTN=1b zIORKZl=GGqm;0EjR~=MjSePImw}sg)SR~n3^c0NHRC!jZ*OZhspu#8LPY`T~O;p9Q z#_ZhUV0b9HTHTN;(+mI9*xA??^bNGBwXC)E)4lR|IdAZ_N+$DJ|KNyFuUq)SnUJAX zXDrXHVTq-xq!P+cMXf7gA|sOH-i;n1yL`0Lv_ZW#$P{z4;Go=hS`@|HN*2_wD8;r|FfB$-Ql=-)InNIK+6xS26I>)mb?f z#ut%|*`{gML59UAyk5K1WkxcOz5TdV-js4@HlXlA28_kzArFW|1r7kur?|*M*Y^e&VTY(biQD|k(id4s(5AclVnlH z+q1Q(h2)*Roiu77^$8ydZ}P*&+4fnqQ^m#7q(GPvqS|kgciP9+sJr?DZ*TF?M*D{M zROV*HtlK$lyjii=>K6aRv1hWK-pS_jO#jH{$cQiT!J9X74tb(7zFb>QGqkmDvqu{r zP5F18C*sTn?lte4B?UBiLf6fQS>hF{!Uah6n6jC9N)=XZM)pSv$7;mc#VQ#Yy()_a z>$baHNSijKY~0_>*A8qy=i=s~$)uAoaD8|2>_}&8rE)l3eK>V9GX=Axyc@doqQb%! zf+d1`Ey31Kdx+q)aVC2oFnftz`M-Ldlh;aXO(l2g*0xj(rwvz2KbSe$?K?U--kf?g zpE_GLJcjc&v##a6+p$f1f3=ZY&E|B5U)>q$g~s8`o4U7~-)Bzz0$OldL*~O7$nG-J z!-{{kEybU0IB#@GUz09{#d-TRC5;`=s|_SUOrkTjGhe_({B>tGzC3=zRa>}!ocF^7 z(hh+i(wr3?+kU^hmK=VubFqe)ZEq~qOVq=8o7^<$Td`KsJ5_N0>Re^(-Rxt3vs1aP zw#|4Z=1&2LqrLUrK1dz}Y39@@=1+8TU=H>*m+gD*`dtM`OqiNV*t})}(4qupwVlu- z6X(ylAQAHeyee~dEIJtPn@$5>J$b%P_X&>M4CH=61Qw^7Acv1KXAKM}2xIh;X8Dj$ zZfpUKaFENJlRQMtWjVDT=b*!%4Bh%B%|Cycu{8Q>39brbF8?PmNPRUMb#(ymCB6Z` z1yTTTE)nqZ0st8RxW6#~fB@e78*2l(|8TAW0O9t4>wh?gm-cF?Ud~JPAA2q9+TRSC zES$eF*%h^)jg9Wo5V)!ucmM!Ilvfi7NX1?{ui@J3=%e-3?@3v?I0;%m zDgX>4bqSr2XbUjL$;*JE12|@*-tZ+gw z7z}f_wvp0SRQ@Bse3D_cL!(`#AP_GvFF`L6K^J#hh>)bDBm^o95f&D>WC(b8JEJWy z0?r<6evUD|dTWw7rWn_$sf3rHdz8hL!cI(BI>)KGF6z|5S4J__M6b1wyVO z5FtS*vQQgd|D}A-5v8&2PF#P>n(c1S3jR6|o z%xYUz%HF z2jzg~#!N$-#VgQJ$InTtNe^CM)IZ|ubcHH|@GNOLw)EqSn!N{3_qOSirG2w%d%F4w zj*akQJB#ejgxY + {{ "region" | i18n }}: + + + + + + + + + +
+ +
+
diff --git a/libs/angular/src/auth/components/environment-selector.component.ts b/libs/angular/src/auth/components/environment-selector.component.ts new file mode 100644 index 00000000000..c708a0af0e7 --- /dev/null +++ b/libs/angular/src/auth/components/environment-selector.component.ts @@ -0,0 +1,103 @@ +import { animate, state, style, transition, trigger } from "@angular/animations"; +import { ConnectedPosition } from "@angular/cdk/overlay"; +import { Component, EventEmitter, OnDestroy, OnInit, Output } from "@angular/core"; +import { Router } from "@angular/router"; +import { Subject } from "rxjs"; + +import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction"; +import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; + +@Component({ + selector: "environment-selector", + templateUrl: "environment-selector.component.html", + animations: [ + trigger("transformPanel", [ + state( + "void", + style({ + opacity: 0, + }) + ), + transition( + "void => open", + animate( + "100ms linear", + style({ + opacity: 1, + }) + ) + ), + transition("* => void", animate("100ms linear", style({ opacity: 0 }))), + ]), + ], +}) +export class EnvironmentSelectorComponent implements OnInit, OnDestroy { + @Output() onOpenSelfHostedSettings = new EventEmitter(); + isOpen = false; + showingModal = false; + selectedEnvironment: ServerEnvironment; + ServerEnvironmentType = ServerEnvironment; + euServerFlagEnabled: boolean; + overlayPostition: ConnectedPosition[] = [ + { + originX: "start", + originY: "bottom", + overlayX: "start", + overlayY: "top", + }, + ]; + protected componentDestroyed$: Subject = new Subject(); + + constructor( + protected environmentService: EnvironmentService, + protected configService: ConfigServiceAbstraction, + protected router: Router + ) {} + + async ngOnInit() { + this.euServerFlagEnabled = await this.configService.getFeatureFlagBool( + FeatureFlag.DisplayEuEnvironmentFlag + ); + this.updateEnvironmentInfo(); + } + + ngOnDestroy(): void { + this.componentDestroyed$.next(); + this.componentDestroyed$.complete(); + } + + async toggle(option: ServerEnvironment) { + this.isOpen = !this.isOpen; + if (option === ServerEnvironment.EU) { + await this.environmentService.setUrls({ base: "https://vault.bitwarden.eu" }); + } else if (option === ServerEnvironment.US) { + await this.environmentService.setUrls({ base: "https://vault.bitwarden.com" }); + } else if (option === ServerEnvironment.SelfHosted) { + this.onOpenSelfHostedSettings.emit(); + } + this.updateEnvironmentInfo(); + } + + updateEnvironmentInfo() { + const webvaultUrl = this.environmentService.getWebVaultUrl(); + if (this.environmentService.isSelfHosted()) { + this.selectedEnvironment = ServerEnvironment.SelfHosted; + } else if (webvaultUrl != null && webvaultUrl.includes("bitwarden.eu")) { + this.selectedEnvironment = ServerEnvironment.EU; + } else { + this.selectedEnvironment = ServerEnvironment.US; + } + } + + close() { + this.isOpen = false; + this.updateEnvironmentInfo(); + } +} + +enum ServerEnvironment { + US = "US", + EU = "EU", + SelfHosted = "Self-hosted", +} diff --git a/libs/angular/src/components/environment.component.ts b/libs/angular/src/components/environment.component.ts index 347b5686e7b..f47fcf91247 100644 --- a/libs/angular/src/components/environment.component.ts +++ b/libs/angular/src/components/environment.component.ts @@ -4,6 +4,8 @@ import { EnvironmentService } from "@bitwarden/common/abstractions/environment.s import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; +import { ModalService } from "../services/modal.service"; + @Directive() export class EnvironmentComponent { @Output() onSaved = new EventEmitter(); @@ -19,7 +21,8 @@ export class EnvironmentComponent { constructor( protected platformUtilsService: PlatformUtilsService, protected environmentService: EnvironmentService, - protected i18nService: I18nService + protected i18nService: I18nService, + private modalService: ModalService ) { const urls = this.environmentService.getUrls(); @@ -59,5 +62,6 @@ export class EnvironmentComponent { protected saved() { this.onSaved.emit(); + this.modalService.closeAll(); } } diff --git a/libs/common/src/services/environment.service.ts b/libs/common/src/services/environment.service.ts index e093f0891af..2c6df478ebe 100644 --- a/libs/common/src/services/environment.service.ts +++ b/libs/common/src/services/environment.service.ts @@ -218,6 +218,8 @@ export class EnvironmentService implements EnvironmentServiceAbstraction { return ![ "http://vault.bitwarden.com", "https://vault.bitwarden.com", + "http://vault.bitwarden.eu", + "https://vault.bitwarden.eu", "http://vault.qa.bitwarden.pw", "https://vault.qa.bitwarden.pw", ].includes(this.getWebVaultUrl()); From 27094057f82c0221236ad007a6eaa5c1080b2b79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 11:17:15 +0200 Subject: [PATCH 031/299] chore(deps): update dependency tsconfig-paths-webpack-plugin to v4 (#5481) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 69 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 168de485045..3d5b1b13572 100644 --- a/package-lock.json +++ b/package-lock.json @@ -167,7 +167,7 @@ "tailwindcss": "3.3.2", "ts-jest": "29.1.0", "ts-loader": "9.4.2", - "tsconfig-paths-webpack-plugin": "3.5.2", + "tsconfig-paths-webpack-plugin": "4.0.1", "type-fest": "2.19.0", "typescript": "4.9.5", "url": "0.11.0", @@ -7495,6 +7495,39 @@ "webpack": "*" } }, + "node_modules/@storybook/angular/node_modules/tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "node_modules/@storybook/angular/node_modules/tsconfig-paths-webpack-plugin/node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@storybook/angular/node_modules/tsconfig-paths-webpack-plugin/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@storybook/api": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", @@ -42523,14 +42556,40 @@ } }, "node_modules/tsconfig-paths-webpack-plugin": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", - "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/json5": { diff --git a/package.json b/package.json index c8e69c64b3f..0bdd5e95ffd 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "tailwindcss": "3.3.2", "ts-jest": "29.1.0", "ts-loader": "9.4.2", - "tsconfig-paths-webpack-plugin": "3.5.2", + "tsconfig-paths-webpack-plugin": "4.0.1", "type-fest": "2.19.0", "typescript": "4.9.5", "url": "0.11.0", From 73e03bab8176976d23c21dcbe99358a2b30379ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 11:30:47 +0200 Subject: [PATCH 032/299] Autosync the updated translations (#5490) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/af/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ar/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/az/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/be/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/bg/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/bn/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/bs/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ca/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/cs/messages.json | 18 ++++++++++++++++-- apps/desktop/src/locales/cy/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/da/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/de/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/el/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/en_GB/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/en_IN/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/eo/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/es/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/et/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/eu/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/fa/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/fi/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/fil/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/fr/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/gl/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/he/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/hi/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/hr/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/hu/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/id/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/it/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ja/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ka/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/km/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/kn/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ko/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/lv/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/me/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ml/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/my/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/nb/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ne/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/nl/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/nn/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/or/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/pl/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/pt_BR/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/pt_PT/messages.json | 20 +++++++++++++++++--- apps/desktop/src/locales/ro/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/ru/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/si/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/sk/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/sl/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/sr/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/sv/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/te/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/th/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/tr/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/uk/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/vi/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/zh_CN/messages.json | 14 ++++++++++++++ apps/desktop/src/locales/zh_TW/messages.json | 14 ++++++++++++++ 61 files changed, 859 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 3f1b4c73d4a..f9843da28bb 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index df54e50e2fb..7e558adc15e 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "تحديث الإعدادات الموصى بها" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 0a4608e4fdf..e409110b056 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Tövsiyə edilən Tənzimləmələr Güncəlləməsi" + }, + "region": { + "message": "Bölgə" + }, + "eu": { + "message": "AB", + "description": "European Union" + }, + "us": { + "message": "ABŞ", + "description": "United States" + }, + "selfHosted": { + "message": "Öz-özünə sahiblik edən" } } diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index cdabb7e7935..efd52d6444f 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Рэкамендаваныя налады абнаўлення" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index f0bac933dfa..4c893711926 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Препоръчителна промяна на настройките" + }, + "region": { + "message": "Регион" + }, + "eu": { + "message": "ЕС", + "description": "European Union" + }, + "us": { + "message": "САЩ", + "description": "United States" + }, + "selfHosted": { + "message": "Собствен хостинг" } } diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 7d4cfb2eb39..f6972836d99 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 118b5be7ce9..e5cc399e208 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index b2905fc5a01..e0d1adf7e53 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Actualització de configuració recomanada" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 391f2311ece..e35a5d78d25 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -1985,10 +1985,10 @@ "message": "Vypršel časový limit relace. Vraťte se zpět a zkuste se znovu přihlásit." }, "exportingPersonalVaultTitle": { - "message": "Exportování individuálního trezoru" + "message": "Exportování osobního trezoru" }, "exportingPersonalVaultDescription": { - "message": "Budou exportovány pouze jednotlivé položky trezoru spojené s $EMAIL$ . Nebudou zahrnuty položky trezoru v organizaci.", + "message": "Budou exportovány jen osobní položky trezoru spojené s účtem $EMAIL$. Nebudou zahrnuty položky trezoru v organizaci.", "placeholders": { "email": { "content": "$1", @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Aktualizace doporučených nastavení" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Vlastní hosting" } } diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 13b91e222b0..fbc7635f3b3 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 6ea996538e5..6d915a97ab0 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Anbefalet indstillingsopdatering" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "USA", + "description": "United States" + }, + "selfHosted": { + "message": "Selv-hostet" } } diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 9bde505fee7..a757de46dcc 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Empfohlene Aktualisierung der Einstellungen" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Selbst gehostet" } } diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 69a2f127d7a..bb84afe7d0d 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 8fa8ea82d0c..fd9426f6429 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 4dc29b8f342..f3ee40a6dd1 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 1139f03eea0..bb86246b2d5 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index a7ff6d0541d..e8b8fa0b041 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Actualización de ajustes recomendados" + }, + "region": { + "message": "Región" + }, + "eu": { + "message": "Unión Europea", + "description": "European Union" + }, + "us": { + "message": "EE.UU.", + "description": "United States" + }, + "selfHosted": { + "message": "Autoalojado" } } diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 9b1fdfa8a2f..6f05a3f625f 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 3b3c2d7970c..5e1323a74c0 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index a2f2511297e..220b53cda57 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "به‌روز رسانی تنظیمات توصیه شده" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 3269d109220..7287c306da7 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Suositeltava asetusmuutos" + }, + "region": { + "message": "Alue" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Itse ylläpidetty" } } diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 4afa5458678..9613f221e9b 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 83504d30ba2..0fe9681d2d8 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Une mise à jour des paramètres est recommandée" + }, + "region": { + "message": "Région" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Auto-hébergé" } } diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 13b91e222b0..fbc7635f3b3 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index b4fcbf3a686..2cc3461e8a5 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index b6c7c6e40d5..2324d200193 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index adbf8764a61..dcf0ae8534e 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index 3fde5beaf8c..4016a73db90 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Ajánlott beállítások frissítése" + }, + "region": { + "message": "Régió" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Saját kiszolgáló" } } diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 1f163f4841f..437838521ae 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 5d4cf2decb5..90580d12aa8 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Aggiornamento delle impostazioni consigliato" + }, + "region": { + "message": "Regione" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index 5ea54813603..d1f12350675 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "設定の更新を推奨" + }, + "region": { + "message": "リージョン" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "米国", + "description": "United States" + }, + "selfHosted": { + "message": "自己ホスト型" } } diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 13b91e222b0..fbc7635f3b3 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 13b91e222b0..fbc7635f3b3 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 577dcda11e7..2f1870a2b42 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index a97d51adebd..b5b4f69d786 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 550ee72fd93..705aa4ba5c6 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Ieteicamie iestatījumu atjauninājumi" + }, + "region": { + "message": "Apgabals" + }, + "eu": { + "message": "ES", + "description": "European Union" + }, + "us": { + "message": "ASV", + "description": "United States" + }, + "selfHosted": { + "message": "Pašizvietots" } } diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index 6e0f3572f7c..c6555d2e8de 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 48b4aa97247..104d697f536 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index f3dca94dd9b..545c17156b8 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index dc62c1fe206..b431e2a14e1 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 13b91e222b0..fbc7635f3b3 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 66873ef00e9..bcd3fd94412 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Aanbevolen instellingen" + }, + "region": { + "message": "Regio" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Zelfgehost" } } diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 48325eab3c4..0b7b4ce1135 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index b5750b7d070..ede06949744 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 47959f42b39..2dd103dcd05 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Aktualizacja ustawień zalecanych" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Samodzielnie hostowany" } } diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 57761b38c66..5e909f4735a 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index d3445726286..e7235d1ed93 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -570,7 +570,7 @@ "message": "Não existem itens para listar." }, "sendVerificationCode": { - "message": "Envie um código de verificação para o seu e-mail" + "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { "message": "Enviar o código" @@ -1684,7 +1684,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "myVault": { - "message": "O meu Cofre" + "message": "O meu cofre" }, "text": { "message": "Texto" @@ -2052,7 +2052,7 @@ "message": "Procurar Organização" }, "searchMyVault": { - "message": "Procurar no meu Cofre" + "message": "Procurar no meu cofre" }, "forwardedEmail": { "message": "Forwarded email alias" @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Região" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "EUA", + "description": "United States" + }, + "selfHosted": { + "message": "Auto-hospedado" } } diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index df5d3af9042..c5fc551e181 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index ea290c84c93..e940c976866 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Рекомендуемое обновление настроек" + }, + "region": { + "message": "Регион" + }, + "eu": { + "message": "Европа", + "description": "European Union" + }, + "us": { + "message": "США", + "description": "United States" + }, + "selfHosted": { + "message": "Собственный хостинг" } } diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 7e053127232..e8a79147aa5 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index ffafe222cc3..773be1cd07f 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Odporúčaná aktualizácia nastavenia" + }, + "region": { + "message": "Región" + }, + "eu": { + "message": "EÚ", + "description": "European Union" + }, + "us": { + "message": "USA", + "description": "United States" + }, + "selfHosted": { + "message": "Vlastný hosting" } } diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 6ad123c585b..f670e572bc4 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 894c3ea59ea..fb225b1763d 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Препоручено ажурирање поставки" + }, + "region": { + "message": "Регион" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Личан хостинг" } } diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index d1e242eb6a2..247f6464081 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 13b91e222b0..fbc7635f3b3 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index fd5b9d7b92c..e68d7d13c10 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index d7b4924010c..294ab336c35 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Önerilen Ayarlar Güncellemesi" + }, + "region": { + "message": "Bölge" + }, + "eu": { + "message": "AB", + "description": "European Union" + }, + "us": { + "message": "ABD", + "description": "United States" + }, + "selfHosted": { + "message": "Barındırılan" } } diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index d86332f5063..4e4c214ed9b 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Оновлення рекомендованих налаштувань" + }, + "region": { + "message": "Регіон" + }, + "eu": { + "message": "ЄС", + "description": "European Union" + }, + "us": { + "message": "США", + "description": "United States" + }, + "selfHosted": { + "message": "Власне розміщення" } } diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 8a810b8d845..e4fcbede490 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index d4a028271c0..8184e19b768 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "推荐的设置更新" + }, + "region": { + "message": "区域" + }, + "eu": { + "message": "欧盟", + "description": "European Union" + }, + "us": { + "message": "美国", + "description": "United States" + }, + "selfHosted": { + "message": "自托管" } } diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index e248870ab38..a5df7cdde51 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -2251,5 +2251,19 @@ }, "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, + "selfHosted": { + "message": "Self-hosted" } } From 14084dcf59ff92a6e5a31d240dbf0021b5946e89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 11:37:21 +0200 Subject: [PATCH 033/299] Autosync the updated translations (#5489) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 11 +++++++++++ apps/browser/src/_locales/az/messages.json | 11 +++++++++++ apps/browser/src/_locales/be/messages.json | 11 +++++++++++ apps/browser/src/_locales/bg/messages.json | 11 +++++++++++ apps/browser/src/_locales/bn/messages.json | 11 +++++++++++ apps/browser/src/_locales/bs/messages.json | 11 +++++++++++ apps/browser/src/_locales/ca/messages.json | 11 +++++++++++ apps/browser/src/_locales/cs/messages.json | 15 +++++++++++++-- apps/browser/src/_locales/cy/messages.json | 11 +++++++++++ apps/browser/src/_locales/da/messages.json | 11 +++++++++++ apps/browser/src/_locales/de/messages.json | 11 +++++++++++ apps/browser/src/_locales/el/messages.json | 11 +++++++++++ apps/browser/src/_locales/en_GB/messages.json | 8 ++++++++ apps/browser/src/_locales/en_IN/messages.json | 11 +++++++++++ apps/browser/src/_locales/es/messages.json | 11 +++++++++++ apps/browser/src/_locales/et/messages.json | 11 +++++++++++ apps/browser/src/_locales/eu/messages.json | 11 +++++++++++ apps/browser/src/_locales/fa/messages.json | 11 +++++++++++ apps/browser/src/_locales/fi/messages.json | 11 +++++++++++ apps/browser/src/_locales/fil/messages.json | 11 +++++++++++ apps/browser/src/_locales/fr/messages.json | 11 +++++++++++ apps/browser/src/_locales/gl/messages.json | 11 +++++++++++ apps/browser/src/_locales/he/messages.json | 11 +++++++++++ apps/browser/src/_locales/hi/messages.json | 11 +++++++++++ apps/browser/src/_locales/hr/messages.json | 11 +++++++++++ apps/browser/src/_locales/hu/messages.json | 11 +++++++++++ apps/browser/src/_locales/id/messages.json | 11 +++++++++++ apps/browser/src/_locales/it/messages.json | 11 +++++++++++ apps/browser/src/_locales/ja/messages.json | 11 +++++++++++ apps/browser/src/_locales/ka/messages.json | 11 +++++++++++ apps/browser/src/_locales/km/messages.json | 11 +++++++++++ apps/browser/src/_locales/kn/messages.json | 11 +++++++++++ apps/browser/src/_locales/ko/messages.json | 11 +++++++++++ apps/browser/src/_locales/lt/messages.json | 11 +++++++++++ apps/browser/src/_locales/lv/messages.json | 11 +++++++++++ apps/browser/src/_locales/ml/messages.json | 11 +++++++++++ apps/browser/src/_locales/my/messages.json | 11 +++++++++++ apps/browser/src/_locales/nb/messages.json | 11 +++++++++++ apps/browser/src/_locales/ne/messages.json | 11 +++++++++++ apps/browser/src/_locales/nl/messages.json | 11 +++++++++++ apps/browser/src/_locales/nn/messages.json | 11 +++++++++++ apps/browser/src/_locales/or/messages.json | 11 +++++++++++ apps/browser/src/_locales/pl/messages.json | 11 +++++++++++ apps/browser/src/_locales/pt_BR/messages.json | 11 +++++++++++ apps/browser/src/_locales/pt_PT/messages.json | 17 ++++++++++++++--- apps/browser/src/_locales/ro/messages.json | 11 +++++++++++ apps/browser/src/_locales/ru/messages.json | 11 +++++++++++ apps/browser/src/_locales/si/messages.json | 11 +++++++++++ apps/browser/src/_locales/sk/messages.json | 11 +++++++++++ apps/browser/src/_locales/sl/messages.json | 13 ++++++++++++- apps/browser/src/_locales/sr/messages.json | 11 +++++++++++ apps/browser/src/_locales/sv/messages.json | 11 +++++++++++ apps/browser/src/_locales/te/messages.json | 11 +++++++++++ apps/browser/src/_locales/th/messages.json | 11 +++++++++++ apps/browser/src/_locales/tr/messages.json | 11 +++++++++++ apps/browser/src/_locales/uk/messages.json | 11 +++++++++++ apps/browser/src/_locales/vi/messages.json | 11 +++++++++++ apps/browser/src/_locales/zh_CN/messages.json | 11 +++++++++++ apps/browser/src/_locales/zh_TW/messages.json | 11 +++++++++++ 59 files changed, 652 insertions(+), 6 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 609f6ef39da..71cd3d1a66b 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 9ad7b097abd..0c12f845d51 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Bölgə" + }, "opensInANewWindow": { "message": "Yeni bir pəncərədə açılır" + }, + "eu": { + "message": "AB", + "description": "European Union" + }, + "us": { + "message": "ABŞ", + "description": "United States" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 4d0fe3698de..80800f4aa38 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Адкрываць у новым акне" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index bc3feb2469c..b17692bc83b 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Регион" + }, "opensInANewWindow": { "message": "Отваря се в нов прозорец" + }, + "eu": { + "message": "ЕС", + "description": "European Union" + }, + "us": { + "message": "САЩ", + "description": "United States" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 9ddc1b03ecb..76143e7619a 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 3f37ef10f7d..b3047a98789 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 1028885f506..e117d21790c 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "S'obri en una finestra nova" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 7ff5424a05c..d83282e08a4 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -1977,10 +1977,10 @@ "message": "Vypršel časový limit relace. Vraťte se zpět a zkuste se znovu přihlásit." }, "exportingPersonalVaultTitle": { - "message": "Exportování individuálního trezoru" + "message": "Exportování osobního trezoru" }, "exportingPersonalVaultDescription": { - "message": "Budou exportovány pouze položky trezoru spojené s účtem $EMAIL$. Nebudou zahrnuty položky trezoru v organizaci.", + "message": "Budou exportovány jen osobní položky trezoru spojené s účtem $EMAIL$. Nebudou zahrnuty položky trezoru v organizaci.", "placeholders": { "email": { "content": "$1", @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Otevře se v novém okně" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 53451d098ec..5aebf5dd80d 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Åbnes i et nyt vindue" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "USA", + "description": "United States" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index c6f7b909882..c7827d4ddc4 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Wird in einem neuen Fenster geöffnet" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index d86d1be57e5..e6da9f04c8d 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Ανοίγει σε νέο παράθυρο" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 3b54fe0efe4..653ff32074c 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -2226,5 +2226,13 @@ }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index de8b5957659..3fe6222cfcf 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index ac4b28b7dd5..afd3ea4ce87 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Región" + }, "opensInANewWindow": { "message": "Abre en una nueva ventana" + }, + "eu": { + "message": "Unión Europea", + "description": "European Union" + }, + "us": { + "message": "EE.UU.", + "description": "United States" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 8ccfcb5dcc7..02ee8d04384 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Piirkond" + }, "opensInANewWindow": { "message": "Avaneb uues aknas" + }, + "eu": { + "message": "EL", + "description": "European Union" + }, + "us": { + "message": "USA", + "description": "United States" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 9d2196ed64a..e2189ce6a68 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 6a13d95927f..0e4a59e164b 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "در پنجره جدید باز می‌شود" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 4edb1b563c4..69b77b26123 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Alue" + }, "opensInANewWindow": { "message": "Avautuu uudessa ikkunassa" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index af8050b68a9..e98884c2007 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index ae4893dd813..8f4e769c695 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Région" + }, "opensInANewWindow": { "message": "S'ouvre dans une nouvelle fenêtre" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index e4e676471f5..fc90bade6c0 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 456822a3cc3..df561ad0e47 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index d668e3e0d2c..37ecb3de8c8 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index d06a236f695..c5e8214b635 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Régió" + }, "opensInANewWindow": { "message": "Megnyitás új ablakban" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 220af16b5aa..6addc264fb2 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index c3aab715458..1971331fd98 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Regione" + }, "opensInANewWindow": { "message": "Si apre in una nuova finestra" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index e6eca2c5383..630dfb3e217 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "リージョン" + }, "opensInANewWindow": { "message": "新しいウィンドウで開く" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "米国", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index d71e9402df6..2f484324f39 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 31b78ceb490..baa61fad177 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 155736462d3..962fe7347cf 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 078c28a261e..e6a9dbdc5c6 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 317a1d48cc3..38c892aaede 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Apgabals" + }, "opensInANewWindow": { "message": "Atver jaunā logā" + }, + "eu": { + "message": "ES", + "description": "European Union" + }, + "us": { + "message": "ASV", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 1975bb0f14c..4c4e9936e0f 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 0946027aee5..8ede2fb9389 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 1f76bc82fef..cf3cae05d40 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Regio" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 36f8cc8c94a..ca32eb73aa6 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Otwiera w nowym oknie" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 8b4fcfad0ac..87585d561d0 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index ad53f10e414..99503282049 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -56,7 +56,7 @@ "message": "Cofre" }, "myVault": { - "message": "O meu Cofre" + "message": "O meu cofre" }, "allVaults": { "message": "Todos os Cofres" @@ -128,7 +128,7 @@ "message": "Continuar" }, "sendVerificationCode": { - "message": "Envie um código de verificação para o seu e-mail" + "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { "message": "Enviar o código" @@ -1744,7 +1744,7 @@ } }, "custom": { - "message": "Custom" + "message": "Personalizado" }, "maximumAccessCount": { "message": "Maximum Access Count" @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Região" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "EUA", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index bad505607a3..47a684aa1ae 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 1b15850d27b..9da7f861dc8 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Регион" + }, "opensInANewWindow": { "message": "Откроется в новом окне" + }, + "eu": { + "message": "Европа", + "description": "European Union" + }, + "us": { + "message": "США", + "description": "United States" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 9b917a74dbb..94baba9b6da 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 147fe0bbd40..2fa04daf3df 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Región" + }, "opensInANewWindow": { "message": "Otvárať v novom okne" + }, + "eu": { + "message": "EÚ", + "description": "European Union" + }, + "us": { + "message": "USA", + "description": "United States" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 32f3f860fa0..91fdc621fdf 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -2180,7 +2180,7 @@ "message": "Kako uporabljati samodejno izpolnjevanje" }, "autofillSelectInfoWithCommand": { - "message": "Izberite element na tej strani ali pa uporabite bližnjico $COMMAND$", + "message": "Izberite element na tej strani ali pa uporabite bližnjico $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Odpre se v novem oknu" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index a0368285da5..952ae901451 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Регион" + }, "opensInANewWindow": { "message": "Отвара се у новом прозору" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index a270aedb9bd..79afc8729d5 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Öppnas i ett nytt fönster" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 0a69b948876..69d26333a84 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 6a355591f6b..1e43987ab06 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 4f904da2445..cdc8e109fe4 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Bölge" + }, "opensInANewWindow": { "message": "Yeni pencerede açılır" + }, + "eu": { + "message": "AB", + "description": "European Union" + }, + "us": { + "message": "ABD", + "description": "United States" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 336bf3d39ac..1969bc33624 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Регіон" + }, "opensInANewWindow": { "message": "Відкривається у новому вікні" + }, + "eu": { + "message": "ЄС", + "description": "European Union" + }, + "us": { + "message": "США", + "description": "United States" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index f7aea9e1518..fee4c66f3a9 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 0f7d9870e17..45c3c62db0e 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "区域" + }, "opensInANewWindow": { "message": "在新窗口中打开" + }, + "eu": { + "message": "欧盟", + "description": "European Union" + }, + "us": { + "message": "美国", + "description": "United States" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 83bd8bd8e38..42e082f136b 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -2221,7 +2221,18 @@ } } }, + "region": { + "message": "Region" + }, "opensInANewWindow": { "message": "Opens in a new window" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" } } From b31203d64fbdbc0eaef41a94b00bc85cfe998a18 Mon Sep 17 00:00:00 2001 From: Manuel Date: Mon, 22 May 2023 17:28:00 +0200 Subject: [PATCH 034/299] Added textarea (#4155) --- apps/browser/src/autofill/content/autofill.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/browser/src/autofill/content/autofill.js b/apps/browser/src/autofill/content/autofill.js index 661eb8e2528..052fd1120fe 100644 --- a/apps/browser/src/autofill/content/autofill.js +++ b/apps/browser/src/autofill/content/autofill.js @@ -676,7 +676,7 @@ var els = []; try { var elsList = theDoc.querySelectorAll('input:not([type="hidden"]):not([type="submit"]):not([type="reset"])' + - ':not([type="button"]):not([type="image"]):not([type="file"]):not([data-bwignore]), select, ' + + ':not([type="button"]):not([type="image"]):not([type="file"]):not([data-bwignore]), select, textarea, ' + 'span[data-bwautofill]'); els = Array.prototype.slice.call(elsList); } catch (e) { } @@ -1177,7 +1177,7 @@ } try { // START MODIFICATION - var elements = Array.prototype.slice.call(selectAllFromDoc('input, select, button, ' + + var elements = Array.prototype.slice.call(selectAllFromDoc('input, select, button, textarea, ' + 'span[data-bwautofill]')); // END MODIFICATION var filteredElements = elements.filter(function (o) { From 62591a8bc8d7dcf754db92d742cb3bfe70b9fbc6 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Mon, 22 May 2023 20:19:16 +0200 Subject: [PATCH 035/299] [PM-2328] Fix jest deprecations (#5483) --- apps/browser/jest.config.js | 3 ++- apps/cli/jest.config.js | 6 +++-- apps/desktop/jest.config.js | 3 ++- apps/web/jest.config.js | 4 +-- bitwarden_license/bit-web/jest.config.js | 4 +-- jest.config.js | 11 ++------ libs/angular/jest.config.js | 3 ++- libs/common/jest.config.js | 3 ++- libs/components/jest.config.js | 3 ++- libs/exporter/jest.config.js | 3 ++- libs/importer/jest.config.js | 3 ++- libs/node/jest.config.js | 3 ++- libs/shared/jest.config.angular.js | 32 ++++++++++++++++++++++++ libs/shared/jest.config.base.js | 27 -------------------- libs/shared/jest.config.ts.js | 29 +++++++++++++++++++++ 15 files changed, 87 insertions(+), 50 deletions(-) create mode 100644 libs/shared/jest.config.angular.js delete mode 100644 libs/shared/jest.config.base.js create mode 100644 libs/shared/jest.config.ts.js diff --git a/apps/browser/jest.config.js b/apps/browser/jest.config.js index 4f954afa9e2..cde02cd9959 100644 --- a/apps/browser/jest.config.js +++ b/apps/browser/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "jest-preset-angular", diff --git a/apps/cli/jest.config.js b/apps/cli/jest.config.js index 67116d394b3..8765ccc8e4e 100644 --- a/apps/cli/jest.config.js +++ b/apps/cli/jest.config.js @@ -1,8 +1,10 @@ const { pathsToModuleNameMapper } = require("ts-jest"); -const { compilerOptions } = require("./tsconfig.json"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const { compilerOptions } = require("./tsconfig"); +const sharedConfig = require("../../libs/shared/jest.config.ts"); + +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "ts-jest", diff --git a/apps/desktop/jest.config.js b/apps/desktop/jest.config.js index 4f954afa9e2..cde02cd9959 100644 --- a/apps/desktop/jest.config.js +++ b/apps/desktop/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "jest-preset-angular", diff --git a/apps/web/jest.config.js b/apps/web/jest.config.js index 707e8960e3e..cde02cd9959 100644 --- a/apps/web/jest.config.js +++ b/apps/web/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "jest-preset-angular", @@ -11,5 +12,4 @@ module.exports = { moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, { prefix: "/", }), - modulePathIgnorePatterns: ["jslib"], }; diff --git a/bitwarden_license/bit-web/jest.config.js b/bitwarden_license/bit-web/jest.config.js index 84c6866a7db..17b7139049a 100644 --- a/bitwarden_license/bit-web/jest.config.js +++ b/bitwarden_license/bit-web/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "jest-preset-angular", @@ -11,5 +12,4 @@ module.exports = { moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, { prefix: "/", }), - modulePathIgnorePatterns: ["jslib"], }; diff --git a/jest.config.js b/jest.config.js index ec58fe0c019..8b54a826583 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,12 +2,14 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); +/** @type {import('jest').Config} */ module.exports = { reporters: ["default", "jest-junit"], collectCoverage: true, coverageReporters: ["html", "lcov"], coverageDirectory: "coverage", + moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, { prefix: "/", }), @@ -30,13 +32,4 @@ module.exports = { // https://github.com/facebook/jest/issues/9430#issuecomment-1149882002 // Also anecdotally improves performance when run locally maxWorkers: 3, - globals: { - "ts-jest": { - // Further workaround for memory leak, recommended here: - // https://github.com/kulshekhar/ts-jest/issues/1967#issuecomment-697494014 - // Makes tests run faster and reduces size/rate of leak, but loses typechecking on test code - // See https://bitwarden.atlassian.net/browse/EC-497 for more info - isolatedModules: true, - }, - }, }; diff --git a/libs/angular/jest.config.js b/libs/angular/jest.config.js index 3be0f66db55..e294e4ff472 100644 --- a/libs/angular/jest.config.js +++ b/libs/angular/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("../shared/tsconfig.libs"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, displayName: "libs/angular tests", diff --git a/libs/common/jest.config.js b/libs/common/jest.config.js index 29309a78306..d7f78abbf38 100644 --- a/libs/common/jest.config.js +++ b/libs/common/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("../shared/tsconfig.libs"); -const sharedConfig = require("../shared/jest.config.base"); +const sharedConfig = require("../shared/jest.config.ts"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, displayName: "libs/common tests", diff --git a/libs/components/jest.config.js b/libs/components/jest.config.js index e90c663ce90..2f4b1ed15d4 100644 --- a/libs/components/jest.config.js +++ b/libs/components/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("./tsconfig"); -const sharedConfig = require("../../libs/shared/jest.config.base"); +const sharedConfig = require("../../libs/shared/jest.config.angular"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, displayName: "libs/components tests", diff --git a/libs/exporter/jest.config.js b/libs/exporter/jest.config.js index 2eeeefad625..68daba3d407 100644 --- a/libs/exporter/jest.config.js +++ b/libs/exporter/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("../shared/tsconfig.libs"); -const sharedConfig = require("../shared/jest.config.base"); +const sharedConfig = require("../shared/jest.config.ts"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "ts-jest", diff --git a/libs/importer/jest.config.js b/libs/importer/jest.config.js index 2eeeefad625..68daba3d407 100644 --- a/libs/importer/jest.config.js +++ b/libs/importer/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("../shared/tsconfig.libs"); -const sharedConfig = require("../shared/jest.config.base"); +const sharedConfig = require("../shared/jest.config.ts"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "ts-jest", diff --git a/libs/node/jest.config.js b/libs/node/jest.config.js index 833d03cfa5d..fd7d580fdaf 100644 --- a/libs/node/jest.config.js +++ b/libs/node/jest.config.js @@ -2,8 +2,9 @@ const { pathsToModuleNameMapper } = require("ts-jest"); const { compilerOptions } = require("../shared/tsconfig.libs"); -const sharedConfig = require("../shared/jest.config.base"); +const sharedConfig = require("../shared/jest.config.ts"); +/** @type {import('jest').Config} */ module.exports = { ...sharedConfig, preset: "ts-jest", diff --git a/libs/shared/jest.config.angular.js b/libs/shared/jest.config.angular.js new file mode 100644 index 00000000000..a0dcc275163 --- /dev/null +++ b/libs/shared/jest.config.angular.js @@ -0,0 +1,32 @@ +/* eslint-env node */ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { defaultTransformerOptions } = require("jest-preset-angular/presets"); + +/** @type {import('jest').Config} */ +module.exports = { + testMatch: ["**/+(*.)+(spec).+(ts)"], + + // Workaround for a memory leak that crashes tests in CI: + // https://github.com/facebook/jest/issues/9430#issuecomment-1149882002 + // Also anecdotally improves performance when run locally + maxWorkers: 3, + + transform: { + "^.+\\.(ts|js|mjs|svg)$": [ + "jest-preset-angular", + { + ...defaultTransformerOptions, + // Jest does not use tsconfig.spec.json by default + tsconfig: "/tsconfig.spec.json", + // Further workaround for memory leak, recommended here: + // https://github.com/kulshekhar/ts-jest/issues/1967#issuecomment-697494014 + // Makes tests run faster and reduces size/rate of leak, but loses typechecking on test code + // See https://bitwarden.atlassian.net/browse/EC-497 for more info + isolatedModules: true, + astTransformers: { + before: ["/../../libs/shared/es2020-transformer.ts"], + }, + }, + ], + }, +}; diff --git a/libs/shared/jest.config.base.js b/libs/shared/jest.config.base.js deleted file mode 100644 index e0eda1c4cae..00000000000 --- a/libs/shared/jest.config.base.js +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-env node */ -module.exports = { - testMatch: ["**/+(*.)+(spec).+(ts)"], - collectCoverage: true, - coverageReporters: ["html", "lcov"], - coverageDirectory: "coverage", - - // Workaround for a memory leak that crashes tests in CI: - // https://github.com/facebook/jest/issues/9430#issuecomment-1149882002 - // Also anecdotally improves performance when run locally - maxWorkers: 3, - - globals: { - "ts-jest": { - // Jest does not use tsconfig.spec.json by default - tsconfig: "/tsconfig.spec.json", - // Further workaround for memory leak, recommended here: - // https://github.com/kulshekhar/ts-jest/issues/1967#issuecomment-697494014 - // Makes tests run faster and reduces size/rate of leak, but loses typechecking on test code - // See https://bitwarden.atlassian.net/browse/EC-497 for more info - isolatedModules: true, - astTransformers: { - before: ["/../../libs/shared/es2020-transformer.ts"], - }, - }, - }, -}; diff --git a/libs/shared/jest.config.ts.js b/libs/shared/jest.config.ts.js new file mode 100644 index 00000000000..04ab80859ba --- /dev/null +++ b/libs/shared/jest.config.ts.js @@ -0,0 +1,29 @@ +/* eslint-env node */ + +/** @type {import('jest').Config} */ +module.exports = { + testMatch: ["**/+(*.)+(spec).+(ts)"], + + // Workaround for a memory leak that crashes tests in CI: + // https://github.com/facebook/jest/issues/9430#issuecomment-1149882002 + // Also anecdotally improves performance when run locally + maxWorkers: 3, + + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + // Jest does not use tsconfig.spec.json by default + tsconfig: "/tsconfig.spec.json", + // Further workaround for memory leak, recommended here: + // https://github.com/kulshekhar/ts-jest/issues/1967#issuecomment-697494014 + // Makes tests run faster and reduces size/rate of leak, but loses typechecking on test code + // See https://bitwarden.atlassian.net/browse/EC-497 for more info + isolatedModules: true, + astTransformers: { + before: ["/../../libs/shared/es2020-transformer.ts"], + }, + }, + ], + }, +}; From 3a1ae46c37496b87ba6cd64a8150e11cb342f2ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 13:13:42 -0600 Subject: [PATCH 036/299] chore(deps): update crowdin/github-action action to v1.8.1 (#5484) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-browser.yml | 2 +- .github/workflows/build-desktop.yml | 2 +- .github/workflows/build-web.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 468e8b3b542..7270cc9203c 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -360,7 +360,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@3cabba4ddfd0579a1236b3fb68405236dc489ccc # v1.8.0 + uses: crowdin/github-action@102b5aa21783a64027193ef802a616140a1ca102 # v1.8.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 6c614df4834..7935e2a8eca 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1196,7 +1196,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@3cabba4ddfd0579a1236b3fb68405236dc489ccc # v1.8.0 + uses: crowdin/github-action@102b5aa21783a64027193ef802a616140a1ca102 # v1.8.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 8fed2825a96..9151650a7b6 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -297,7 +297,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@3cabba4ddfd0579a1236b3fb68405236dc489ccc # v1.8.0 + uses: crowdin/github-action@102b5aa21783a64027193ef802a616140a1ca102 # v1.8.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} From 946d254b0fa159dfa4926796340f7a2dd2ac5db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Mon, 22 May 2023 23:04:50 +0100 Subject: [PATCH 037/299] [PM-2347] Fix EU env flag (#5495) --- .../src/auth/components/environment-selector.component.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/angular/src/auth/components/environment-selector.component.html b/libs/angular/src/auth/components/environment-selector.component.html index 53c177ee1dc..e64d09da066 100644 --- a/libs/angular/src/auth/components/environment-selector.component.html +++ b/libs/angular/src/auth/components/environment-selector.component.html @@ -48,6 +48,7 @@ type="button" class="environment-selector-dialog-item" (click)="toggle(ServerEnvironmentType.EU)" + *ngIf="euServerFlagEnabled" > {{ "eu" | i18n }} -
+
- diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts index 0072e1f3ae1..473ce88f2d4 100644 --- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts @@ -1,6 +1,8 @@ import { Component, ViewChild, ViewContainerRef } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; +import { lastValueFrom } from "rxjs"; +import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -15,7 +17,7 @@ import { OrganizationResponse } from "@bitwarden/common/admin-console/models/res import { ApiKeyComponent } from "../../../settings/api-key.component"; import { PurgeVaultComponent } from "../../../settings/purge-vault.component"; -import { DeleteOrganizationComponent } from "./delete-organization.component"; +import { DeleteOrganizationDialogResult, openDeleteOrganizationDialog } from "./components"; @Component({ selector: "app-org-account", @@ -23,8 +25,6 @@ import { DeleteOrganizationComponent } from "./delete-organization.component"; }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class AccountComponent { - @ViewChild("deleteOrganizationTemplate", { read: ViewContainerRef, static: true }) - deleteModalRef: ViewContainerRef; @ViewChild("purgeOrganizationTemplate", { read: ViewContainerRef, static: true }) purgeModalRef: ViewContainerRef; @ViewChild("apiKeyTemplate", { read: ViewContainerRef, static: true }) @@ -51,7 +51,8 @@ export class AccountComponent { private logService: LogService, private router: Router, private organizationService: OrganizationService, - private organizationApiService: OrganizationApiServiceAbstraction + private organizationApiService: OrganizationApiServiceAbstraction, + private dialogService: DialogServiceAbstraction ) {} async ngOnInit() { @@ -100,17 +101,18 @@ export class AccountComponent { } async deleteOrganization() { - await this.modalService.openViewRef( - DeleteOrganizationComponent, - this.deleteModalRef, - (comp) => { - comp.organizationId = this.organizationId; - // eslint-disable-next-line rxjs-angular/prefer-takeuntil - comp.onSuccess.subscribe(() => { - this.router.navigate(["/"]); - }); - } - ); + const dialog = openDeleteOrganizationDialog(this.dialogService, { + data: { + organizationId: this.organizationId, + requestType: "RegularDelete", + }, + }); + + const result = await lastValueFrom(dialog.closed); + + if (result === DeleteOrganizationDialogResult.Deleted) { + this.router.navigate(["/"]); + } } async purgeVault() { diff --git a/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.html b/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.html new file mode 100644 index 00000000000..f963d27b8d8 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.html @@ -0,0 +1,40 @@ + + + {{ "deleteOrganization" | i18n }} +
+ {{ + "deletingOrganizationIsPermanentWarning" | i18n : organization?.name + }} +

+ + {{ "orgCreatedSponsorshipInvalid" | i18n }} + + + + {{ "deletingOrganizationContentWarning" | i18n : organization?.name }} +

    +
  • + {{ type.count }} {{ type.localizationKey | i18n }} +
  • +
+ {{ "deletingOrganizationActiveUserAccountsWarning" | i18n }} + + +

+ +
+
+ + +
+
+ diff --git a/apps/web/src/app/admin-console/organizations/settings/delete-organization.component.ts b/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts similarity index 57% rename from apps/web/src/app/admin-console/organizations/settings/delete-organization.component.ts rename to apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts index cec096955aa..e99a0d29109 100644 --- a/apps/web/src/app/admin-console/organizations/settings/delete-organization.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts @@ -1,17 +1,25 @@ -import { Component, EventEmitter, OnInit, Output } from "@angular/core"; +import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; +import { Component, Inject, OnDestroy, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, Validators } from "@angular/forms"; +import { combineLatest, Subject, takeUntil } from "rxjs"; +import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { Utils } from "@bitwarden/common/misc/utils"; import { Verification } from "@bitwarden/common/types/verification"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { UserVerificationModule } from "../../../../shared/components/user-verification"; +import { SharedModule } from "../../../../shared/shared.module"; + class CountBasedLocalizationKey { singular: string; plural: string; @@ -43,63 +51,90 @@ class OrganizationContentSummary { itemCountByType: OrganizationContentSummaryItem[] = []; } +export interface DeleteOrganizationDialogParams { + organizationId: string; + + requestType: "InvalidFamiliesForEnterprise" | "RegularDelete"; +} + +export enum DeleteOrganizationDialogResult { + Deleted = "deleted", + Canceled = "canceled", +} + @Component({ selector: "app-delete-organization", - templateUrl: "delete-organization.component.html", + standalone: true, + imports: [SharedModule, UserVerificationModule], + templateUrl: "delete-organization-dialog.component.html", }) -export class DeleteOrganizationComponent implements OnInit { - organizationId: string; +export class DeleteOrganizationDialogComponent implements OnInit, OnDestroy { + private destroy$ = new Subject(); + loaded: boolean; deleteOrganizationRequestType: "InvalidFamiliesForEnterprise" | "RegularDelete" = "RegularDelete"; - organizationName: string; + organization: Organization; organizationContentSummary: OrganizationContentSummary = new OrganizationContentSummary(); - @Output() onSuccess: EventEmitter = new EventEmitter(); + secret: Verification; - masterPassword: Verification; + protected formGroup = this.formBuilder.group({ + secret: new FormControl(null, [Validators.required]), + }); formPromise: Promise; constructor( + @Inject(DIALOG_DATA) private params: DeleteOrganizationDialogParams, + private dialogRef: DialogRef, private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private userVerificationService: UserVerificationService, private logService: LogService, private cipherService: CipherService, private organizationService: OrganizationService, - private organizationApiService: OrganizationApiServiceAbstraction + private organizationApiService: OrganizationApiServiceAbstraction, + private formBuilder: FormBuilder ) {} - async ngOnInit(): Promise { - await this.load(); + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); } - async submit() { + async ngOnInit(): Promise { + this.deleteOrganizationRequestType = this.params.requestType; + + combineLatest([ + this.organizationService.get$(this.params.organizationId), + this.cipherService.getAllFromApiForOrganization(this.params.organizationId), + ]) + .pipe(takeUntil(this.destroy$)) + .subscribe(([organization, ciphers]) => { + this.organization = organization; + this.organizationContentSummary = this.buildOrganizationContentSummary(ciphers); + this.loaded = true; + }); + } + + protected submit = async () => { try { this.formPromise = this.userVerificationService - .buildRequest(this.masterPassword) - .then((request) => this.organizationApiService.delete(this.organizationId, request)); + .buildRequest(this.formGroup.value.secret) + .then((request) => this.organizationApiService.delete(this.organization.id, request)); await this.formPromise; this.platformUtilsService.showToast( "success", this.i18nService.t("organizationDeleted"), this.i18nService.t("organizationDeletedDesc") ); - this.onSuccess.emit(); + this.dialogRef.close(DeleteOrganizationDialogResult.Deleted); } catch (e) { this.logService.error(e); } - } + }; - private async load() { - this.organizationName = (await this.organizationService.get(this.organizationId)).name; - this.organizationContentSummary = await this.buildOrganizationContentSummary(); - this.loaded = true; - } - - private async buildOrganizationContentSummary(): Promise { + private buildOrganizationContentSummary(ciphers: CipherView[]): OrganizationContentSummary { const organizationContentSummary = new OrganizationContentSummary(); - const organizationItems = ( - await this.cipherService.getAllFromApiForOrganization(this.organizationId) - ).filter((item) => item.deletedDate == null); + const organizationItems = ciphers.filter((item) => item.deletedDate == null); if (organizationItems.length < 1) { return organizationContentSummary; @@ -129,3 +164,18 @@ export class DeleteOrganizationComponent implements OnInit { return new CountBasedLocalizationKey(`type${type}`, `type${type}Plural`); } } + +/** + * Strongly typed helper to open a Delete Organization dialog + * @param dialogService Instance of the dialog service that will be used to open the dialog + * @param config Configuration for the dialog + */ +export function openDeleteOrganizationDialog( + dialogService: DialogServiceAbstraction, + config: DialogConfig +) { + return dialogService.open( + DeleteOrganizationDialogComponent, + config + ); +} diff --git a/apps/web/src/app/admin-console/organizations/settings/components/index.ts b/apps/web/src/app/admin-console/organizations/settings/components/index.ts new file mode 100644 index 00000000000..ae4b74837da --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/settings/components/index.ts @@ -0,0 +1 @@ +export * from "./delete-organization-dialog.component"; diff --git a/apps/web/src/app/admin-console/organizations/settings/delete-organization.component.html b/apps/web/src/app/admin-console/organizations/settings/delete-organization.component.html deleted file mode 100644 index ef4ec15b7e4..00000000000 --- a/apps/web/src/app/admin-console/organizations/settings/delete-organization.component.html +++ /dev/null @@ -1,61 +0,0 @@ - diff --git a/apps/web/src/app/admin-console/organizations/settings/index.ts b/apps/web/src/app/admin-console/organizations/settings/index.ts index 289bf3d6323..74b356100a6 100644 --- a/apps/web/src/app/admin-console/organizations/settings/index.ts +++ b/apps/web/src/app/admin-console/organizations/settings/index.ts @@ -1,2 +1,2 @@ export * from "./organization-settings.module"; -export { DeleteOrganizationComponent } from "./delete-organization.component"; +export { DeleteOrganizationDialogComponent } from "./components/delete-organization-dialog.component"; diff --git a/apps/web/src/app/admin-console/organizations/settings/organization-settings.module.ts b/apps/web/src/app/admin-console/organizations/settings/organization-settings.module.ts index 0b22c66d1e3..c5500c6a94a 100644 --- a/apps/web/src/app/admin-console/organizations/settings/organization-settings.module.ts +++ b/apps/web/src/app/admin-console/organizations/settings/organization-settings.module.ts @@ -4,18 +4,12 @@ import { LooseComponentsModule, SharedModule } from "../../../shared"; import { PoliciesModule } from "../../organizations/policies"; import { AccountComponent } from "./account.component"; -import { DeleteOrganizationComponent } from "./delete-organization.component"; import { OrganizationSettingsRoutingModule } from "./organization-settings-routing.module"; import { SettingsComponent } from "./settings.component"; import { TwoFactorSetupComponent } from "./two-factor-setup.component"; @NgModule({ imports: [SharedModule, LooseComponentsModule, PoliciesModule, OrganizationSettingsRoutingModule], - declarations: [ - SettingsComponent, - AccountComponent, - DeleteOrganizationComponent, - TwoFactorSetupComponent, - ], + declarations: [SettingsComponent, AccountComponent, TwoFactorSetupComponent], }) export class OrganizationSettingsModule {} diff --git a/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.html b/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.html index 055cdddb38a..34a8f21123c 100644 --- a/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.html +++ b/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.html @@ -50,4 +50,3 @@ - diff --git a/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.ts b/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.ts index 9d632f56c51..1406f080249 100644 --- a/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.ts +++ b/apps/web/src/app/admin-console/organizations/sponsorships/families-for-enterprise-setup.component.ts @@ -1,9 +1,9 @@ -import { Component, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; +import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; -import { Observable, Subject } from "rxjs"; +import { lastValueFrom, Observable, Subject } from "rxjs"; import { first, map, takeUntil } from "rxjs/operators"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; +import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -11,12 +11,15 @@ import { ValidationService } from "@bitwarden/common/abstractions/validation.ser import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { OrganizationSponsorshipRedeemRequest } from "@bitwarden/common/admin-console/models/request/organization/organization-sponsorship-redeem.request"; -import { PlanType, PlanSponsorshipType } from "@bitwarden/common/billing/enums"; +import { PlanSponsorshipType, PlanType } from "@bitwarden/common/billing/enums"; import { ProductType } from "@bitwarden/common/enums"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { OrganizationPlansComponent } from "../../../billing/settings/organization-plans.component"; -import { DeleteOrganizationComponent } from "../../organizations/settings"; +import { + DeleteOrganizationDialogResult, + openDeleteOrganizationDialog, +} from "../settings/components"; @Component({ selector: "families-for-enterprise-setup", @@ -36,9 +39,6 @@ export class FamiliesForEnterpriseSetupComponent implements OnInit, OnDestroy { value.onSuccess.subscribe(this.onOrganizationCreateSuccess.bind(this)); } - @ViewChild("deleteOrganizationTemplate", { read: ViewContainerRef, static: true }) - deleteModalRef: ViewContainerRef; - loading = true; badToken = false; formPromise: Promise; @@ -62,7 +62,7 @@ export class FamiliesForEnterpriseSetupComponent implements OnInit, OnDestroy { private syncService: SyncService, private validationService: ValidationService, private organizationService: OrganizationService, - private modalService: ModalService + private dialogService: DialogServiceAbstraction ) {} async ngOnInit() { @@ -136,18 +136,18 @@ export class FamiliesForEnterpriseSetupComponent implements OnInit, OnDestroy { this.router.navigate(["/"]); } catch (e) { if (this.showNewOrganization) { - await this.modalService.openViewRef( - DeleteOrganizationComponent, - this.deleteModalRef, - (comp) => { - comp.organizationId = organizationId; - comp.deleteOrganizationRequestType = "InvalidFamiliesForEnterprise"; - // eslint-disable-next-line rxjs-angular/prefer-takeuntil - comp.onSuccess.subscribe(() => { - this.router.navigate(["/"]); - }); - } - ); + const dialog = openDeleteOrganizationDialog(this.dialogService, { + data: { + organizationId: organizationId, + requestType: "InvalidFamiliesForEnterprise", + }, + }); + + const result = await lastValueFrom(dialog.closed); + + if (result === DeleteOrganizationDialogResult.Deleted) { + this.router.navigate(["/"]); + } } this.validationService.showError(this.i18nService.t("sponsorshipTokenHasExpired")); } diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts index 6a7ae61aa88..955e9b0da90 100644 --- a/apps/web/src/app/oss-routing.module.ts +++ b/apps/web/src/app/oss-routing.module.ts @@ -9,7 +9,6 @@ import { SubscriptionRoutingModule } from "../app/billing/settings/subscription- import { flagEnabled, Flags } from "../utils/flags"; import { TrialInitiationComponent } from "./accounts/trial-initiation/trial-initiation.component"; -import { OrganizationModule } from "./admin-console/organizations/organization.module"; import { AcceptFamilySponsorshipComponent } from "./admin-console/organizations/sponsorships/accept-family-sponsorship.component"; import { FamiliesForEnterpriseSetupComponent } from "./admin-console/organizations/sponsorships/families-for-enterprise-setup.component"; import { CreateOrganizationComponent } from "./admin-console/settings/create-organization.component"; @@ -249,7 +248,8 @@ const routes: Routes = [ }, { path: "organizations", - loadChildren: () => OrganizationModule, + loadChildren: () => + import("./admin-console/organizations/organization.module").then((m) => m.OrganizationModule), }, ]; diff --git a/apps/web/src/app/shared/components/user-verification/index.ts b/apps/web/src/app/shared/components/user-verification/index.ts new file mode 100644 index 00000000000..9fe21e309cb --- /dev/null +++ b/apps/web/src/app/shared/components/user-verification/index.ts @@ -0,0 +1,3 @@ +export * from "./user-verification.module"; +export * from "./user-verification-prompt.component"; +export * from "./user-verification.component"; diff --git a/apps/web/src/app/components/user-verification-prompt.component.html b/apps/web/src/app/shared/components/user-verification/user-verification-prompt.component.html similarity index 100% rename from apps/web/src/app/components/user-verification-prompt.component.html rename to apps/web/src/app/shared/components/user-verification/user-verification-prompt.component.html diff --git a/apps/web/src/app/components/user-verification-prompt.component.ts b/apps/web/src/app/shared/components/user-verification/user-verification-prompt.component.ts similarity index 100% rename from apps/web/src/app/components/user-verification-prompt.component.ts rename to apps/web/src/app/shared/components/user-verification/user-verification-prompt.component.ts diff --git a/apps/web/src/app/components/user-verification.component.html b/apps/web/src/app/shared/components/user-verification/user-verification.component.html similarity index 100% rename from apps/web/src/app/components/user-verification.component.html rename to apps/web/src/app/shared/components/user-verification/user-verification.component.html diff --git a/apps/web/src/app/components/user-verification.component.ts b/apps/web/src/app/shared/components/user-verification/user-verification.component.ts similarity index 100% rename from apps/web/src/app/components/user-verification.component.ts rename to apps/web/src/app/shared/components/user-verification/user-verification.component.ts diff --git a/apps/web/src/app/shared/components/user-verification/user-verification.module.ts b/apps/web/src/app/shared/components/user-verification/user-verification.module.ts new file mode 100644 index 00000000000..de6b32f7fea --- /dev/null +++ b/apps/web/src/app/shared/components/user-verification/user-verification.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from "@angular/core"; + +import { SharedModule } from "../../shared.module"; + +import { UserVerificationPromptComponent } from "./user-verification-prompt.component"; +import { UserVerificationComponent } from "./user-verification.component"; + +@NgModule({ + imports: [SharedModule], + declarations: [UserVerificationComponent, UserVerificationPromptComponent], + exports: [UserVerificationComponent, UserVerificationPromptComponent], +}) +export class UserVerificationModule {} diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts index a1ba393866a..c9f115a2732 100644 --- a/apps/web/src/app/shared/loose-components.module.ts +++ b/apps/web/src/app/shared/loose-components.module.ts @@ -64,8 +64,6 @@ import { TaxInfoComponent } from "../billing/settings/tax-info.component"; import { UserSubscriptionComponent } from "../billing/settings/user-subscription.component"; import { DynamicAvatarComponent } from "../components/dynamic-avatar.component"; import { SelectableAvatarComponent } from "../components/selectable-avatar.component"; -import { UserVerificationPromptComponent } from "../components/user-verification-prompt.component"; -import { UserVerificationComponent } from "../components/user-verification.component"; import { FooterComponent } from "../layouts/footer.component"; import { FrontendLayoutComponent } from "../layouts/frontend-layout.component"; import { NavbarComponent } from "../layouts/navbar.component"; @@ -110,6 +108,7 @@ import { AddEditComponent as OrgAddEditComponent } from "../vault/org-vault/add- import { AttachmentsComponent as OrgAttachmentsComponent } from "../vault/org-vault/attachments.component"; import { CollectionsComponent as OrgCollectionsComponent } from "../vault/org-vault/collections.component"; +import { UserVerificationModule } from "./components/user-verification"; import { SharedModule } from "./shared.module"; // Please do not add to this list of declarations - we should refactor these into modules when doing so makes sense until there are none left. @@ -120,6 +119,7 @@ import { SharedModule } from "./shared.module"; OrganizationCreateModule, RegisterFormModule, ProductSwitcherModule, + UserVerificationModule, ChangeKdfModule, DynamicAvatarComponent, ], @@ -178,7 +178,6 @@ import { SharedModule } from "./shared.module"; GeneratorComponent, PasswordGeneratorHistoryComponent, PasswordRepromptComponent, - UserVerificationPromptComponent, PaymentComponent, PaymentMethodComponent, PreferencesComponent, @@ -224,7 +223,6 @@ import { SharedModule } from "./shared.module"; BillingHistoryViewComponent, UserLayoutComponent, UserSubscriptionComponent, - UserVerificationComponent, VaultTimeoutInputComponent, VerifyEmailComponent, VerifyEmailTokenComponent, @@ -330,7 +328,6 @@ import { SharedModule } from "./shared.module"; BillingHistoryViewComponent, UserLayoutComponent, UserSubscriptionComponent, - UserVerificationComponent, VaultTimeoutInputComponent, VerifyEmailComponent, VerifyEmailTokenComponent, diff --git a/apps/web/src/app/tools/import-export/export.component.ts b/apps/web/src/app/tools/import-export/export.component.ts index 0b3982dcb7d..a615eed07de 100644 --- a/apps/web/src/app/tools/import-export/export.component.ts +++ b/apps/web/src/app/tools/import-export/export.component.ts @@ -15,7 +15,7 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli import { EncryptedExportType } from "@bitwarden/common/enums"; import { VaultExportServiceAbstraction } from "@bitwarden/exporter/vault-export"; -import { UserVerificationPromptComponent } from "../../components/user-verification-prompt.component"; +import { UserVerificationPromptComponent } from "../../shared/components/user-verification"; @Component({ selector: "app-export", diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts index 2355f3049f0..e6eadd9e927 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts @@ -6,7 +6,7 @@ import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { UserVerificationPromptComponent } from "@bitwarden/web-vault/app/components/user-verification-prompt.component"; +import { UserVerificationPromptComponent } from "@bitwarden/web-vault/app/shared/components/user-verification"; import { AccessTokenView } from "../models/view/access-token.view"; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts index 74d90c52a6c..ee90b4fcb55 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts @@ -9,7 +9,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { UserVerificationPromptComponent } from "@bitwarden/web-vault/app/components/user-verification-prompt.component"; +import { UserVerificationPromptComponent } from "@bitwarden/web-vault/app/shared/components/user-verification"; import { SecretsManagerPortingApiService } from "../services/sm-porting-api.service"; import { SecretsManagerPortingService } from "../services/sm-porting.service"; From b9d3b0aff7b21024784d1bd59ce2df91f56b46f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Thu, 25 May 2023 18:32:26 +0100 Subject: [PATCH 045/299] [PM-2398] Fix firefox extension environments bug (#5514) --- .../src/services/config/config.service.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libs/common/src/services/config/config.service.ts b/libs/common/src/services/config/config.service.ts index f17ded9e6c3..dba5d1ca09c 100644 --- a/libs/common/src/services/config/config.service.ts +++ b/libs/common/src/services/config/config.service.ts @@ -1,4 +1,5 @@ -import { BehaviorSubject, concatMap, from, timer } from "rxjs"; +import { Injectable, OnDestroy } from "@angular/core"; +import { BehaviorSubject, Subject, concatMap, from, takeUntil, timer } from "rxjs"; import { ConfigApiServiceAbstraction } from "../../abstractions/config/config-api.service.abstraction"; import { ConfigServiceAbstraction } from "../../abstractions/config/config.service.abstraction"; @@ -10,9 +11,11 @@ import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { FeatureFlag } from "../../enums/feature-flag.enum"; import { ServerConfigData } from "../../models/data/server-config.data"; -export class ConfigService implements ConfigServiceAbstraction { +@Injectable() +export class ConfigService implements ConfigServiceAbstraction, OnDestroy { protected _serverConfig = new BehaviorSubject(null); serverConfig$ = this._serverConfig.asObservable(); + private destroy$ = new Subject(); constructor( private stateService: StateService, @@ -27,11 +30,14 @@ export class ConfigService implements ConfigServiceAbstraction { this._serverConfig.next(serverConfig); }); - this.environmentService.urls - .pipe(concatMap(() => from(this.fetchServerConfig()))) - .subscribe((serverConfig) => { - this._serverConfig.next(serverConfig); - }); + this.environmentService.urls.pipe(takeUntil(this.destroy$)).subscribe(() => { + this.fetchServerConfig(); + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); } async fetchServerConfig(): Promise { From 0fcfe883b5f7eedf98f4d4295d119dab003a0886 Mon Sep 17 00:00:00 2001 From: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Date: Thu, 25 May 2023 14:17:19 -0400 Subject: [PATCH 046/299] Feature/[PM-1378] - Trusted Device Encryption - Establish trust logic for all clients (#5339) * PM1378 - (1) Create state service methods for securely storing a device symmetric key while following existing pattern of DuckDuckGoKey generation (2) Create makeDeviceKey method on crypto service which leverages the new state service methods for storing the device key. * PM-1378 - Document CSPRNG types w/ comments explaining what they are and when they should be used. * PM-1378 - TODO to add tests for makeDeviceKey method * PM-1378 - Create Devices API service for creating and updating device encrypted master keys + move models according to latest code standards ( I think) * PM-1378 - TODO clean up - DeviceResponse properly moved next to device api service abstraction per ADR 0013 * PM-1378 - CryptoService makeDeviceKey test written * PM-1378 - Tweak crypto service makeDeviceKey test to leverage a describe for the function to better group related code. * PM-1378 - Move known devices call out of API service and into new devices-api.service and update all references. All clients building. * PM-1378 - Comment clean up * PM-1378 - Refactor out master key naming as that is a reserved specific key generated from the MP key derivation process + use same property on request object as back end. * PM-1378 - Missed a use of master key * PM-1378 - More abstraction updates to remove master key. * PM-1378 - Convert crypto service makeDeviceKey into getDeviceKey method to consolidate service logic based on PR feedback * PM-1378- Updating makeDeviceKey --> getDeviceKey tests to match updated code * PM-1378 - Current work on updating establish trusted device logic in light of new encryption mechanisms (introduction of a device asymmetric key pair in order to allow for key rotation while maintaining trusted devices) * PM-1378 - (1) CryptoService.TrustDevice() naming refactors (2) Lots of test additions and tweaks for trustDevice() * PM-1378 - Updated TrustedDeviceKeysRequest names to be consistent across the client side board. * PM-1378 - Move trusted device crypto service methods out of crypto service into new DeviceCryptoService for better single responsibility design * PM-1378 - (1) Add getDeviceByIdentifier endpoint to devices api as will need it later (2) Update TrustedDeviceKeysRequest and DeviceResponse models to match latest server side generic encrypted key names * PM-1378 - PR feedback fix - use JSDOC comments and move from abstraction to implementation * PM-1378 - Per PR feedback, makeDeviceKey should be private - updated tests with workaround. * PM-1378- Per PR feedback, refactored deviceKey to use partialKey dict so we can associate userId with specific device keys. * PM-1378 - Replace deviceId with deviceIdentifier per PR feedback * PM-1378 - Remove unnecessary createTrustedDeviceKey methods * PM-1378 - Update device crypto service to leverage updateTrustedDeviceKeys + update tests * PM-1378 - Update trustDevice logic - (1) Use getEncKey to get user symmetric key as it's the correct method and (2) Attempt to retrieve the userSymKey earlier on and short circuit if it is not found. * PM-1378 - Replace deviceId with deviceIdentifier because they are not the same thing * PM-1378 - Per PR feedback, (1) on web/browser extension, store device key in local storage under account.keys existing structure (2) on desktop, store deviceKey in secure storage. (3) Exempt account.keys.deviceKey from being cleared on account reset * PM-1378 - Desktop testing revealed that I forgot to add userId existence and options reconciliation checks back * PM-1378 - Per discussion with Jake, create DeviceKey custom type which is really just an opaque so we can more easily differentiate between key types. * PM-1378 - Update symmetric-crypto-key.ts opaque DeviceKey to properly setup Opaque type. * PM-1378 - Fix wrong return type for getDeviceKey on DeviceCryptoServiceAbstraction per PR feedback --- .../browser/src/auth/popup/login.component.ts | 6 +- .../desktop/src/auth/login/login.component.ts | 6 +- .../src/services/electron-state.service.ts | 32 ++ .../web/src/app/auth/login/login.component.ts | 6 +- .../src/auth/components/login.component.ts | 6 +- .../src/services/jslib-services.module.ts | 23 ++ libs/common/src/abstractions/api.service.ts | 1 - .../device-crypto.service.abstraction.ts | 8 + .../devices-api.service.abstraction.ts | 14 + .../devices/responses}/device.response.ts | 6 + libs/common/src/abstractions/state.service.ts | 4 +- libs/common/src/models/domain/account.ts | 3 +- .../src/models/domain/symmetric-crypto-key.ts | 5 +- libs/common/src/services/api.service.ts | 8 - .../device-crypto.service.implementation.ts | 85 +++++ .../services/device-crypto.service.spec.ts | 317 ++++++++++++++++++ .../devices-api.service.implementation.ts | 64 ++++ .../requests/trusted-device-keys.request.ts | 7 + libs/common/src/services/state.service.ts | 35 +- libs/common/src/types/csprng.d.ts | 4 + 20 files changed, 613 insertions(+), 27 deletions(-) create mode 100644 libs/common/src/abstractions/device-crypto.service.abstraction.ts create mode 100644 libs/common/src/abstractions/devices/devices-api.service.abstraction.ts rename libs/common/src/{auth/models/response => abstractions/devices/responses}/device.response.ts (65%) create mode 100644 libs/common/src/services/device-crypto.service.implementation.ts create mode 100644 libs/common/src/services/device-crypto.service.spec.ts create mode 100644 libs/common/src/services/devices/devices-api.service.implementation.ts create mode 100644 libs/common/src/services/devices/requests/trusted-device-keys.request.ts diff --git a/apps/browser/src/auth/popup/login.component.ts b/apps/browser/src/auth/popup/login.component.ts index cc48a75e4e9..0652070a4da 100644 --- a/apps/browser/src/auth/popup/login.component.ts +++ b/apps/browser/src/auth/popup/login.component.ts @@ -3,9 +3,9 @@ import { FormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AppIdService } from "@bitwarden/common/abstractions/appId.service"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { FormValidationErrorsService } from "@bitwarden/common/abstractions/formValidationErrors.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -27,7 +27,7 @@ import { flagEnabled } from "../../flags"; export class LoginComponent extends BaseLoginComponent { showPasswordless = false; constructor( - apiService: ApiService, + devicesApiService: DevicesApiServiceAbstraction, appIdService: AppIdService, authService: AuthService, router: Router, @@ -46,7 +46,7 @@ export class LoginComponent extends BaseLoginComponent { loginService: LoginService ) { super( - apiService, + devicesApiService, appIdService, authService, router, diff --git a/apps/desktop/src/auth/login/login.component.ts b/apps/desktop/src/auth/login/login.component.ts index efe09efe738..bd7ff1e73b2 100644 --- a/apps/desktop/src/auth/login/login.component.ts +++ b/apps/desktop/src/auth/login/login.component.ts @@ -6,10 +6,10 @@ import { Subject, takeUntil } from "rxjs"; import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component"; import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AppIdService } from "@bitwarden/common/abstractions/appId.service"; import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { FormValidationErrorsService } from "@bitwarden/common/abstractions/formValidationErrors.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -52,7 +52,7 @@ export class LoginComponent extends BaseLoginComponent implements OnDestroy { } constructor( - apiService: ApiService, + devicesApiService: DevicesApiServiceAbstraction, appIdService: AppIdService, authService: AuthService, router: Router, @@ -74,7 +74,7 @@ export class LoginComponent extends BaseLoginComponent implements OnDestroy { loginService: LoginService ) { super( - apiService, + devicesApiService, appIdService, authService, router, diff --git a/apps/desktop/src/services/electron-state.service.ts b/apps/desktop/src/services/electron-state.service.ts index b290866dd0b..137302c8019 100644 --- a/apps/desktop/src/services/electron-state.service.ts +++ b/apps/desktop/src/services/electron-state.service.ts @@ -1,6 +1,11 @@ +import { Utils } from "@bitwarden/common/misc/utils"; import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { StorageOptions } from "@bitwarden/common/models/domain/storage-options"; +import { + DeviceKey, + SymmetricCryptoKey, +} from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { StateService as BaseStateService } from "@bitwarden/common/services/state.service"; import { Account } from "../models/account"; @@ -11,6 +16,10 @@ export class ElectronStateService extends BaseStateService implements ElectronStateServiceAbstraction { + private partialKeys = { + deviceKey: "_deviceKey", + }; + async addAccount(account: Account) { // Apply desktop overides to default account values account = new Account(account); @@ -77,4 +86,27 @@ export class ElectronStateService this.reconcileOptions(options, await this.defaultOnDiskOptions()) ); } + + override async getDeviceKey(options?: StorageOptions): Promise { + options = this.reconcileOptions(options, await this.defaultSecureStorageOptions()); + if (options?.userId == null) { + return; + } + + const b64DeviceKey = await this.secureStorageService.get( + `${options.userId}${this.partialKeys.deviceKey}`, + options + ); + + return new SymmetricCryptoKey(Utils.fromB64ToArray(b64DeviceKey).buffer) as DeviceKey; + } + + override async setDeviceKey(value: DeviceKey, options?: StorageOptions): Promise { + options = this.reconcileOptions(options, await this.defaultSecureStorageOptions()); + if (options?.userId == null) { + return; + } + + await this.saveSecureStorageKey(this.partialKeys.deviceKey, value.keyB64, options); + } } diff --git a/apps/web/src/app/auth/login/login.component.ts b/apps/web/src/app/auth/login/login.component.ts index 54f9bd36460..fa5a96cc37f 100644 --- a/apps/web/src/app/auth/login/login.component.ts +++ b/apps/web/src/app/auth/login/login.component.ts @@ -5,9 +5,9 @@ import { Subject, takeUntil } from "rxjs"; import { first } from "rxjs/operators"; import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AppIdService } from "@bitwarden/common/abstractions/appId.service"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { FormValidationErrorsService } from "@bitwarden/common/abstractions/formValidationErrors.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -41,7 +41,7 @@ export class LoginComponent extends BaseLoginComponent implements OnInit, OnDest private destroy$ = new Subject(); constructor( - apiService: ApiService, + devicesApiService: DevicesApiServiceAbstraction, appIdService: AppIdService, authService: AuthService, router: Router, @@ -63,7 +63,7 @@ export class LoginComponent extends BaseLoginComponent implements OnInit, OnDest loginService: LoginService ) { super( - apiService, + devicesApiService, appIdService, authService, router, diff --git a/libs/angular/src/auth/components/login.component.ts b/libs/angular/src/auth/components/login.component.ts index 0d7c594e695..e882d938946 100644 --- a/libs/angular/src/auth/components/login.component.ts +++ b/libs/angular/src/auth/components/login.component.ts @@ -3,9 +3,9 @@ import { FormBuilder, Validators } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { take } from "rxjs/operators"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AppIdService } from "@bitwarden/common/abstractions/appId.service"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { AllValidationErrors, @@ -55,7 +55,7 @@ export class LoginComponent extends CaptchaProtectedComponent implements OnInit } constructor( - protected apiService: ApiService, + protected devicesApiService: DevicesApiServiceAbstraction, protected appIdService: AppIdService, protected authService: AuthService, protected router: Router, @@ -295,7 +295,7 @@ export class LoginComponent extends CaptchaProtectedComponent implements OnInit async getLoginWithDevice(email: string) { try { const deviceIdentifier = await this.appIdService.getAppId(); - const res = await this.apiService.getKnownDevice(email, deviceIdentifier); + const res = await this.devicesApiService.getKnownDevice(email, deviceIdentifier); //ensure the application is not self-hosted this.showLoginWithDevice = res && !this.selfHosted; } catch (e) { diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 7cf75712a00..7ae54c92133 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -10,6 +10,8 @@ import { ConfigApiServiceAbstraction } from "@bitwarden/common/abstractions/conf import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction"; import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service"; import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/abstractions/cryptoFunction.service"; +import { DeviceCryptoServiceAbstraction } from "@bitwarden/common/abstractions/device-crypto.service.abstraction"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service"; import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/abstractions/environment.service"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; @@ -90,6 +92,8 @@ import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service import { CryptoService } from "@bitwarden/common/services/crypto.service"; import { EncryptServiceImplementation } from "@bitwarden/common/services/cryptography/encrypt.service.implementation"; import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/services/cryptography/multithread-encrypt.service.implementation"; +import { DeviceCryptoService } from "@bitwarden/common/services/device-crypto.service.implementation"; +import { DevicesApiServiceImplementation } from "@bitwarden/common/services/devices/devices-api.service.implementation"; import { EnvironmentService } from "@bitwarden/common/services/environment.service"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; @@ -351,6 +355,8 @@ import { AbstractThemingService } from "./theming/theming.service.abstraction"; PlatformUtilsServiceAbstraction, LogService, StateServiceAbstraction, + AppIdServiceAbstraction, + DevicesApiServiceAbstraction, ], }, { @@ -656,6 +662,23 @@ import { AbstractThemingService } from "./theming/theming.service.abstraction"; useClass: OrgDomainApiService, deps: [OrgDomainServiceAbstraction, ApiServiceAbstraction], }, + { + provide: DevicesApiServiceAbstraction, + useClass: DevicesApiServiceImplementation, + deps: [ApiServiceAbstraction], + }, + { + provide: DeviceCryptoServiceAbstraction, + useClass: DeviceCryptoService, + deps: [ + CryptoFunctionServiceAbstraction, + CryptoServiceAbstraction, + EncryptService, + StateServiceAbstraction, + AppIdServiceAbstraction, + DevicesApiServiceAbstraction, + ], + }, ], }) export class JslibServicesModule {} diff --git a/libs/common/src/abstractions/api.service.ts b/libs/common/src/abstractions/api.service.ts index 5670a5dc369..2273b290191 100644 --- a/libs/common/src/abstractions/api.service.ts +++ b/libs/common/src/abstractions/api.service.ts @@ -361,7 +361,6 @@ export abstract class ApiService { putDeviceVerificationSettings: ( request: DeviceVerificationRequest ) => Promise; - getKnownDevice: (email: string, deviceIdentifier: string) => Promise; getEmergencyAccessTrusted: () => Promise>; getEmergencyAccessGranted: () => Promise>; diff --git a/libs/common/src/abstractions/device-crypto.service.abstraction.ts b/libs/common/src/abstractions/device-crypto.service.abstraction.ts new file mode 100644 index 00000000000..23b3be967f5 --- /dev/null +++ b/libs/common/src/abstractions/device-crypto.service.abstraction.ts @@ -0,0 +1,8 @@ +import { DeviceKey } from "../models/domain/symmetric-crypto-key"; + +import { DeviceResponse } from "./devices/responses/device.response"; + +export abstract class DeviceCryptoServiceAbstraction { + trustDevice: () => Promise; + getDeviceKey: () => Promise; +} diff --git a/libs/common/src/abstractions/devices/devices-api.service.abstraction.ts b/libs/common/src/abstractions/devices/devices-api.service.abstraction.ts new file mode 100644 index 00000000000..345b728977e --- /dev/null +++ b/libs/common/src/abstractions/devices/devices-api.service.abstraction.ts @@ -0,0 +1,14 @@ +import { DeviceResponse } from "./responses/device.response"; + +export abstract class DevicesApiServiceAbstraction { + getKnownDevice: (email: string, deviceIdentifier: string) => Promise; + + getDeviceByIdentifier: (deviceIdentifier: string) => Promise; + + updateTrustedDeviceKeys: ( + deviceIdentifier: string, + devicePublicKeyEncryptedUserSymKey: string, + userSymKeyEncryptedDevicePublicKey: string, + deviceKeyEncryptedDevicePrivateKey: string + ) => Promise; +} diff --git a/libs/common/src/auth/models/response/device.response.ts b/libs/common/src/abstractions/devices/responses/device.response.ts similarity index 65% rename from libs/common/src/auth/models/response/device.response.ts rename to libs/common/src/abstractions/devices/responses/device.response.ts index 2770499e81e..331df2e16cd 100644 --- a/libs/common/src/auth/models/response/device.response.ts +++ b/libs/common/src/abstractions/devices/responses/device.response.ts @@ -7,6 +7,9 @@ export class DeviceResponse extends BaseResponse { identifier: string; type: DeviceType; creationDate: string; + encryptedUserKey: string; + encryptedPublicKey: string; + encryptedPrivateKey: string; constructor(response: any) { super(response); @@ -15,5 +18,8 @@ export class DeviceResponse extends BaseResponse { this.identifier = this.getResponseProperty("Identifier"); this.type = this.getResponseProperty("Type"); this.creationDate = this.getResponseProperty("CreationDate"); + this.encryptedUserKey = this.getResponseProperty("EncryptedUserKey"); + this.encryptedPublicKey = this.getResponseProperty("EncryptedPublicKey"); + this.encryptedPrivateKey = this.getResponseProperty("EncryptedPrivateKey"); } } diff --git a/libs/common/src/abstractions/state.service.ts b/libs/common/src/abstractions/state.service.ts index ac5bb705969..04cfb609fed 100644 --- a/libs/common/src/abstractions/state.service.ts +++ b/libs/common/src/abstractions/state.service.ts @@ -17,7 +17,7 @@ import { ServerConfigData } from "../models/data/server-config.data"; import { Account, AccountSettingsSettings } from "../models/domain/account"; import { EncString } from "../models/domain/enc-string"; import { StorageOptions } from "../models/domain/storage-options"; -import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; +import { DeviceKey, SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; import { WindowState } from "../models/domain/window-state"; import { GeneratedPasswordHistory } from "../tools/generator/password"; import { SendData } from "../tools/send/models/data/send.data"; @@ -163,6 +163,8 @@ export abstract class StateService { setDontShowIdentitiesCurrentTab: (value: boolean, options?: StorageOptions) => Promise; getDuckDuckGoSharedKey: (options?: StorageOptions) => Promise; setDuckDuckGoSharedKey: (value: string, options?: StorageOptions) => Promise; + getDeviceKey: (options?: StorageOptions) => Promise; + setDeviceKey: (value: DeviceKey, options?: StorageOptions) => Promise; getEmail: (options?: StorageOptions) => Promise; setEmail: (value: string, options?: StorageOptions) => Promise; getEmailVerified: (options?: StorageOptions) => Promise; diff --git a/libs/common/src/models/domain/account.ts b/libs/common/src/models/domain/account.ts index a7988d41d79..db98a17b42c 100644 --- a/libs/common/src/models/domain/account.ts +++ b/libs/common/src/models/domain/account.ts @@ -23,7 +23,7 @@ import { EventData } from "../data/event.data"; import { ServerConfigData } from "../data/server-config.data"; import { EncString } from "./enc-string"; -import { SymmetricCryptoKey } from "./symmetric-crypto-key"; +import { DeviceKey, SymmetricCryptoKey } from "./symmetric-crypto-key"; export class EncryptionPair { encrypted?: TEncrypted; @@ -107,6 +107,7 @@ export class AccountKeys { string, SymmetricCryptoKey >(); + deviceKey?: DeviceKey; organizationKeys?: EncryptionPair< { [orgId: string]: EncryptedOrganizationKeyData }, Record diff --git a/libs/common/src/models/domain/symmetric-crypto-key.ts b/libs/common/src/models/domain/symmetric-crypto-key.ts index 3bd329dd21b..8c9920d1319 100644 --- a/libs/common/src/models/domain/symmetric-crypto-key.ts +++ b/libs/common/src/models/domain/symmetric-crypto-key.ts @@ -1,4 +1,4 @@ -import { Jsonify } from "type-fest"; +import { Jsonify, Opaque } from "type-fest"; import { EncryptionType } from "../../enums"; import { Utils } from "../../misc/utils"; @@ -75,3 +75,6 @@ export class SymmetricCryptoKey { return SymmetricCryptoKey.fromString(obj?.keyB64); } } + +// Setup all separate key types as opaque types +export type DeviceKey = Opaque; diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index e02bfb743fe..59e3755a04f 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -1110,14 +1110,6 @@ export class ApiService implements ApiServiceAbstraction { return new DeviceVerificationResponse(r); } - async getKnownDevice(email: string, deviceIdentifier: string): Promise { - const r = await this.send("GET", "/devices/knowndevice", null, false, true, null, (headers) => { - headers.set("X-Device-Identifier", deviceIdentifier); - headers.set("X-Request-Email", Utils.fromUtf8ToUrlB64(email)); - }); - return r as boolean; - } - // Emergency Access APIs async getEmergencyAccessTrusted(): Promise> { diff --git a/libs/common/src/services/device-crypto.service.implementation.ts b/libs/common/src/services/device-crypto.service.implementation.ts new file mode 100644 index 00000000000..ba50e300b42 --- /dev/null +++ b/libs/common/src/services/device-crypto.service.implementation.ts @@ -0,0 +1,85 @@ +import { AppIdService } from "../abstractions/appId.service"; +import { CryptoService } from "../abstractions/crypto.service"; +import { CryptoFunctionService } from "../abstractions/cryptoFunction.service"; +import { DeviceCryptoServiceAbstraction } from "../abstractions/device-crypto.service.abstraction"; +import { DevicesApiServiceAbstraction } from "../abstractions/devices/devices-api.service.abstraction"; +import { DeviceResponse } from "../abstractions/devices/responses/device.response"; +import { EncryptService } from "../abstractions/encrypt.service"; +import { StateService } from "../abstractions/state.service"; +import { DeviceKey, SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; +import { CsprngArray } from "../types/csprng"; + +export class DeviceCryptoService implements DeviceCryptoServiceAbstraction { + constructor( + protected cryptoFunctionService: CryptoFunctionService, + protected cryptoService: CryptoService, + protected encryptService: EncryptService, + protected stateService: StateService, + protected appIdService: AppIdService, + protected devicesApiService: DevicesApiServiceAbstraction + ) {} + + async trustDevice(): Promise { + // Attempt to get user symmetric key + const userSymKey: SymmetricCryptoKey = await this.cryptoService.getEncKey(); + + // If user symmetric key is not found, throw error + if (!userSymKey) { + throw new Error("User symmetric key not found"); + } + + // Generate deviceKey + const deviceKey = await this.makeDeviceKey(); + + // Generate asymmetric RSA key pair: devicePrivateKey, devicePublicKey + const [devicePublicKey, devicePrivateKey] = await this.cryptoFunctionService.rsaGenerateKeyPair( + 2048 + ); + + const [ + devicePublicKeyEncryptedUserSymKey, + userSymKeyEncryptedDevicePublicKey, + deviceKeyEncryptedDevicePrivateKey, + ] = await Promise.all([ + // Encrypt user symmetric key with the DevicePublicKey + this.cryptoService.rsaEncrypt(userSymKey.encKey, devicePublicKey), + + // Encrypt devicePublicKey with user symmetric key + this.encryptService.encrypt(devicePublicKey, userSymKey), + + // Encrypt devicePrivateKey with deviceKey + this.encryptService.encrypt(devicePrivateKey, deviceKey), + ]); + + // Send encrypted keys to server + const deviceIdentifier = await this.appIdService.getAppId(); + return this.devicesApiService.updateTrustedDeviceKeys( + deviceIdentifier, + devicePublicKeyEncryptedUserSymKey.encryptedString, + userSymKeyEncryptedDevicePublicKey.encryptedString, + deviceKeyEncryptedDevicePrivateKey.encryptedString + ); + } + + async getDeviceKey(): Promise { + // Check if device key is already stored + const existingDeviceKey = await this.stateService.getDeviceKey(); + + if (existingDeviceKey != null) { + return existingDeviceKey; + } else { + return this.makeDeviceKey(); + } + } + + private async makeDeviceKey(): Promise { + // Create 512-bit device key + const randomBytes: CsprngArray = await this.cryptoFunctionService.randomBytes(64); + const deviceKey = new SymmetricCryptoKey(randomBytes) as DeviceKey; + + // Save device key in secure storage + await this.stateService.setDeviceKey(deviceKey); + + return deviceKey; + } +} diff --git a/libs/common/src/services/device-crypto.service.spec.ts b/libs/common/src/services/device-crypto.service.spec.ts new file mode 100644 index 00000000000..7e14961cc2c --- /dev/null +++ b/libs/common/src/services/device-crypto.service.spec.ts @@ -0,0 +1,317 @@ +import { mock, mockReset } from "jest-mock-extended"; + +import { AppIdService } from "../abstractions/appId.service"; +import { CryptoFunctionService } from "../abstractions/cryptoFunction.service"; +import { DevicesApiServiceAbstraction } from "../abstractions/devices/devices-api.service.abstraction"; +import { DeviceResponse } from "../abstractions/devices/responses/device.response"; +import { EncryptService } from "../abstractions/encrypt.service"; +import { StateService } from "../abstractions/state.service"; +import { EncryptionType } from "../enums/encryption-type.enum"; +import { EncString } from "../models/domain/enc-string"; +import { DeviceKey, SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; +import { CryptoService } from "../services/crypto.service"; +import { CsprngArray } from "../types/csprng"; + +import { DeviceCryptoService } from "./device-crypto.service.implementation"; + +describe("deviceCryptoService", () => { + let deviceCryptoService: DeviceCryptoService; + + const cryptoFunctionService = mock(); + const cryptoService = mock(); + const encryptService = mock(); + const stateService = mock(); + const appIdService = mock(); + const devicesApiService = mock(); + + beforeEach(() => { + mockReset(cryptoFunctionService); + mockReset(encryptService); + mockReset(stateService); + mockReset(appIdService); + mockReset(devicesApiService); + + deviceCryptoService = new DeviceCryptoService( + cryptoFunctionService, + cryptoService, + encryptService, + stateService, + appIdService, + devicesApiService + ); + }); + + it("instantiates", () => { + expect(deviceCryptoService).not.toBeFalsy(); + }); + + describe("Trusted Device Encryption", () => { + const deviceKeyBytesLength = 64; + const userSymKeyBytesLength = 64; + + describe("getDeviceKey", () => { + let mockRandomBytes: CsprngArray; + let mockDeviceKey: SymmetricCryptoKey; + let existingDeviceKey: DeviceKey; + let stateSvcGetDeviceKeySpy: jest.SpyInstance; + let makeDeviceKeySpy: jest.SpyInstance; + + beforeEach(() => { + mockRandomBytes = new Uint8Array(deviceKeyBytesLength).buffer as CsprngArray; + mockDeviceKey = new SymmetricCryptoKey(mockRandomBytes); + existingDeviceKey = new SymmetricCryptoKey( + new Uint8Array(deviceKeyBytesLength).buffer as CsprngArray + ) as DeviceKey; + + stateSvcGetDeviceKeySpy = jest.spyOn(stateService, "getDeviceKey"); + makeDeviceKeySpy = jest.spyOn(deviceCryptoService as any, "makeDeviceKey"); + }); + + it("gets a device key when there is not an existing device key", async () => { + stateSvcGetDeviceKeySpy.mockResolvedValue(null); + makeDeviceKeySpy.mockResolvedValue(mockDeviceKey); + + const deviceKey = await deviceCryptoService.getDeviceKey(); + + expect(stateSvcGetDeviceKeySpy).toHaveBeenCalledTimes(1); + expect(makeDeviceKeySpy).toHaveBeenCalledTimes(1); + + expect(deviceKey).not.toBeNull(); + expect(deviceKey).toBeInstanceOf(SymmetricCryptoKey); + expect(deviceKey).toEqual(mockDeviceKey); + }); + + it("returns the existing device key without creating a new one when there is an existing device key", async () => { + stateSvcGetDeviceKeySpy.mockResolvedValue(existingDeviceKey); + + const deviceKey = await deviceCryptoService.getDeviceKey(); + + expect(stateSvcGetDeviceKeySpy).toHaveBeenCalledTimes(1); + expect(makeDeviceKeySpy).not.toHaveBeenCalled(); + + expect(deviceKey).not.toBeNull(); + expect(deviceKey).toBeInstanceOf(SymmetricCryptoKey); + expect(deviceKey).toEqual(existingDeviceKey); + }); + }); + + describe("makeDeviceKey", () => { + it("creates a new non-null 64 byte device key, securely stores it, and returns it", async () => { + const mockRandomBytes = new Uint8Array(deviceKeyBytesLength).buffer as CsprngArray; + + const cryptoFuncSvcRandomBytesSpy = jest + .spyOn(cryptoFunctionService, "randomBytes") + .mockResolvedValue(mockRandomBytes); + + const stateSvcSetDeviceKeySpy = jest.spyOn(stateService, "setDeviceKey"); + + // TypeScript will allow calling private methods if the object is of type 'any' + // This is a hacky workaround, but it allows for cleaner tests + const deviceKey = await (deviceCryptoService as any).makeDeviceKey(); + + expect(cryptoFuncSvcRandomBytesSpy).toHaveBeenCalledTimes(1); + expect(cryptoFuncSvcRandomBytesSpy).toHaveBeenCalledWith(deviceKeyBytesLength); + + expect(deviceKey).not.toBeNull(); + expect(deviceKey).toBeInstanceOf(SymmetricCryptoKey); + + expect(stateSvcSetDeviceKeySpy).toHaveBeenCalledTimes(1); + expect(stateSvcSetDeviceKeySpy).toHaveBeenCalledWith(deviceKey); + }); + }); + + describe("trustDevice", () => { + let mockDeviceKeyRandomBytes: CsprngArray; + let mockDeviceKey: DeviceKey; + + let mockUserSymKeyRandomBytes: CsprngArray; + let mockUserSymKey: SymmetricCryptoKey; + + const deviceRsaKeyLength = 2048; + let mockDeviceRsaKeyPair: [ArrayBuffer, ArrayBuffer]; + let mockDevicePrivateKey: ArrayBuffer; + let mockDevicePublicKey: ArrayBuffer; + let mockDevicePublicKeyEncryptedUserSymKey: EncString; + let mockUserSymKeyEncryptedDevicePublicKey: EncString; + let mockDeviceKeyEncryptedDevicePrivateKey: EncString; + + const mockDeviceResponse: DeviceResponse = new DeviceResponse({ + Id: "mockId", + Name: "mockName", + Identifier: "mockIdentifier", + Type: "mockType", + CreationDate: "mockCreationDate", + }); + + const mockDeviceId = "mockDeviceId"; + + let makeDeviceKeySpy: jest.SpyInstance; + let rsaGenerateKeyPairSpy: jest.SpyInstance; + let cryptoSvcGetEncKeySpy: jest.SpyInstance; + let cryptoSvcRsaEncryptSpy: jest.SpyInstance; + let encryptServiceEncryptSpy: jest.SpyInstance; + let appIdServiceGetAppIdSpy: jest.SpyInstance; + let devicesApiServiceUpdateTrustedDeviceKeysSpy: jest.SpyInstance; + + beforeEach(() => { + // Setup all spies and default return values for the happy path + + mockDeviceKeyRandomBytes = new Uint8Array(deviceKeyBytesLength).buffer as CsprngArray; + mockDeviceKey = new SymmetricCryptoKey(mockDeviceKeyRandomBytes) as DeviceKey; + + mockUserSymKeyRandomBytes = new Uint8Array(userSymKeyBytesLength).buffer as CsprngArray; + mockUserSymKey = new SymmetricCryptoKey(mockUserSymKeyRandomBytes); + + mockDeviceRsaKeyPair = [ + new ArrayBuffer(deviceRsaKeyLength), + new ArrayBuffer(deviceRsaKeyLength), + ]; + + mockDevicePublicKey = mockDeviceRsaKeyPair[0]; + mockDevicePrivateKey = mockDeviceRsaKeyPair[1]; + + mockDevicePublicKeyEncryptedUserSymKey = new EncString( + EncryptionType.Rsa2048_OaepSha1_B64, + "mockDevicePublicKeyEncryptedUserSymKey" + ); + + mockUserSymKeyEncryptedDevicePublicKey = new EncString( + EncryptionType.AesCbc256_HmacSha256_B64, + "mockUserSymKeyEncryptedDevicePublicKey" + ); + + mockDeviceKeyEncryptedDevicePrivateKey = new EncString( + EncryptionType.AesCbc256_HmacSha256_B64, + "mockDeviceKeyEncryptedDevicePrivateKey" + ); + + // TypeScript will allow calling private methods if the object is of type 'any' + makeDeviceKeySpy = jest + .spyOn(deviceCryptoService as any, "makeDeviceKey") + .mockResolvedValue(mockDeviceKey); + + rsaGenerateKeyPairSpy = jest + .spyOn(cryptoFunctionService, "rsaGenerateKeyPair") + .mockResolvedValue(mockDeviceRsaKeyPair); + + cryptoSvcGetEncKeySpy = jest + .spyOn(cryptoService, "getEncKey") + .mockResolvedValue(mockUserSymKey); + + cryptoSvcRsaEncryptSpy = jest + .spyOn(cryptoService, "rsaEncrypt") + .mockResolvedValue(mockDevicePublicKeyEncryptedUserSymKey); + + encryptServiceEncryptSpy = jest + .spyOn(encryptService, "encrypt") + .mockImplementation((plainValue, key) => { + if (plainValue === mockDevicePublicKey && key === mockUserSymKey) { + return Promise.resolve(mockUserSymKeyEncryptedDevicePublicKey); + } + if (plainValue === mockDevicePrivateKey && key === mockDeviceKey) { + return Promise.resolve(mockDeviceKeyEncryptedDevicePrivateKey); + } + }); + + appIdServiceGetAppIdSpy = jest + .spyOn(appIdService, "getAppId") + .mockResolvedValue(mockDeviceId); + + devicesApiServiceUpdateTrustedDeviceKeysSpy = jest + .spyOn(devicesApiService, "updateTrustedDeviceKeys") + .mockResolvedValue(mockDeviceResponse); + }); + + it("calls the required methods with the correct arguments and returns a DeviceResponse", async () => { + const response = await deviceCryptoService.trustDevice(); + + expect(makeDeviceKeySpy).toHaveBeenCalledTimes(1); + expect(rsaGenerateKeyPairSpy).toHaveBeenCalledTimes(1); + expect(cryptoSvcGetEncKeySpy).toHaveBeenCalledTimes(1); + + expect(cryptoSvcRsaEncryptSpy).toHaveBeenCalledTimes(1); + expect(encryptServiceEncryptSpy).toHaveBeenCalledTimes(2); + + expect(appIdServiceGetAppIdSpy).toHaveBeenCalledTimes(1); + expect(devicesApiServiceUpdateTrustedDeviceKeysSpy).toHaveBeenCalledTimes(1); + expect(devicesApiServiceUpdateTrustedDeviceKeysSpy).toHaveBeenCalledWith( + mockDeviceId, + mockDevicePublicKeyEncryptedUserSymKey.encryptedString, + mockUserSymKeyEncryptedDevicePublicKey.encryptedString, + mockDeviceKeyEncryptedDevicePrivateKey.encryptedString + ); + + expect(response).toBeInstanceOf(DeviceResponse); + expect(response).toEqual(mockDeviceResponse); + }); + + it("throws specific error if user symmetric key is not found", async () => { + // setup the spy to return null + cryptoSvcGetEncKeySpy.mockResolvedValue(null); + // check if the expected error is thrown + await expect(deviceCryptoService.trustDevice()).rejects.toThrow( + "User symmetric key not found" + ); + + // reset the spy + cryptoSvcGetEncKeySpy.mockReset(); + + // setup the spy to return undefined + cryptoSvcGetEncKeySpy.mockResolvedValue(undefined); + // check if the expected error is thrown + await expect(deviceCryptoService.trustDevice()).rejects.toThrow( + "User symmetric key not found" + ); + }); + + const methodsToTestForErrorsOrInvalidReturns = [ + { + method: "makeDeviceKey", + spy: () => makeDeviceKeySpy, + errorText: "makeDeviceKey error", + }, + { + method: "rsaGenerateKeyPair", + spy: () => rsaGenerateKeyPairSpy, + errorText: "rsaGenerateKeyPair error", + }, + { + method: "getEncKey", + spy: () => cryptoSvcGetEncKeySpy, + errorText: "getEncKey error", + }, + { + method: "rsaEncrypt", + spy: () => cryptoSvcRsaEncryptSpy, + errorText: "rsaEncrypt error", + }, + { + method: "encryptService.encrypt", + spy: () => encryptServiceEncryptSpy, + errorText: "encryptService.encrypt error", + }, + ]; + + describe.each(methodsToTestForErrorsOrInvalidReturns)( + "trustDevice error handling and invalid return testing", + ({ method, spy, errorText }) => { + // ensures that error propagation works correctly + it(`throws an error if ${method} fails`, async () => { + const methodSpy = spy(); + methodSpy.mockRejectedValue(new Error(errorText)); + await expect(deviceCryptoService.trustDevice()).rejects.toThrow(errorText); + }); + + test.each([null, undefined])( + `throws an error if ${method} returns %s`, + async (invalidValue) => { + const methodSpy = spy(); + methodSpy.mockResolvedValue(invalidValue); + await expect(deviceCryptoService.trustDevice()).rejects.toThrow(); + } + ); + } + ); + }); + }); +}); diff --git a/libs/common/src/services/devices/devices-api.service.implementation.ts b/libs/common/src/services/devices/devices-api.service.implementation.ts new file mode 100644 index 00000000000..aa0d0f0c297 --- /dev/null +++ b/libs/common/src/services/devices/devices-api.service.implementation.ts @@ -0,0 +1,64 @@ +import { DevicesApiServiceAbstraction } from "../../abstractions/devices/devices-api.service.abstraction"; +import { DeviceResponse } from "../../abstractions/devices/responses/device.response"; +import { Utils } from "../../misc/utils"; +import { ApiService } from "../api.service"; + +import { TrustedDeviceKeysRequest } from "./requests/trusted-device-keys.request"; + +export class DevicesApiServiceImplementation implements DevicesApiServiceAbstraction { + constructor(private apiService: ApiService) {} + + async getKnownDevice(email: string, deviceIdentifier: string): Promise { + const r = await this.apiService.send( + "GET", + "/devices/knowndevice", + null, + false, + true, + null, + (headers) => { + headers.set("X-Device-Identifier", deviceIdentifier); + headers.set("X-Request-Email", Utils.fromUtf8ToUrlB64(email)); + } + ); + return r as boolean; + } + + /** + * Get device by identifier + * @param deviceIdentifier - client generated id (not device id in DB) + */ + async getDeviceByIdentifier(deviceIdentifier: string): Promise { + const r = await this.apiService.send( + "GET", + `/devices/identifier/${deviceIdentifier}`, + null, + true, + true + ); + return new DeviceResponse(r); + } + + async updateTrustedDeviceKeys( + deviceIdentifier: string, + devicePublicKeyEncryptedUserSymKey: string, + userSymKeyEncryptedDevicePublicKey: string, + deviceKeyEncryptedDevicePrivateKey: string + ): Promise { + const request = new TrustedDeviceKeysRequest( + devicePublicKeyEncryptedUserSymKey, + userSymKeyEncryptedDevicePublicKey, + deviceKeyEncryptedDevicePrivateKey + ); + + const result = await this.apiService.send( + "PUT", + `/devices/${deviceIdentifier}/keys`, + request, + true, + true + ); + + return new DeviceResponse(result); + } +} diff --git a/libs/common/src/services/devices/requests/trusted-device-keys.request.ts b/libs/common/src/services/devices/requests/trusted-device-keys.request.ts new file mode 100644 index 00000000000..da89de975b0 --- /dev/null +++ b/libs/common/src/services/devices/requests/trusted-device-keys.request.ts @@ -0,0 +1,7 @@ +export class TrustedDeviceKeysRequest { + constructor( + public encryptedUserKey: string, + public encryptedPublicKey: string, + public encryptedPrivateKey: string + ) {} +} diff --git a/libs/common/src/services/state.service.ts b/libs/common/src/services/state.service.ts index 4a1592e733c..dc32c688e30 100644 --- a/libs/common/src/services/state.service.ts +++ b/libs/common/src/services/state.service.ts @@ -35,7 +35,7 @@ import { EncString } from "../models/domain/enc-string"; import { GlobalState } from "../models/domain/global-state"; import { State } from "../models/domain/state"; import { StorageOptions } from "../models/domain/storage-options"; -import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; +import { DeviceKey, SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; import { WindowState } from "../models/domain/window-state"; import { GeneratedPasswordHistory } from "../tools/generator/password"; import { SendData } from "../tools/send/models/data/send.data"; @@ -1054,6 +1054,32 @@ export class StateService< : await this.secureStorageService.save(DDG_SHARED_KEY, value, options); } + async getDeviceKey(options?: StorageOptions): Promise { + options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()); + + if (options?.userId == null) { + return null; + } + + const account = await this.getAccount(options); + + return account?.keys?.deviceKey as DeviceKey; + } + + async setDeviceKey(value: DeviceKey, options?: StorageOptions): Promise { + options = this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()); + + if (options?.userId == null) { + return; + } + + const account = await this.getAccount(options); + + account.keys.deviceKey = value; + + await this.saveAccount(account, options); + } + async getEmail(options?: StorageOptions): Promise { return ( await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions())) @@ -2751,7 +2777,10 @@ export class StateService< // settings persist even on reset, and are not effected by this method protected resetAccount(account: TAccount) { - const persistentAccountInformation = { settings: account.settings }; + const persistentAccountInformation = { + settings: account.settings, + keys: { deviceKey: account.keys.deviceKey }, + }; return Object.assign(this.createAccount(), persistentAccountInformation); } @@ -2830,7 +2859,7 @@ export class StateService< return this.reconcileOptions(options, defaultOptions); } - private async saveSecureStorageKey( + protected async saveSecureStorageKey( key: string, value: T, options?: StorageOptions diff --git a/libs/common/src/types/csprng.d.ts b/libs/common/src/types/csprng.d.ts index b62f8b37a68..ec0a31a9f78 100644 --- a/libs/common/src/types/csprng.d.ts +++ b/libs/common/src/types/csprng.d.ts @@ -1,5 +1,9 @@ import { Opaque } from "type-fest"; +// You would typically use these types when you want to create a type that +// represents an array or string value generated from a +// cryptographic secure pseudorandom number generator (CSPRNG) + type CsprngArray = Opaque; type CsprngString = Opaque; From ffb2dac384170df84f752ca9e6a558ab86434f1a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 02:04:06 +0200 Subject: [PATCH 047/299] Autosync the updated translations (#5516) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/ca/messages.json | 8 +-- apps/desktop/src/locales/pt_PT/messages.json | 60 ++++++++++---------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index e0d1adf7e53..83731a76f66 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2253,17 +2253,17 @@ "message": "Actualització de configuració recomanada" }, "region": { - "message": "Region" + "message": "Regió" }, "eu": { - "message": "EU", + "message": "UE", "description": "European Union" }, "us": { - "message": "US", + "message": "EUA", "description": "United States" }, "selfHosted": { - "message": "Self-hosted" + "message": "Autoallotjat" } } diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index e7235d1ed93..554f81d971b 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -33,7 +33,7 @@ "message": "Coleções" }, "searchVault": { - "message": "Pesquisar cofre" + "message": "Procurar no cofre" }, "addItem": { "message": "Adicionar item" @@ -272,7 +272,7 @@ "message": "Último nome" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "address1": { "message": "Endereço 1" @@ -379,7 +379,7 @@ "message": "Tem a certeza de que deseja sobrescrever o nome de utilizador atual?" }, "noneFolder": { - "message": "Nenhuma pasta", + "message": "Em nenhuma pasta", "description": "This is the folder for uncategorized items" }, "addFolder": { @@ -413,7 +413,7 @@ "message": "Números (0-9)" }, "specialCharacters": { - "message": "Caracteres Especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)" }, "numWords": { "message": "Número de palavras" @@ -509,7 +509,7 @@ "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer." }, "masterPassHintDesc": { - "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer." + "message": "Uma dica da palavra-passe mestra pode ajudá-lo a lembrar-se da sua palavra-passe, caso se esqueça dela." }, "reTypeMasterPass": { "message": "Reescreva a palavra-passe mestra" @@ -536,7 +536,7 @@ "message": "Endereço de email inválido." }, "masterPasswordRequired": { - "message": "A palavra-passe mestra é necessária." + "message": "É necessária a palavra-passe mestra." }, "confirmMasterPasswordRequired": { "message": "É necessário reescrever a palavra-passe mestra." @@ -621,7 +621,7 @@ "message": "Enviar código de verificação novamente" }, "useAnotherTwoStepMethod": { - "message": "Utilizar outro método de início de sessão de dois passos" + "message": "Utilizar outro método de verificação de dois passos" }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." @@ -672,13 +672,13 @@ "message": "Início de sessão indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem o início de sessão de dois passos ativado, no entanto, nenhum dos provedores de início de sessão de dois passos configurados são suportados por este dispositivo." + "message": "Esta conta tem a verificação de dois passos configurada, no entanto, nenhum dos fornecedores de dois passos configurados é suportado por este dispositivo." }, "noTwoStepProviders2": { "message": "Por favor adicione provedores adicionais que são melhor suportados entre dispositivos (como uma aplicação de autenticador)." }, "twoStepOptions": { - "message": "Opções de início de sessão de dois passos" + "message": "Opções de verificação de dois passos" }, "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" @@ -750,7 +750,7 @@ "message": "Adicionar novo item" }, "addNewFolder": { - "message": "Adicionar nova pasta" + "message": "Nova pasta" }, "view": { "message": "Ver" @@ -762,7 +762,7 @@ "message": "A carregar..." }, "lockVault": { - "message": "Bloquear Cofre" + "message": "Bloquear cofre" }, "passwordGenerator": { "message": "Gerador de palavras-passe" @@ -774,7 +774,7 @@ "message": "Help and feedback" }, "getHelp": { - "message": "Obter Ajuda" + "message": "Obter ajuda" }, "fileBugReport": { "message": "Submeter um relatório de bug" @@ -840,10 +840,10 @@ "message": "Palavra-passe mestra inválida" }, "twoStepLoginConfirmation": { - "message": "O início de sessão de dois passos torna a sua conta mais segura ao requerer que verifique o seu início de sessão com outro dispositivo como uma chave de segurança, aplicação de autenticação, SMS, chamada telefónica, ou email. O início de sessão de dois passos pode ser ativado no cofre web bitwarden.com. Pretende visitar o website agora?" + "message": "A verificação de dois passos torna a sua conta mais segura, exigindo que verifique o seu início de sessão com outro dispositivo, como uma chave de segurança, aplicação de autenticação, SMS, chamada telefónica ou e-mail. A verificação de dois passos pode ser configurada em bitwarden.com. Pretende visitar o site agora?" }, "twoStepLogin": { - "message": "Início de sessão de dois passos" + "message": "Verificação de dois passos" }, "vaultTimeout": { "message": "Expiração do cofre" @@ -1078,7 +1078,7 @@ "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, "premiumSignUpTwoStep": { - "message": "Opções de início de sessão de dois passos adicionais como YubiKey, FIDO U2F, e Duo." + "message": "Opções adicionais de verificação de dois passos, como YubiKey, FIDO U2F e Duo." }, "premiumSignUpReports": { "message": "Higiene de palavras-passe, saúde das contas, e relatórios de brechas de dados para manter o seu cofre seguro." @@ -1453,7 +1453,7 @@ "message": "Tem de selecionar pelo menos uma coleção." }, "premiumUpdated": { - "message": "Atualizou para o premium." + "message": "Atualizou para o Premium." }, "restore": { "message": "Restaurar" @@ -1618,7 +1618,7 @@ "message": "Unfortunately browser integration is currently not supported in the Microsoft Store version." }, "browserIntegrationLinuxDesc": { - "message": "Infelizmente, a integração com o navegador não é, atualmente, suportada para a versão linux." + "message": "Infelizmente, a integração com o navegador não é atualmente suportada na versão Linux." }, "enableBrowserIntegrationFingerprint": { "message": "Require verification for browser integration" @@ -1697,7 +1697,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Data de Expiração" + "message": "Data de expiração" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1850,7 +1850,7 @@ "message": "Esta ação está protegida. Para continuar, por favor reinsira a sua palavra-passe mestra para verificarmos a sua identidade." }, "updatedMasterPassword": { - "message": "Palavra-passe Mestra Atualizada" + "message": "Palavra-passe mestra atualizada" }, "updateMasterPassword": { "message": "Atualizar palavra-passe mestra" @@ -1922,7 +1922,7 @@ "message": "Uma ou mais políticas da organização impedem que exporte o seu cofre pessoal." }, "addAccount": { - "message": "Adicionar Conta" + "message": "Adicionar conta" }, "removeMasterPassword": { "message": "Remover palavra-passe mestra" @@ -1952,16 +1952,16 @@ "message": "Key connector error: make sure key connector is available and working correctly." }, "lockAllVaults": { - "message": "Bloquear Todos os Cofres" + "message": "Bloquear todos os cofres" }, "accountLimitReached": { - "message": "Não é possível iniciar sessão com mais de 5 contas ao mesmo tempo." + "message": "Não é possível ter a sessão iniciada com mais de 5 contas ao mesmo tempo." }, "accountPreferences": { "message": "Preferências" }, "appPreferences": { - "message": "Definições da Aplicação (Todas as Contas)" + "message": "Definições da aplicação (todas as contas)" }, "accountSwitcherLimitReached": { "message": "Limite de contas atingido. Termine a sessão de uma das contas para adicionar outra." @@ -1976,7 +1976,7 @@ } }, "switchAccount": { - "message": "Mudar de Conta" + "message": "Mudar de conta" }, "options": { "message": "Opções" @@ -1985,10 +1985,10 @@ "message": "A sua sessão expirou. Por favor, volte atrás e tente iniciar sessão novamente." }, "exportingPersonalVaultTitle": { - "message": "A Exportar Cofre Pessoal" + "message": "A exportar cofre pessoal" }, "exportingPersonalVaultDescription": { - "message": "Apenas os itens do cofre pessoal associado ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", + "message": "Apenas os itens do cofre pessoal associado a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", "placeholders": { "email": { "content": "$1", @@ -2006,7 +2006,7 @@ "message": "Generator" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "O que é que gostaria de gerar?" }, "passwordType": { "message": "Password type" @@ -2049,7 +2049,7 @@ "message": "Todos os cofres" }, "searchOrganization": { - "message": "Procurar Organização" + "message": "Procurar organização" }, "searchMyVault": { "message": "Procurar no meu cofre" @@ -2092,13 +2092,13 @@ "message": "A iniciar sessão como" }, "rememberEmail": { - "message": "Relembrar e-mail" + "message": "Lembrar e-mail" }, "notYou": { "message": "Utilizador incorreto?" }, "newAroundHere": { - "message": "Novo por aqui?" + "message": "É novo por cá?" }, "loggingInTo": { "message": "A iniciar sessão em $DOMAIN$", From 0d96997af81fe045840cbb06338839e80b4d5937 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 10:38:57 +0200 Subject: [PATCH 048/299] Autosync the updated translations (#5517) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 23 + apps/web/src/locales/ar/messages.json | 23 + apps/web/src/locales/az/messages.json | 41 +- apps/web/src/locales/be/messages.json | 35 +- apps/web/src/locales/bg/messages.json | 37 +- apps/web/src/locales/bn/messages.json | 23 + apps/web/src/locales/bs/messages.json | 23 + apps/web/src/locales/ca/messages.json | 37 +- apps/web/src/locales/cs/messages.json | 1525 +++++++++++----------- apps/web/src/locales/cy/messages.json | 23 + apps/web/src/locales/da/messages.json | 23 + apps/web/src/locales/de/messages.json | 27 +- apps/web/src/locales/el/messages.json | 23 + apps/web/src/locales/en_GB/messages.json | 23 + apps/web/src/locales/en_IN/messages.json | 23 + apps/web/src/locales/eo/messages.json | 23 + apps/web/src/locales/es/messages.json | 23 + apps/web/src/locales/et/messages.json | 23 + apps/web/src/locales/eu/messages.json | 23 + apps/web/src/locales/fa/messages.json | 83 +- apps/web/src/locales/fi/messages.json | 45 +- apps/web/src/locales/fil/messages.json | 23 + apps/web/src/locales/fr/messages.json | 23 + apps/web/src/locales/gl/messages.json | 23 + apps/web/src/locales/he/messages.json | 23 + apps/web/src/locales/hi/messages.json | 23 + apps/web/src/locales/hr/messages.json | 23 + apps/web/src/locales/hu/messages.json | 37 +- apps/web/src/locales/id/messages.json | 23 + apps/web/src/locales/it/messages.json | 23 + apps/web/src/locales/ja/messages.json | 37 +- apps/web/src/locales/ka/messages.json | 23 + apps/web/src/locales/km/messages.json | 23 + apps/web/src/locales/kn/messages.json | 23 + apps/web/src/locales/ko/messages.json | 23 + apps/web/src/locales/lv/messages.json | 37 +- apps/web/src/locales/ml/messages.json | 23 + apps/web/src/locales/my/messages.json | 23 + apps/web/src/locales/nb/messages.json | 23 + apps/web/src/locales/ne/messages.json | 23 + apps/web/src/locales/nl/messages.json | 23 + apps/web/src/locales/nn/messages.json | 23 + apps/web/src/locales/or/messages.json | 23 + apps/web/src/locales/pl/messages.json | 35 +- apps/web/src/locales/pt_BR/messages.json | 23 + apps/web/src/locales/pt_PT/messages.json | 113 +- apps/web/src/locales/ro/messages.json | 23 + apps/web/src/locales/ru/messages.json | 23 + apps/web/src/locales/si/messages.json | 23 + apps/web/src/locales/sk/messages.json | 23 + apps/web/src/locales/sl/messages.json | 27 +- apps/web/src/locales/sr/messages.json | 31 +- apps/web/src/locales/sr_CS/messages.json | 23 + apps/web/src/locales/sv/messages.json | 23 + apps/web/src/locales/te/messages.json | 23 + apps/web/src/locales/th/messages.json | 23 + apps/web/src/locales/tr/messages.json | 37 +- apps/web/src/locales/uk/messages.json | 49 +- apps/web/src/locales/vi/messages.json | 23 + apps/web/src/locales/zh_CN/messages.json | 25 +- apps/web/src/locales/zh_TW/messages.json | 23 + 61 files changed, 2325 insertions(+), 922 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index e1af3c62ada..7f62c9fd74a 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 96e552b5849..0564247afeb 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 0541dd51ddb..072c8057234 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -2751,7 +2751,7 @@ } }, "viewCollectionWithName": { - "message": "View collection - $NAME$", + "message": "Kolleksiyaya bax - $NAME$", "placeholders": { "name": { "content": "$1", @@ -2760,7 +2760,7 @@ } }, "editItemWithName": { - "message": "Edit item - $NAME$", + "message": "Elementə düzəliş et - $NAME$", "placeholders": { "name": { "content": "$1", @@ -5227,15 +5227,15 @@ "message": "Açar Bağlayıcı" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "SSO ilə Giriş etməni, öz-özünə sahiblik edən şifrə açma açar serverinizə bağlayın. Bu seçimi istifadə edərək, üzvlərin anbar verilənlərinin şifrəsini açmaq üçün Ana Parollarını istifadə etməsinə ehtiyac qalmayacaq.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "SSO kimlik təsdiqləməsi və tək təşkilat siyasətləri tələb olunur", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "Açar Bağlayıcı şifrə açmanı quraşdırmaq üçün tələb olunur. Quraşdırma üzrə kömək üçün Bitwarden Dəstək ilə əlaqə saxlayın.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Faktura Sinxronlaşdırma köməyi" }, + "licensePaidFeaturesHelp": { + "message": "Lisenziyalı ödənişli özəlliklər üzrə kömək" + }, + "selfHostGracePeriodHelp": { + "message": "Abunəliyiniz bitdikdən sonra, güncəllənmiş lisenziya faylını təşkilatınıza tətbiq etmək üçün 60 gününüz var. Güzəşt müddəti $GRACE_PERIOD_END_DATE$ bitir.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Lisenziyanı yüklə" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Mövcud üzvlərin öz parollarını dəyişdirməsini tələb et" }, + "region": { + "message": "Bölgə" + }, + "eu": { + "message": "AB", + "description": "European Union" + }, + "us": { + "message": "ABŞ", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Bu layihəni silmək icazəniz yoxdur", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "KDF tənzimləmələrini güncəllə" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Güvənli cihaz şifrələməsi" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Kimlik təsdiqləndikdən sonra üzvlər, cihazlarından saxlanılan açarı istifadə edərək anbar verilənlərinin şifrələrini aça biləcək.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "ana parol sıfırlama siyasəti", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "Bu seçim istifadə edildikdə avto-qeydiyyat ilə işə salınacaq.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 6c335102a97..4217422b6e9 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -5227,11 +5227,11 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Падключыце аўтарызацыю з дапамогай SSO да свайго ўласнага сервера расшыфроўкі ключоў. Пры дапамозе гэтага параметра ўдзельнікам больш непатрэбна будзе выкарыстоўваць свае асноўныя паролі для расшыфроўкі даных сховішча.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "Для наладжвання расшыфроўкі Key Connector патрабуецца аўтэнтыфікацыя SSO", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Дапамога з плацежнай сінхранізацыяй" }, + "licensePaidFeaturesHelp": { + "message": "Даведка па платным ліцэнзійным функцыям" + }, + "selfHostGracePeriodHelp": { + "message": "Пасля таго, як тэрмін дзеяння падпіскі міне ў вас будзе 60 дзён, каб ужыць абноўлены файл ліцэнзіі да вашай арганізацыі. Ільготны перыяд завершыцца: $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Запампаваць ліцэнзію" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Патрабаваць ад існуючых удзельнікаў змены пароляў" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "У вас няма правоў для выдалення гэтага праекта", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Абнавіце налады KDF" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Шыфраванне даверанай прылады" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Пасля аўтэнтыфікацыі ўдзельнікі расшыфроўваюць даныя сховішча з выкарыстаннем ключа, якія захоўваецца на іх прыладах", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "палітыка скідання асноўнага пароля", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "уключаецца палітыка скідання асноўнага пароля з аўтаматычнай рэгістрацыяй.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index aea467b1ee7..61ff37adba5 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -5227,15 +5227,15 @@ "message": "Конектор за ключове" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Свържете вписването чрез еднократно удостоверяване със своя собствен сървър за ключове за дешифриране. Така няма да има нужда членовете да използват главната си парола, за да дешифрират данните от трезора си.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "Политиките за еднократно удостоверяване и една организация", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "са необходими, за да бъде настроено шифроването чрез конектор за ключове. Свържете се с поддръжката на Битуорден, ако имате нужда от помощ с настройката.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Помощ относно синхронизирането на лицензи" }, + "licensePaidFeaturesHelp": { + "message": "Помощ относно платените функционалности в лиценза" + }, + "selfHostGracePeriodHelp": { + "message": "След като изтече абонаментът Ви, имате 60 дни да приложите актуализиран лицензионен файл към организацията си. Този период приключва на $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Качване на лиценз" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Задължаване на текущите членове да сменят паролите си" }, + "region": { + "message": "Регион" + }, + "eu": { + "message": "ЕС", + "description": "European Union" + }, + "us": { + "message": "САЩ", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Нямате право за изтриване на този проект", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Промяна на настройките за KDF" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Шифроване чрез доверено устройство" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "След вписване, членовете ще дешифрират данните от трезорите си чрез ключ, който се съхранява на устройство.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "Политиката за смяна на главната парола", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "с автоматично включване ще бъде активирана при използването на тази настройка.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index d7040e5a4e3..75cef1028fd 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 863de44265a..e9508dc7dde 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 9e90f079a13..af71bb3886a 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -5227,15 +5227,15 @@ "message": "Connector de claus" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Connecteu l'inici de sessió amb SSO al vostre servidor de claus de desxifrat autoallotjat. Amb aquesta opció, els membres no hauran d'utilitzar les seves contrasenyes mestres per desxifrar les dades de la caixa forta. El", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "requereix autenticació SSO i polítiques d'organització única", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "són necessaris per configurar el desxifrat del connector de claus. Contacteu amb l'assistència de Bitwarden per obtenir ajuda per a la configuració.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Ajuda de sincronització de facturació" }, + "licensePaidFeaturesHelp": { + "message": "Ajuda a les característiques de pagament de la llicència" + }, + "selfHostGracePeriodHelp": { + "message": "Després de que caduque la vostra subscripció, teniu 60 dies per aplicar un fitxer de llicència actualitzat a la vostra organització. El període de gràcia acaba el $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Puja la llicència" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Exigeix que els membres existents canvien les seues contrasenyes" }, + "region": { + "message": "Regió" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "EUA", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "No teniu permisos per suprimir aquest projecte", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Actualitza la configuració de KDF" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Encriptació de dispositius de confiança" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Una vegada autenticats, els membres desxifraran les dades de la caixa forta mitjançant una clau emmagatzemada al seu dispositiu. El", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "política de restabliment de la contrasenya mestra", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "amb inscripció automàtica s'activarà quan s'utilitze aquesta opció.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 666f98cee90..056b73fdd56 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -3105,10 +3105,10 @@ "message": "Ověřit e-mail" }, "verifyEmailDesc": { - "message": "Ověřte e-mailovou adresu vašeho účtu pro získání přístupu ke všem funkcím." + "message": "Ověřte e-mailovou adresu Vašeho účtu pro získání přístupu ke všem funkcím." }, "verifyEmailFirst": { - "message": "E-mailová adresa vašeho účtu musí být ověřena." + "message": "E-mailová adresa Vašeho účtu musí být nejprve ověřena." }, "checkInboxForVerification": { "message": "Zkontrolujte svůj e-mail, měli byste obdržet odkaz pro ověření." @@ -3117,37 +3117,37 @@ "message": "Vaše e-mailová adresa byla ověřena" }, "emailVerifiedFailed": { - "message": "Váš e-mail se nepodařilo ověřit. Zkuste odeslat nový ověřovací e-mail." + "message": "Nelze ověřit Váš e-mail. Zkuste odeslat nový ověřovací e-mail." }, "emailVerificationRequired": { - "message": "Je vyžadováno ověření emailu" + "message": "Je vyžadováno ověření e-mailu" }, "emailVerificationRequiredDesc": { - "message": "K použití této funkce je zapotřebí ověření vašeho e-mailu." + "message": "Pro použití této funkce musíte ověřit svůj e-mail." }, "updateBrowser": { - "message": "Aktualizace prohlížeče" + "message": "Aktualizovat prohlížeč" }, "updateBrowserDesc": { - "message": "Používáte nepodporovaný webový prohlížeč. Aplikace nemusí pracovat správně." + "message": "Používáte nepodporovaný webový prohlížeč. Webový trezor nemusí pracovat správně." }, "joinOrganization": { "message": "Přidat se k organizaci" }, "joinOrganizationDesc": { - "message": "Byly jste pozváni do výše uvedené organizace. Pro přijetí pozvánky se musíte přihlásit nebo si založit nový účet." + "message": "Byli jste pozváni do výše uvedené organizace. Chcete-li přijmout pozvánku, musíte se přihlásit nebo vytvořit nový účet na Bitwardenu." }, "inviteAccepted": { - "message": "Pozvánka byla přijata." + "message": "Pozvánka byla přijata" }, "inviteAcceptedDesc": { - "message": "K této organizaci získáte přístup jakmile vám administrátor udělí členství. Až se tak stane, pošleme vám e-mail." + "message": "K této organizaci můžete přistupovat, jakmile správce potvrdí Vaše členství. Až se tak stane, pošleme Vám e-mail." }, "inviteInitAcceptedDesc": { "message": "Nyní můžete přistupovat k této organizaci." }, "inviteAcceptFailed": { - "message": "Pozvánku nelze přijmout. Požádejte administrátora organizace o novou pozvánku." + "message": "Nelze přijmout pozvánku. Požádejte správce organizace o zaslání nové pozvánky." }, "inviteAcceptFailedShort": { "message": "Pozvánku nelze přijmout. $DESCRIPTION$", @@ -3159,40 +3159,40 @@ } }, "rememberEmail": { - "message": "Pamatovat si e-mail" + "message": "Zapamatovat si e-mail" }, "recoverAccountTwoStepDesc": { - "message": "Nemůžete-li přistoupit ke svému účtu pomocí běžné metody dvoufázového přihlášení, můžete použít váš kód pro obnovení dvoufázového přihlášení pro vypnutí všech dvoufázových ověření ve vašem účtu." + "message": "Nemůžete-li přistoupit ke svému účtu pomocí běžné metody dvoufázového přihlášení, můžete pro vypnutí všech dvoufázových ověření ve Vašem účtu použít kód pro obnovení dvoufázového přihlášení." }, "recoverAccountTwoStep": { "message": "Obnovit dvoufázové přihlášení k účtu" }, "twoStepRecoverDisabled": { - "message": "Dvoufázové ověření na vašem účtu bylo vypnuto." + "message": "Dvoufázové ověření na Vašem účtu bylo vypnuto." }, "learnMore": { "message": "Dozvědět se více" }, "deleteRecoverDesc": { - "message": "Zadejte svou e-mailovou adresu pro obnovení a odstranění vašeho účtu." + "message": "Zadejte svou e-mailovou adresu níže pro obnovení a smazání účtu." }, "deleteRecoverEmailSent": { - "message": "Pokud váš účet existuje, zaslali jsme vám e-mail s dalšími pokyny." + "message": "Pokud Váš účet existuje, poslali jsme Vám e-mail s dalšími pokyny." }, "deleteRecoverConfirmDesc": { - "message": "Vyžádali jste si odstranění vašeho Bitwarden účtu. Klepnutím na tlačítko níže akci potvrďte." + "message": "Požádali jste o smazání svého účtu na Bitwardenu. Pro potvrzení použijte tlačítko níže." }, "myOrganization": { - "message": "Má organizace" + "message": "Moje organizace" }, "organizationInfo": { - "message": "Organization info" + "message": "Informace o organizaci" }, "deleteOrganization": { "message": "Smazat organizaci" }, "deletingOrganizationContentWarning": { - "message": "Enter the master password to confirm deletion of $ORGANIZATION$ and all associated data. Vault data in $ORGANIZATION$ includes:", + "message": "Zadejte hlavní heslo pro potvrzení smazání $ORGANIZATION$ a všech souvisejících dat. Data v trezoru v $ORGANIZATION$ zahrnují:", "placeholders": { "organization": { "content": "$1", @@ -3201,7 +3201,7 @@ } }, "deletingOrganizationActiveUserAccountsWarning": { - "message": "User accounts will remain active after deletion but will no longer be associated to this organization." + "message": "Uživatelské účty zůstanou po smazání aktivní, ale již nebudou přiřazeny k této organizaci." }, "deletingOrganizationIsPermanentWarning": { "message": "Smazání $ORGANIZATION$ je trvalé a nevratné.", @@ -3219,28 +3219,28 @@ "message": "Organizace a veškerá související data byla smazána." }, "organizationUpdated": { - "message": "Organizace byla aktualizována." + "message": "Organizace byla uložena" }, "taxInformation": { "message": "Daňové údaje" }, "taxInformationDesc": { - "message": "Pro poskytnutí nebo aktualizaci daňových údajů pro vaše faktury kontaktujte zákaznickou podporu." + "message": "Pro zákazníky v USA je k uspokojení požadavků na daň z prodeje vyžadován kód ZIP, u ostatních zemí můžete volitelně uvést daňové identifikační číslo (DPH/GST) a/nebo adresu, která se objeví na Vašich fakturách." }, "billingPlan": { "message": "Plán", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlan": { - "message": "Změnit plán", + "message": "Aktualizovat plán", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlanUpgrade": { - "message": "Povyšte svůj účet na jiný plán zadáním údajů níže. Ujistěte se prosím, že máte k účtu přidaný platný způsob platby.", + "message": "Aktualizujte Váš účet na jiný plán zadáním údajů níže. Ujistěte se, že máte k účtu přidanou aktivní metodu platby.", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "invoiceNumber": { - "message": "Faktura #$NUMBER$", + "message": "Faktura č. $NUMBER$", "description": "ex. Invoice #79C66F0-0001", "placeholders": { "number": { @@ -3259,16 +3259,16 @@ "message": "Ověření bankovního účtu" }, "verifyBankAccountDesc": { - "message": "Provedli jsme dva mikro vklady na váš bankovní účet (může trvat 1 až 2 pracovní dny, než se zobrazí). Zadejte částky vkladů pro ověření vašeho bankovního účtu." + "message": "Provedli jsme dva malé vklady na Váš bankovní účet (může trvat 1 až 2 pracovní dny, než se zobrazí). Zadejte částky vkladů pro ověření Vašeho bankovního účtu." }, "verifyBankAccountInitialDesc": { - "message": "Platba s bankovním účtem je k dispozici pouze zákazníkům ve Spojených státech. Budete vyzváni k ověření vašeho bankovního účtu. V následujících 1-2 pracovních dnech provedeme dva mikro-vklady. Zadejte tyto částky na fakturační stránce organizace pro ověření vašeho bankovního účtu." + "message": "Platba bankovním účtem je k dispozici pouze zákazníkům ve Spojených státech. Budete požádání o ověření Vašeho bankovního účtu. V následujících 1-2 pracovních dnech provedeme dva malé vklady. Pro ověření bankovního účtu zadejte tyto částky na fakturační stránce organizace." }, "verifyBankAccountFailureWarning": { - "message": "Neschopnost ověření vašeho bankovního účtu bude mít za následek zmeškání platby a zrušení vašeho předplatného." + "message": "Selhání ověření bankovního účtu bude mít za následek zmeškanou platbu a pozastavení předplatného." }, "verifiedBankAccount": { - "message": "Bankovní účet byl ověřen." + "message": "Bankovní účet byl ověřen" }, "bankAccount": { "message": "Bankovní účet" @@ -3284,7 +3284,7 @@ } }, "routingNumber": { - "message": "Směrovací číslo", + "message": "Variabilní symbol", "description": "Bank account routing number" }, "accountNumber": { @@ -3297,37 +3297,37 @@ "message": "Typ účtu" }, "bankAccountTypeCompany": { - "message": "Společnost (firma)" + "message": "Firemní" }, "bankAccountTypeIndividual": { - "message": "Individuální (osobní)" + "message": "Osobní" }, "enterInstallationId": { - "message": "Zadejte ID instalace" + "message": "Zadejte ID Vaší instalace" }, "limitSubscriptionDesc": { - "message": "Set a seat limit for your subscription. Once this limit is reached, you will not be able to invite new members." + "message": "Nastavte limit počtu uživatelů pro Vaše předplatné. Jakmile tohoto limitu dosáhnete, nebudete moci pozvat nové členy." }, "maxSeatLimit": { - "message": "Seat Limit (optional)", + "message": "Limit uživatelů (volitelné)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { - "message": "Max potential seat cost" + "message": "Maximální potencialní náklady na uživatele" }, "addSeats": { "message": "Přidat uživatele", "description": "Seat = User Seat" }, "removeSeats": { - "message": "Odstranit uživatele", + "message": "Odebrat uživatele", "description": "Seat = User Seat" }, "subscriptionDesc": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited users exceed your subscription seats, you will immediately receive a prorated charge for the additional users." + "message": "Úpravy Vašeho předplatného budou mít za následek poměrné změny Vašich fakturačních součtů. Pokud počet nově pozvaných uživatelů překročí počet uživatelů v předplatném, bude Vám okamžitě doúčtován poměrný poplatek za další uživatele." }, "subscriptionUserSeats": { - "message": "Vaše předplatné vám dává prostor pro celkem $COUNT$ uživatelů.", + "message": "Vaše předplatné umožňuje celkem $COUNT$ členů.", "placeholders": { "count": { "content": "$1", @@ -3336,25 +3336,25 @@ } }, "limitSubscription": { - "message": "Limit subscription (optional)" + "message": "Omezit předplatné (volitelné)" }, "subscriptionSeats": { - "message": "Subscription seats" + "message": "Uživatelé v předplatném" }, "subscriptionUpdated": { - "message": "Předplatné aktualizováno" + "message": "Předplatné bylo aktualizováno" }, "additionalOptions": { - "message": "Další možnosti" + "message": "Další volby" }, "additionalOptionsDesc": { - "message": "Pro další pomoc se správou vašeho předplatného kontaktujte prosím zákaznickou podporu." + "message": "Pro další pomoc se správou Vašeho předplatného kontaktujte zákaznickou podporu." }, "subscriptionUserSeatsUnlimitedAutoscale": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited members exceed your subscription seats, you will immediately receive a prorated charge for the additional members." + "message": "Úpravy Vašeho předplatného budou mít za následek poměrné změny Vašich fakturačních součtů. Pokud počet nově pozvaných členů překročí počet členů v předplatném, bude Vám okamžitě doúčtován poměrný poplatek za další členy." }, "subscriptionUserSeatsLimitedAutoscale": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited members exceed your subscription seats, you will immediately receive a prorated charge for the additional members until your $MAX$ seat limit is reached.", + "message": "Úpravy Vašeho předplatného budou mít za následek poměrné změny Vašich fakturačních součtů. Pokud počet nově pozvaných členů překročí počet členů v předplatném, bude Vám okamžitě doúčtován poměrný poplatek za další členy dokud nebude dosaženo maximálního limitu: $MAX$.", "placeholders": { "max": { "content": "$1", @@ -3363,7 +3363,7 @@ } }, "subscriptionFreePlan": { - "message": "You cannot invite more than $COUNT$ members without upgrading your plan.", + "message": "Bez aktualizace Vašeho plánu nemůžete pozvat více než $COUNT$ členů.", "placeholders": { "count": { "content": "$1", @@ -3372,7 +3372,7 @@ } }, "subscriptionFamiliesPlan": { - "message": "You cannot invite more than $COUNT$ members without upgrading your plan. Please contact Customer Support to upgrade.", + "message": "Bez aktualizace Vašeho plánu nemůžete pozvat více než $COUNT$ členů. Kontaktujte zákaznickou podporu pro aktualizaci.", "placeholders": { "count": { "content": "$1", @@ -3381,7 +3381,7 @@ } }, "subscriptionSponsoredFamiliesPlan": { - "message": "Your subscription allows for a total of $COUNT$ members. Your plan is sponsored and billed to an external organization.", + "message": "Vaše předplatné umožňuje celkem $COUNT$ členů. Váš plán je sponzorován a účtován externí organizaci.", "placeholders": { "count": { "content": "$1", @@ -3390,7 +3390,7 @@ } }, "subscriptionMaxReached": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. You cannot invite more than $COUNT$ members without increasing your subscription seats.", + "message": "Úpravy Vašeho předplatného budou mít za následek poměrné změny Vašich fakturačních součtů. Bez zvýšení počtu členů ve Vašem předplatném nemůžete pozvat více, než $COUNT$ členů.", "placeholders": { "count": { "content": "$1", @@ -3405,13 +3405,13 @@ "message": "Uživatelé k odebrání" }, "seatsAddNote": { - "message": "Přidání uživatelských míst bude mít za následek úpravy fakturačních součtů a okamžité dobití platební metody v souboru. První poplatek bude účtován pro zbytek aktuálního fakturačního cyklu." + "message": "Přidání uživatelů bude mít za následek poměrné změny Vašich fakturačních součtů a okamžité doúčtování pomocí Vaší platební metody. První poplatek se poměrně rozpočítá na zbývající část aktuálního zúčtovacího cyklu." }, "seatsRemoveNote": { - "message": "Odebrání uživatelských míst bude mít za následek úpravy vašich fakturačních součtů, které budou účtovány jako kredity k vašemu dalšímu fakturačnímu poplatku." + "message": "Odebrání uživatelů bude mít za následek úpravu Vašich celkových fakturačních částek, které budou poměrně započítány do příštího vyúčtování." }, "adjustedSeats": { - "message": "Upraveno $AMOUNT$ uživatelských míst.", + "message": "Upraveno na $AMOUNT$ uživatelů.", "placeholders": { "amount": { "content": "$1", @@ -3420,7 +3420,7 @@ } }, "keyUpdated": { - "message": "Klíč byl upraven." + "message": "Klíč byl aktualizován" }, "updateKeyTitle": { "message": "Aktualizovat klíč" @@ -3429,34 +3429,34 @@ "message": "Aktualizovat šifrovací klíč" }, "updateEncryptionKeyShortDesc": { - "message": "Používáte zastaralé šifrovací schéma." + "message": "Aktuálně používáte zastaralé šifrovací schéma." }, "updateEncryptionKeyDesc": { - "message": "Přešli jsme na delší šifrovací klíče, které poskytují vyšší úroveň zabezpečení a přístup k novým funkcím. Aktualizace vašeho šifrovacího klíče je rychlá a snadná. Stačí níže zadat vaše hlavní heslo. Provedení této aktualizace může být v budoucnu povinné." + "message": "Přešli jsme na delší šifrovací klíče, které poskytují vyšší úroveň zabezpečení a přístup k novým funkcím. Aktualizace Vašeho šifrovacího klíče je rychlá a snadná. Stačí níže zadat Vaše hlavní heslo. Provedení této aktualizace může být v budoucnu povinné." }, "updateEncryptionKeyWarning": { - "message": "Po aktualizace šifrovacího klíče dojde k odhlášení a budete se muset opětovně přihlásit do všech Bitwarden aplikací, které aktuálně používáte (např. mobilní aplikace či rozšíření pro prohlížeč). Nezdaří-li se odhlášení a opětovné přihlášení (během něhož bude stažen nový šifrovací klíč), může dojít k poškození údajů. Pokusíme se vás automaticky odhlásit, nicméně, může to chvíli trvat." + "message": "Po aktualizace šifrovacího klíče dojde k odhlášení a budete se muset opětovně přihlásit do všech aplikací Bitwardenu, které aktuálně používáte (např. mobilní aplikace či rozšíření pro prohlížeč). Nezdaří-li se odhlášení a opětovné přihlášení (během něhož bude stažen nový šifrovací klíč), může dojít k poškození dat. Pokusíme se Vás automaticky odhlásit, nicméně, může to chvíli trvat." }, "updateEncryptionKeyExportWarning": { - "message": "Jakékoliv šifrované exporty, které jste uložili, budou také neplatné." + "message": "Jakékoli šifrované exporty, které jste uložili, budou také neplatné." }, "subscription": { - "message": "Odběr" + "message": "Předplatné" }, "loading": { "message": "Načítání" }, "upgrade": { - "message": "Povýšit" + "message": "Aktualizovat" }, "upgradeOrganization": { - "message": "Povýšit organizaci" + "message": "Aktualizovat organizaci" }, "upgradeOrganizationDesc": { - "message": "Tato funkce je nedostupná pro bezplatné organizace. Přejděte na placené členství a odemkněte více funkcí." + "message": "Tato funkce není dostupná pro bezplatné organizace. Přepněte na placenou verzi a odemkněte další funkce." }, "createOrganizationStep1": { - "message": "Vytvoření organizace: Krok 1" + "message": "Vytvořit organizaci: Krok 1" }, "createOrganizationCreatePersonalAccount": { "message": "Před vytvořením organizace si musíte nejdříve vytvořit bezplatný osobní účet." @@ -3468,13 +3468,13 @@ "message": "Nevybrali jste žádné položky." }, "acceptPolicies": { - "message": "Zaškrtnutím tohoto políčka souhlasím s následujícím:" + "message": "Zaškrtnutím tohoto políčka souhlasíte s následujícím:" }, "acceptPoliciesRequired": { - "message": "Podmínky použití a zásady ochrany osobních údajů nebyly odsouhlaseny." + "message": "Podmínky použití a Zásady ochrany osobních údajů nebyly odsouhlaseny." }, "termsOfService": { - "message": "Podmínky služby" + "message": "Podmínky použití" }, "privacyPolicy": { "message": "Zásady ochrany osobních údajů" @@ -3507,10 +3507,10 @@ "message": "Po 4 hodinách" }, "onRefresh": { - "message": "Při obnově karty prohlížeče" + "message": "Při obnovení prohlížeče" }, "dateUpdated": { - "message": "Upraveno", + "message": "Aktualizováno", "description": "ex. Date this item was updated" }, "dateCreated": { @@ -3518,14 +3518,14 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Heslo bylo změněno", + "message": "Heslo bylo aktualizováno", "description": "ex. Date this password was updated" }, "organizationIsDisabled": { - "message": "Organizace je zakázána." + "message": "Organizace byla deaktivována" }, "disabledOrganizationFilterError": { - "message": "Položky v zablokovaných organizacích nejsou dostupné. Pro pomoc kontaktujte majitele organizace." + "message": "K položkám v deaktivované organizaci nemáte přístup. Požádejte o pomoc vlastníka organizace." }, "licenseIsExpired": { "message": "Licence vypršela." @@ -3534,7 +3534,7 @@ "message": "Uživatelé byli aktualizováni" }, "selected": { - "message": "Vybrané" + "message": "Vybráno" }, "ownership": { "message": "Vlastnictví" @@ -3562,46 +3562,46 @@ "message": "Slabé hlavní heslo" }, "weakMasterPasswordDesc": { - "message": "Zvolené hlavní heslo je slabé. Pro správnou ochranu účtu Bitwarden byste měli použít silné hlavní heslo (nebo heslovou frázi). Opravdu chcete toto heslo použít?" + "message": "Bylo nalezeno slabé heslo. K zabezpečení Vašeho účtu používejte silné heslo. Opravdu chcete používat toto slabé heslo?" }, "rotateAccountEncKey": { - "message": "Změnit také šifrovací klíč k mému účtu" + "message": "Měnit také šifrovací klíč k mému účtu" }, "rotateEncKeyTitle": { - "message": "Změnit šifrovací klíč" + "message": "Měnit šifrovací klíč" }, "rotateEncKeyConfirmation": { - "message": "Opravdu chcete změnit šifrovací klíč k vašemu účtu?" + "message": "Opravdu chcete měnit šifrovací klíč k Vašemu účtu?" }, "attachmentsNeedFix": { "message": "Tato položka obsahuje staré přílohy, které vyžadují opravu." }, "attachmentFixDesc": { - "message": "Tato stará příloha vyžaduje opravu. Klepnutím zobrazíte více informací." + "message": "Tato stará příloha vyžaduje opravu. Klepněte pro více informací." }, "fix": { "message": "Opravit", "description": "This is a verb. ex. 'Fix The Car'" }, "oldAttachmentsNeedFixDesc": { - "message": "Ve vašem trezoru jsou staré přílohy vyžadující opravu před změnou šifrovacího klíče k vašemu účtu." + "message": "Ve Vašem trezoru jsou staré přílohy vyžadující opravu před změnou šifrovacího klíče k Vašemu účtu." }, "yourAccountsFingerprint": { - "message": "Fráze otisku vašeho účtu", + "message": "Fráze otisku prstu Vašeho účtu", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintEnsureIntegrityVerify": { - "message": "Pro zajištění integrity vašich šifrovacích klíčů proveďte nejprve ověření fráze uživatelského otisku prstu.", + "message": "Pro zajištění integrity Vašich šifrovacích klíčů proveďte nejprve ověření fráze uživatelského otisku prstu.", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "Ujistěte se, že je Váš trezor odemčen a fráze otisku prstu se shodují s druhým zařízením." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Fráze otisku prstu" }, "dontAskFingerprintAgain": { - "message": "Již se neptat na ověření fráze otisku účtu (nedoporučeno)", + "message": "Nikdy se neptat na ověření frází otisků prstů pro pozvané uživatele (nedoporučeno)", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "free": { @@ -3609,44 +3609,44 @@ "description": "Free, as in 'Free beer'" }, "apiKey": { - "message": "API klíč" + "message": "Klíč API" }, "apiKeyDesc": { - "message": "Váš API klíč může být použit pro ověření přístupu k veřejnému Bitwarden API." + "message": "Váš klíč API může být použit pro ověření přístupu k veřejnému API Bitwardenu." }, "apiKeyRotateDesc": { - "message": "Změna API klíče zruší platnost předchozího klíče. API klíč můžete změnit, pokud se domníváte, že aktuální klíč již není bezpečný." + "message": "Změna klíče API zruší platnost předchozího klíče. Klíč API můžete změnit, pokud se domníváte, že aktuální klíč již není bezpečný." }, "apiKeyWarning": { - "message": "Váš API klíč má plný přístup k organizaci. Měl by být uchován v tajnosti." + "message": "Váš klíč API má plný přístup k organizaci. Měl by být uchován v tajnosti." }, "userApiKeyDesc": { - "message": "Váš API klíč může být použit k ověření v Bitwarden CLI." + "message": "Váš klíč API může být použit k ověření v Bitwarden CLI." }, "userApiKeyWarning": { - "message": "Váš API klíč je alternativní ověřovací mechanismus, který by měl být zachován v tajnosti." + "message": "Váš klíč API je alternativní ověřovací mechanismus. Měl by být uchován v tajnosti." }, "oauth2ClientCredentials": { - "message": "OAuth 2.0 klientské údaje", + "message": "Klientské údaje OAuth 2.0", "description": "'OAuth 2.0' is a programming protocol. It should probably not be translated." }, "viewApiKey": { "message": "Zobrazit klíč API" }, "rotateApiKey": { - "message": "Změnit klíč API" + "message": "Měnit klíč API" }, "selectOneCollection": { "message": "Musíte vybrat alespoň jednu kolekci." }, "couldNotChargeCardPayInvoice": { - "message": "Nepodařilo se nám strhnout platbu z vaší karty. Prohlédněte si a zaplaťte nezaplacenou fakturu uvedenou níže." + "message": "Nepodařilo se nám strhnout platbu z Vaší karty. Prohlédněte si a zaplaťte nezaplacenou fakturu uvedenou níže." }, "inAppPurchase": { "message": "Nákup v aplikaci" }, "cannotPerformInAppPurchase": { - "message": "Tuto akci nelze provést při použití platební metody „nákup v aplikaci“." + "message": "Tuto akci nelze provést při použití platební metody \"Nákup v aplikaci\"." }, "manageSubscriptionFromStore": { "message": "Své předplatné musíte spravovat z obchodu, pomocí kterého byl nákup v aplikaci proveden." @@ -3664,19 +3664,19 @@ "message": "Nastavte minimální požadavky pro sílu hlavního hesla." }, "twoStepLoginPolicyTitle": { - "message": "Požadavek dvoufázového přihlášení" + "message": "Požadovat dvoufázové přihlášení" }, "twoStepLoginPolicyDesc": { - "message": "Požadovat po uživatelích nastavení dvoufázového přihlášení pro jejich osobní účty." + "message": "Bude požadovat po uživatelích nastavení dvoufázového přihlášení pro jejich osobní účty." }, "twoStepLoginPolicyWarning": { - "message": "Členové organizace, kteří nemají povoleno dvoufázové přihlášení pro svůj osobní účet, budou odstraněni z organizace a obdrží e-mail, který je o změně informuje." + "message": "Členové organizace, kteří nejsou vlastníky nebo administrátory a kteří nemají povoleno dvoufázové přihlášení pro svůj osobní účet, budou odebráni z organizace a obdrží e-mail, který je o změně informuje." }, "twoStepLoginPolicyUserWarning": { - "message": "Jste členem organizace, která vyžaduje použití dvoufázové přihlášení na vašem uživatelském účtu. Pokud zakážete všechny poskytovatele dvoufázového přihlášení, budete z takovýchto organizací automaticky odebráni." + "message": "Jste členem organizace, která vyžaduje použití dvoufázové přihlášení na Vašem uživatelském účtu. Pokud zakážete všechny poskytovatele dvoufázového přihlášení, budete z takovýchto organizací automaticky odebráni." }, "passwordGeneratorPolicyDesc": { - "message": "Nastavení minimálních požadavků složitosti hesla pro konfiguraci generátoru hesel." + "message": "Nastaví požadavky pro generátor hesel." }, "passwordGeneratorPolicyInEffect": { "message": "Jedna nebo více zásad organizace ovlivňují nastavení generátoru." @@ -3736,10 +3736,10 @@ "message": "Akce při vypršení časového limitu" }, "vaultTimeoutActionLockDesc": { - "message": "Trezor bude uzamčen. Pro opětovný přístup k trezoru bude vyžadováno hlavní heslo." + "message": "Pro přístup k trezoru je nutné hlavní heslo nebo jiná metoda odemknutí." }, "vaultTimeoutActionLogOutDesc": { - "message": "Budete odhlášeni. Pro opětovný přístup k trezoru bude vyžadováno ověření." + "message": "Pro přístup k trezoru je vyžadováno opětovné ověření." }, "lock": { "message": "Zamknout", @@ -3750,7 +3750,7 @@ "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" }, "searchTrash": { - "message": "Hledat v koši" + "message": "Prohledat koš" }, "permanentlyDelete": { "message": "Trvale smazat" @@ -3771,7 +3771,7 @@ "message": "Položky byly trvale smazány" }, "permanentlyDeleteSelectedItemsDesc": { - "message": "Vybrané položky ($COUNT$) budou trvale smazány. Opravdu chcete všechny vybrané položky trvale smazat?", + "message": "Vybrali jste $COUNT$ položek k trvalému smazání. Opravdu chcete všechny vybrané položky trvale smazat?", "placeholders": { "count": { "content": "$1", @@ -3780,7 +3780,7 @@ } }, "permanentlyDeletedItemId": { - "message": "Položka $ID$ byla trvale smazána.", + "message": "Položka $ID$ byla trvale smazána", "placeholders": { "id": { "content": "$1", @@ -3810,7 +3810,7 @@ "message": "Obnovit položky" }, "restoreSelectedItemsDesc": { - "message": "Vybrané položky ($COUNT$) budou obnoveny. Opravdu chcete všechny vybrané položky obnovit?", + "message": "Vybrali jste $COUNT$ položek pro obnovení. Opravdu chcete obnovit všechny vybrané položky?", "placeholders": { "count": { "content": "$1", @@ -3819,7 +3819,7 @@ } }, "restoredItemId": { - "message": "Položka $ID$ byla obnovena.", + "message": "Položka $ID$ byla obnovena", "placeholders": { "id": { "content": "$1", @@ -3840,19 +3840,19 @@ "message": "Tyto informace potřebujeme pouze pro výpočet daně a pro finanční přehledy." }, "includeVAT": { - "message": "Zahrnout údaje o DPH (volitelné)" + "message": "Zahrnout údaje o DPH/GST (volitelné)" }, "taxIdNumber": { "message": "DIČ" }, "taxInfoUpdated": { - "message": "Údaje pro DPH aktualizovány." + "message": "Údaje pro DPH byly aktualizovány." }, "setMasterPassword": { "message": "Nastavit hlavní heslo" }, "ssoCompleteRegistration": { - "message": "Chcete-li dokončit přihlášení pomocí SSO, nastavte prosím hlavní přístupové heslo k vašemu trezoru." + "message": "Chcete-li dokončit přihlášení pomocí SSO, nastavte hlavní přístupové heslo k Vašemu trezoru." }, "identifier": { "message": "Identifikátor" @@ -3861,7 +3861,7 @@ "message": "Identifikátor organizace" }, "ssoLogInWithOrgIdentifier": { - "message": "Přihlaste se pomocí přihlašovacího portálu vaší organizace. Chcete-li začít, zadejte prosím identifikátor vaší organizace." + "message": "Přihlaste se pomocí přihlašovacího portálu Vaší organizace. Chcete-li začít, zadejte identifikátor Vaší organizace." }, "enterpriseSingleSignOn": { "message": "Jednotné podnikové přihlášení" @@ -3870,34 +3870,34 @@ "message": "Nyní můžete zavřít tuto kartu a pokračovat v rozšíření." }, "includeAllTeamsFeatures": { - "message": "Všechny funkce Týmů, navíc:" + "message": "Všechny funkce týmů, navíc:" }, "includeSsoAuthentication": { "message": "Podnikové přihlášení prostřednictvím SAML2.0 a OpenID Connect" }, "includeEnterprisePolicies": { - "message": "Podnikové politiky" + "message": "Podnikové zásady" }, "ssoValidationFailed": { "message": "Ověření pomocí SSO selhalo" }, "ssoIdentifierRequired": { - "message": "Je vyžadován identifikátor organizace." + "message": "Je vyžadován SSO identifikátor organizace." }, "ssoIdentifier": { - "message": "SSO identifier" + "message": "SSO identifikátor" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO." + "message": "Pro přihlášení pomocí SSO poskytněte toto ID svým členům." }, "unlinkSso": { - "message": "Odebrat podnikové přihlášení" + "message": "Zrušit propojení s SSO" }, "unlinkSsoConfirmation": { - "message": "Are you sure you want to unlink SSO for this organization?" + "message": "Opravdu chcete zrušit porpojení s SSO pro tuto organizaci?" }, "linkSso": { - "message": "Propojit s podnikovým přihlášením" + "message": "Propojit s SSO" }, "singleOrg": { "message": "Jedna organizace" @@ -3906,28 +3906,28 @@ "message": "Omezí uživatelům možnost připojit se k jiným organizacím." }, "singleOrgBlockCreateMessage": { - "message": "Vaše současná organizace má pravidla, která vám nedovolují připojit se k více než jedné organizaci. Obraťte se na správce organizace nebo se zaregistrujte z jiného účtu Bitwarden." + "message": "Vaše aktuální organizace má pravidla, která Vám nedovolují připojit se k více než jedné organizaci. Obraťte se na administrátory organizace nebo se zaregistrujte z jiného účtu na Bitwardenu." }, "singleOrgPolicyWarning": { - "message": "Členové organizace, kteří nejsou vlastníky nebo správci, a jsou již členy jiné organizace, budou odstraněni z vaší organizace." + "message": "Členové organizace, kteří nejsou vlastníky nebo administrátory a jsou již členy jiné organizace, budou odebrání z Vaší organizace." }, "requireSso": { - "message": "Ověření jednotného přihlášení" + "message": "Vyžadovat ověření jednotného přihlášení" }, "requireSsoPolicyDesc": { - "message": "Vyžaduje přihlášení uživatelů pomocí metody jednotného přihlášení." + "message": "Vyžaduje přihlášení uživatelů pomocí metody jednotného podnikového přihlášení." }, "prerequisite": { "message": "Předpoklady" }, "requireSsoPolicyReq": { - "message": "Před aktivací této politiky musí být povolena politika jednotné organizace." + "message": "Před aktivací této zásady musí být povolena jednotná pravidla organizace." }, "requireSsoPolicyReqError": { - "message": "Jednotná pravidla organizace není povolena." + "message": "Jednotná pravidla organizace nebyla nastavena." }, "requireSsoExemption": { - "message": "Majitelé a správci organizací jsou od prosazování těchto zásad osvobozeni." + "message": "Majitelé a administrátoři organizací jsou od prosazování těchto zásad osvobozeni." }, "sendTypeFile": { "message": "Soubor" @@ -3936,7 +3936,7 @@ "message": "Text" }, "createSend": { - "message": "Vytvořit nový Send", + "message": "Nový Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -3944,15 +3944,15 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send vytvořen", + "message": "Send byl uložen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Upravený Send", + "message": "Send byl uložen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "Send smazán", + "message": "Send byl smazán", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSend": { @@ -3960,7 +3960,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Jste si jisti, že chcete odstranit tento Send?", + "message": "Opravdu chcete smazat tento Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "whatTypeOfSend": { @@ -3968,14 +3968,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { - "message": "Datum odstranění" + "message": "Datum smazání" }, "deletionDateDesc": { "message": "Tento Send bude trvale smazán v určený datum a čas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Datum expirace" + "message": "Datum vypršení platnosti" }, "expirationDateDesc": { "message": "Je-li nastaveno, přístup k tomuto Send vyprší v daný datum a čas.", @@ -3989,7 +3989,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Počet aktuálních přístupů" + "message": "Aktuální počet přístupů" }, "sendPasswordDesc": { "message": "Volitelně vyžadovat heslo pro přístup k tomuto Send.", @@ -4003,30 +4003,30 @@ "message": "Zakázáno" }, "revoked": { - "message": "Revoked" + "message": "Odvoláno" }, "sendLink": { - "message": "Odkaz tohoto Send", + "message": "Odkaz pro Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLink": { - "message": "Zkopírovat odkaz Send", + "message": "Kopírovat odkaz pro Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Odstranit heslo" + "message": "Odebrat heslo" }, "removedPassword": { - "message": "Heslo odstraněno" + "message": "Heslo bylo odebráno" }, "removePasswordConfirmation": { - "message": "Jste si jisti, že chcete odstranit heslo?" + "message": "Opravdu chcete odebrat heslo?" }, "hideEmail": { - "message": "Skrýt mou e-mailovou adresu před příjemci." + "message": "Skrýt moji e-mailovou adresu před příjemci." }, "disableThisSend": { - "message": "Zakažte tento Send, aby k němu nikdo neměl přístup.", + "message": "Deaktivuje tento Send, díky čemuž k němu nebude moci nikdo přistoupit.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "allSends": { @@ -4037,17 +4037,17 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "pendingDeletion": { - "message": "Čeká na smazání" + "message": "Čekání na smazání" }, "expired": { "message": "Vypršela platnost" }, "searchSends": { - "message": "Hledat Sends", + "message": "Prohledat Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPassword": { - "message": "Toto Send je chráněno heslem. Pro pokračování zadejte prosím níže heslo.", + "message": "Tento Send je chráněn heslem. Pro pokračování zadejte níže heslo.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPasswordDontKnow": { @@ -4055,7 +4055,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendHiddenByDefault": { - "message": "Toto Send je ve výchozím nastavení skryté. Viditelnost můžete přepnout pomocí tlačítka níže.", + "message": "Tento Send je ve výchozím nastavení skrytý. Viditelnost můžete přepnout pomocí tlačítka níže.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "downloadFile": { @@ -4066,36 +4066,36 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "missingSendFile": { - "message": "Soubor přidružený tomuto Send nebyl nalezen.", + "message": "Soubor spojený s tímto Send nebyl nalezen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "noSendsInList": { - "message": "Nebyly nalezeny žádné Send položky.", + "message": "Žádné Sends k zobrazení.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "emergencyAccess": { "message": "Nouzový přístup" }, "emergencyAccessDesc": { - "message": "Udělit a spravovat nouzový přístup důvěryhodným kontaktům. Důvěryhodné kontakty mohou požádat o přístup k zobrazení nebo převzetí vašeho účtu v případě nouze. Navštivte naši stránku nápovědy pro více informací a podrobností o tom, jak funguje nulové sdílení znalostí." + "message": "Uděluje a spravuje nouzové přístupy důvěryhodným kontaktům. Důvěryhodné kontakty mohou požádat o přístup k zobrazení nebo převzetí Vašeho účtu v případě nouze. Navštivte naši stránku nápovědy pro více informací a podrobností o tom, jak funguje nulové sdílení znalostí." }, "emergencyAccessOwnerWarning": { - "message": "Jste vlastníkem jedné nebo více organizací. Pokud dáte přístup k převzetí nouzovému kontaktu, bude moci po převzetí použít všechna vaše oprávnění jako vlastník." + "message": "Jste vlastníkem jedné nebo více organizací. Pokud udělíte přístup k převzetí nouzovému kontaktu, bude moci po převzetí použít všechna Vaše oprávnění jako vlastník." }, "trustedEmergencyContacts": { "message": "Důvěryhodné nouzové kontakty" }, "noTrustedContacts": { - "message": "Zatím jste nepřidali žádné nouzové kontakty, pozvěte důvěryhodný kontakt, abyste mohli začít." + "message": "Zatím jste nepřidali žádné nouzové kontakty. Abyste mohli začít, pozvěte důvěryhodný kontakt." }, "addEmergencyContact": { "message": "Přidat nouzový kontakt" }, "designatedEmergencyContacts": { - "message": "Určeno jako nouzový kontakt" + "message": "Označen jako nouzový kontakt" }, "noGrantedAccess": { - "message": "Zatím jste nebyl určen jako nouzový kontakt pro nikoho." + "message": "Zatím jste nebyli pro nikoho označeni jako nouzový kontakt." }, "inviteEmergencyContact": { "message": "Pozvat nouzový kontakt" @@ -4104,22 +4104,22 @@ "message": "Upravit nouzový kontakt" }, "inviteEmergencyContactDesc": { - "message": "Pozvěte nový nouzový kontakt zadáním níže uvedené e-mailové adresy účtu Bitwarden. Pokud nemají Bitwarden účet, budou vyzváni k vytvoření nového účtu." + "message": "Pozvěte nový nouzový kontakt zadáním uvedené e-mailové adresy účtu na Bitwardenu. Pokud nemá účet na Bitwardenu, bude vyzván k vytvoření nového účtu." }, "emergencyAccessRecoveryInitiated": { - "message": "Nouzový přístup zahájen" + "message": "Nouzový přístup byl zahájen" }, "emergencyAccessRecoveryApproved": { - "message": "Nouzový přístup schválen" + "message": "Nouzový přístup byl schválen" }, "viewDesc": { - "message": "Může zobrazit všechny položky ve vašem trezoru." + "message": "Může zobrazit všechny položky ve Vašem trezoru." }, "takeover": { "message": "Převzetí" }, "takeoverDesc": { - "message": "Může obnovit váš účet s novým hlavním heslem." + "message": "Může resetovat Váš účet s novým hlavním heslem." }, "waitTime": { "message": "Čas čekání" @@ -4131,7 +4131,7 @@ "message": "1 den" }, "days": { - "message": "$DAYS$ dní", + "message": "$DAYS$ dnů", "placeholders": { "days": { "content": "$1", @@ -4143,7 +4143,7 @@ "message": "Uživatel byl pozván." }, "acceptEmergencyAccess": { - "message": "Byli jste pozváni, abyste se stali nouzovým kontaktem pro výše uvedené uživatele. Chcete-li přijmout pozvánku, musíte se přihlásit nebo vytvořit nový účet Bitwarden." + "message": "Byli jste pozváni, abyste se stali nouzovým kontaktem pro výše uvedeného uživatele. Chcete-li přijmout pozvánku, musíte se přihlásit nebo vytvořit nový účet na Bitwardenu." }, "emergencyInviteAcceptFailed": { "message": "Pozvánku nelze přijmout. Požádejte uživatele o zaslání nové pozvánky." @@ -4158,13 +4158,13 @@ } }, "emergencyInviteAcceptedDesc": { - "message": "Po potvrzení Vaší identity můžete pro tohoto uživatele přistupovat k nouzovým možnostem. Jakmile se tak stane, pošleme vám e-mail." + "message": "Po potvrzení Vaší identity můžete pro tohoto uživatele přistupovat k nouzovým možnostem. Jakmile se tak stane, pošleme Vám e-mail." }, "requestAccess": { "message": "Požádat o přístup" }, "requestAccessConfirmation": { - "message": "Jste si jisti, že chcete požádat o nouzový přístup? Přístup vám bude poskytnut po $WAITTIME$ dnech nebo po ručním schválení žádosti.", + "message": "Opravdu chcete požádat o nouzový přístup? Přístup Vám bude poskytnut po $WAITTIME$ dnech nebo po ručním schválení žádosti.", "placeholders": { "waittime": { "content": "$1", @@ -4173,7 +4173,7 @@ } }, "requestSent": { - "message": "Požádáno o nouzový přístup k $USER$. Jakmile bude možné pokračovat, budeme vás informovat e-mailem.", + "message": "Požádáno o nouzový přístup pro $USER$. Jakmile bude možné pokračovat, budeme Vás informovat e-mailem.", "placeholders": { "user": { "content": "$1", @@ -4188,7 +4188,7 @@ "message": "Odmítnout" }, "approveAccessConfirmation": { - "message": "Jste si jisti, že chcete schválit nouzový přístup? To umožní $USER$ $ACTION$ na váš účet.", + "message": "Opravdu chcete schválit nouzový přístup? To umožní uživateli $USER$ tuto akci ve Vašem účtu: $ACTION$.", "placeholders": { "user": { "content": "$1", @@ -4201,13 +4201,13 @@ } }, "emergencyApproved": { - "message": "Nouzový přístup byl schválen." + "message": "Nouzový přístup byl schválen" }, "emergencyRejected": { - "message": "Nouzový přístup odmítnut" + "message": "Nouzový přístup byl odmítnut" }, "passwordResetFor": { - "message": "Heslo obnoveno pro $USER$. Nyní se můžete přihlásit pomocí nového hesla.", + "message": "Pro $USER$ bylo obnoveno heslo. Nyní se můžete přihlásit pomocí nového hesla.", "placeholders": { "user": { "content": "$1", @@ -4216,59 +4216,59 @@ } }, "personalOwnership": { - "message": "Osobní vlastnictví" + "message": "Odebrat osobní trezor" }, "personalOwnershipPolicyDesc": { - "message": "Vyžaduje po uživatelích uložení položek trezoru do organizace odstraněním možnosti osobního vlastnictví." + "message": "Bude vyžadovat, aby členové ukládali položky do organizace tím, že odeberete možnost osobního trezoru." }, "personalOwnershipExemption": { - "message": "Majitelé a správci organizací jsou od prosazování těchto zásad osvobozeni." + "message": "Majitelé a administrátoři organizací jsou od prosazování těchto zásad osvobozeni." }, "personalOwnershipSubmitError": { - "message": "Vzhledem k podnikovým zásadám je zakázáno ukládat položky do vašeho osobního trezoru. Změňte možnost vlastnictví na organizaci a vyberte z dostupných kolekcí." + "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí." }, "disableSend": { - "message": "Deaktivovat Send" + "message": "Odebrat Send" }, "disableSendPolicyDesc": { - "message": "Nedovolit uživatelům vytvářet nebo upravovat Bitwarden Send. Smazání existujícího Send je stále povoleno.", + "message": "Nedovolí členům vytvářet a/nebo upravovat Sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { - "message": "Uživatelé organizace, kteří mohou spravovat zásady organizace, jsou osvobozeni od vynucování těchto zásad." + "message": "Uživatelé organizace, kteří mohou spravovat zásady organizace, jsou od prosazování těchto zásad osvobozeni." }, "sendDisabled": { - "message": "Send deaktivován", + "message": "Send odebrán", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Kvůli zásadám podniku můžete odstranit pouze existující Send.", + "message": "Z důvodu podnikových zásad můžete smazat pouze existující Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Nastavení Send", + "message": "Volby Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { - "message": "Nastavte možnosti pro vytváření a úpravy Sendů.", + "message": "Nastaví volby pro vytváření a úpravy Sends.", "description": "'Sends' is a plural noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsExemption": { - "message": "Uživatelé organizace, kteří mohou spravovat zásady organizace, jsou osvobozeni od vynucování těchto zásad." + "message": "Uživatelé organizace, kteří mohou spravovat zásady organizace, jsou od prosazování těchto zásad osvobozeni." }, "disableHideEmail": { - "message": "Nedovolte uživatelům skrýt svou e-mailovou adresu před příjemci při vytváření nebo úpravách Send.", + "message": "Při vytváření nebo úpravách Send vždy zobrazí e-mailovou adresu člena s příjemci.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { - "message": "V současné době platí následující zásady organizace:" + "message": "Aktuálně platí následující zásady organizace:" }, "sendDisableHideEmailInEffect": { "message": "Uživatelé nesmí při vytváření nebo úpravách Send skrýt svou e-mailovou adresu před příjemci.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "modifiedPolicyId": { - "message": "Změněné zásady $ID$.", + "message": "Byly změněny zásady $ID$.", "placeholders": { "id": { "content": "$1", @@ -4286,22 +4286,22 @@ "message": "Vlastní" }, "customDesc": { - "message": "Umožňuje větší kontrolu nad uživatelských oprávnění pro pokročilé konfigurace." + "message": "Uděluje vlastní oprávnění členům" }, "customDescNonEnterpriseStart": { - "message": "Custom roles is an ", + "message": "Vlastní role v ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseLink": { - "message": "enterprise feature", + "message": "podnikových funkcích", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseEnd": { - "message": ". Contact our support team to upgrade your subscription", + "message": ". Pro aktualizaci Vašeho předplatného kontaktujte náš tým podpory.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "To enable custom permissions the organization must be on an Enterprise 2020 plan." + "message": "Pro povolení vlastního oprávnění musí mít organizace plán Enterprise 2020." }, "permissions": { "message": "Oprávnění" @@ -4310,61 +4310,61 @@ "message": "Oprávnění" }, "managerPermissions": { - "message": "Spravovat oprávnění" + "message": "Oprávnění správce" }, "adminPermissions": { - "message": "Admin Permissions" + "message": "Oprávnění administrátora" }, "accessEventLogs": { - "message": "Přístup k logům" + "message": "Přístup k protokolům událostí" }, "accessImportExport": { "message": "Přístup k importu/exportu" }, "accessReports": { - "message": "Přístup k výkazům" + "message": "Přístup k hlášením" }, "missingPermissions": { - "message": "You lack the necessary permissions to perform this action." + "message": "K provedení této akce nemáte potřebná oprávnění." }, "manageAllCollections": { "message": "Správa všech kolekcí" }, "createNewCollections": { - "message": "Create new collections" + "message": "Vytváření nových kolekcí" }, "editAnyCollection": { - "message": "Upravit jakoukoliv kolekci" + "message": "Úprava jakékoli kolekce" }, "deleteAnyCollection": { - "message": "Odstranit jakoukoliv kolekci" + "message": "Smazání jakékoli kolekce" }, "manageAssignedCollections": { "message": "Správa přiřazených kolekcí" }, "editAssignedCollections": { - "message": "Edit assigned collections" + "message": "Úprava přiřazených kolekcí" }, "deleteAssignedCollections": { - "message": "Spravovat přiřazené kolekce" + "message": "Smazání přiřazené kolekce" }, "manageGroups": { - "message": "Spravovat skupiny" + "message": "Správa skupin" }, "managePolicies": { - "message": "Spravovat zásady" + "message": "Správa zásad" }, "manageSso": { - "message": "Spravovat SSO" + "message": "Správa SSO" }, "manageUsers": { - "message": "Spravovat uživatele" + "message": "Správa uživatelů" }, "manageResetPassword": { - "message": "Správa obnovení hesla" + "message": "Správa resetování hesla" }, "disableRequiredError": { - "message": "You must manually turn the $POLICYNAME$ policy before this policy can be turned off.", + "message": "Před vypnutím této zásady musíte ručně změnit zásadu $POLICYNAME$.", "placeholders": { "policyName": { "content": "$1", @@ -4376,13 +4376,13 @@ "message": "Zásady organizace ovlivňují možnosti vlastnictví." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "Zásady organizace zablokovaly importování položek do Vašeho osobního trezoru." }, "personalOwnershipCheckboxDesc": { - "message": "Zakázat osobní vlastnictví pro uživatele organizace" + "message": "Odebere osobní vlastnictví pro uživatele organizace" }, "textHiddenByDefault": { - "message": "Při přístupu k Send, skrýt text ve výchozím nastavení", + "message": "Při přístupu k Send skrýt text ve výchozím nastavení", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { @@ -4396,7 +4396,7 @@ "message": "Soubor, který chcete odeslat." }, "copySendLinkOnSave": { - "message": "Zkopírovat odkaz tohoto Send do mé schránky při uložení." + "message": "Zkopírujte odkaz pro sdílení tohoto Send do mé schránky při uložení." }, "sendLinkLabel": { "message": "Odkaz tohoto Send", @@ -4411,14 +4411,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineLearnMore": { - "message": "Zjistěte více o", + "message": "Dozvědět se více o", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**Learn more about** Bitwarden Send or sign up to try it today.'" }, "sendVaultCardProductDesc": { - "message": "Sdílejte text či soubory s kýmkoliv." + "message": "S kýmkoli můžete sdílet text či soubory." }, "sendVaultCardLearnMore": { - "message": "Zjistěte více", + "message": "Dozvědět se více", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**Learn more**, see how it works, or try it now. '" }, "sendVaultCardSee": { @@ -4446,11 +4446,11 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or **sign up** to try it today.'" }, "sendAccessTaglineTryToday": { - "message": "abyste to vyzkoušeli již dnes.", + "message": "abyste to vyzkoušeli ještě dnes.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or sign up to **try it today.**'" }, "sendCreatorIdentifier": { - "message": "Uživatel Bitwarden $USER_IDENTIFIER$ s vámi sdílel následující", + "message": "Uživatel Bitwarden $USER_IDENTIFIER$ s Vámi sdílí následující", "placeholders": { "user_identifier": { "content": "$1", @@ -4459,26 +4459,26 @@ } }, "viewSendHiddenEmailWarning": { - "message": "Uživatel Bitwarden, který vytvořil tento Send, se rozhodl skrýt svou e-mailovou adresu. Před použitím nebo stažením jeho obsahu byste se měli ujistit, že zdroji tohoto odkazu důvěřujete.", + "message": "Uživatel Bitwardenu, který vytvořil tento Send, se rozhodl skrýt svou e-mailovou adresu. Před použitím nebo stažením jeho obsahu byste se měli ujistit, že zdroji tohoto odkazu důvěřujete.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDateIsInvalid": { "message": "Uvedené datum vypršení platnosti není platné." }, "deletionDateIsInvalid": { - "message": "Uvedené datum odstranění není platné." + "message": "Uvedené datum smazání není platné." }, "expirationDateAndTimeRequired": { "message": "Je vyžadováno datum a čas vypršení platnosti." }, "deletionDateAndTimeRequired": { - "message": "Je vyžadováno datum a čas odstranění." + "message": "Je vyžadováno datum a čas smazání." }, "dateParsingError": { - "message": "Došlo k chybě při ukládání dat odstranění a vypršení platnosti." + "message": "Došlo k chybě při ukládání datumů smazání a vypršení platnosti." }, "webAuthnFallbackMsg": { - "message": "Chcete-li ověřit své dvoufaktorové ověření, klikněte na tlačítko níže." + "message": "Pro ověření dvoufaktorového ověření klepněte na tlačítko níže." }, "webAuthnAuthenticate": { "message": "Ověřit WebAuthn" @@ -4487,28 +4487,28 @@ "message": "WebAuthn není v tomto prohlížeči podporován." }, "webAuthnSuccess": { - "message": "WebAuthn úspěšně ověřen!
Tuto kartu můžete zavřít." + "message": "WebAuthn byl úspěšně ověřen! Můžete zavřít tuto kartu." }, "hintEqualsPassword": { - "message": "Nápověda k vašemu heslu nemůže být stejná jako vaše heslo." + "message": "Nápověda k Vašemu heslu nemůže být stejná jako Vaše heslo." }, "enrollPasswordReset": { - "message": "Zapsat do procesu obnovení hesla" + "message": "Zapsat do procesu resetování hesla" }, "enrolledPasswordReset": { - "message": "Zapsáno do procesu obnovení hesla" + "message": "Zapsáno do procesu resetování hesla" }, "withdrawPasswordReset": { - "message": "Odstoupit z obnovení hesla" + "message": "Odstoupit z procesu resetování hesla" }, "enrollPasswordResetSuccess": { - "message": "Zapsání bylo úspěšné!" + "message": "Zápis byl úspěšný!" }, "withdrawPasswordResetSuccess": { "message": "Odstoupení bylo úspěšné!" }, "eventEnrollPasswordReset": { - "message": "Uživatel $ID$ se zapsal do pomoci s obnovením hesla.", + "message": "Uživatel $ID$ se zapsal do procesu s resetováním hesla.", "placeholders": { "id": { "content": "$1", @@ -4517,7 +4517,7 @@ } }, "eventWithdrawPasswordReset": { - "message": "Uživatel $ID$ odstoupil z pomoci s obnovením hesla.", + "message": "Uživatel $ID$ odstoupil z procesu resetování hesla.", "placeholders": { "id": { "content": "$1", @@ -4526,7 +4526,7 @@ } }, "eventAdminPasswordReset": { - "message": "Hlavní heslo uživatele $ID$ obnoveno.", + "message": "Hlavní heslo uživatele $ID$ bylo resetováno.", "placeholders": { "id": { "content": "$1", @@ -4535,7 +4535,7 @@ } }, "eventResetSsoLink": { - "message": "Reset SSO link for user $ID$", + "message": "Resetováno propojení s SSO pro uživatele $ID$", "placeholders": { "id": { "content": "$1", @@ -4544,7 +4544,7 @@ } }, "firstSsoLogin": { - "message": "$ID$ logged in using Sso for the first time", + "message": "Uživatel $ID$ se poprvé přihlásil pomocí SSO", "placeholders": { "id": { "content": "$1", @@ -4553,10 +4553,10 @@ } }, "resetPassword": { - "message": "Obnovit heslo" + "message": "Resetovat heslo" }, "resetPasswordLoggedOutWarning": { - "message": "Pokračováním odhlásíte $NAME$ z aktuální relace, což znamená, že se budou muset znovu přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny.", + "message": "Pokračováním odhlásíte $NAME$ z aktuální relace, což znamená, že se bude muset znovu přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny.", "placeholders": { "name": { "content": "$1", @@ -4571,25 +4571,25 @@ "message": "Jedna nebo více zásad organizace vyžaduje, aby hlavní heslo splňovalo následující požadavky:" }, "resetPasswordSuccess": { - "message": "Heslo bylo úspěšně obnoveno!" + "message": "Heslo bylo úspěšně resetováno!" }, "resetPasswordEnrollmentWarning": { - "message": "Registrace umožní správcům organizace změnit vaše hlavní heslo. Opravdu se chcete zaregistrovat?" + "message": "Zápis umožní správcům organizace změnit Vaše hlavní heslo" }, "resetPasswordPolicy": { - "message": "Obnovení hlavního hesla" + "message": "Resetování hlavního hesla" }, "resetPasswordPolicyDescription": { - "message": "Povolte správcům v organizaci resetovat hlavní heslo uživatelů organizace." + "message": "Povolí administrátorům v organizaci resetovat hlavní hesla uživatelů organizace." }, "resetPasswordPolicyWarning": { - "message": "Uživatelé v organizaci se budou muset sami zaregistrovat nebo být automaticky zaregistrovaní předtím, než budou moct správcové resetovat jejich hlavní heslo." + "message": "Uživatelé v organizaci se budou muset sami zaregistrovat nebo být automaticky zaregistrovaní předtím, než budou moci administrátoři resetovat jejich hlavní heslo." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatická registrace" }, "resetPasswordPolicyAutoEnrollDescription": { - "message": "Jakmile bude jejich pozvání přijato, všichni uživatelé budou automaticky zaregistrováni do obnovení hesla." + "message": "Jakmile bude jejich pozvání přijato, všichni uživatelé budou automaticky zaregistrováni do resetování hesla." }, "resetPasswordPolicyAutoEnrollWarning": { "message": "Uživatelé, kteří jsou již v organizaci, nebudou zpětně zaregistrováni do obnovení hesla. Než budou moci správci obnovit hlavní heslo, budou se muset zaregistrovat sami." @@ -4598,13 +4598,13 @@ "message": "Automaticky zaregistrovat nové uživatele" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Tato organizace má podnikové zásady, které vás automaticky zaregistrují k obnovení hesla. Registrace umožní správcům organizace změnit vaše hlavní heslo." + "message": "Tato organizace má podnikové zásady, které Vás automaticky zaregistrují k obnovení hesla. Registrace umožní administrátorům organizace změnit Vaše hlavní heslo." }, "resetPasswordOrgKeysError": { "message": "Odpověď klíčů organizace je prázdná" }, "resetPasswordDetailsError": { - "message": "Odpověď na obnovení hesla je prázdná" + "message": "Odpověď na resetování hesla je prázdná" }, "trashCleanupWarning": { "message": "Položky, které byly v koši déle než 30 dní, budou automaticky smazány." @@ -4619,13 +4619,13 @@ "message": "Potvrzení hlavního hesla" }, "passwordConfirmationDesc": { - "message": "Tato akce je chráněna. Chcete-li pokračovat, zadejte znovu vaše hlavní heslo, abychom ověřili vaší totožnost." + "message": "Tato akce je chráněna. Chcete-li pokračovat, zadejte znovu Vaše hlavní heslo pro ověření Vaší totožnosti." }, "reinviteSelected": { - "message": "Znovu odeslat pozvánky" + "message": "Znovu poslat pozvánky" }, "resendNotification": { - "message": "Resend notification" + "message": "Znovu odeslat oznámení" }, "noSelectedUsersApplicable": { "message": "Tuto akci nelze použít na žádného z vybraných uživatelů." @@ -4634,16 +4634,16 @@ "message": "Opravdu chcete odebrat následující uživatele? Proces může trvat několik sekund a nelze jej přerušit ani zrušit." }, "removeOrgUsersConfirmation": { - "message": "When member(s) are removed, they no longer have access to organization data and this action is irreversible. To add the member back to the organization, they must be invited and onboarded again. The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "Po odebrání člena již nebude mít přístup k údajům organizace a tato akce je nevratná. Chcete-li člena přidat zpět do organizace, je třeba jej znovu pozvat a přijmout. Tento proces může trvat několik sekund a nelze jej přerušit ani zrušit." }, "revokeUsersWarning": { - "message": "When member(s) are revoked, they no longer have access to organization data. To quickly restore member access, go to the Revoked tab. The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "Po odvolání člena již nebude mít přístup k údajům organizace a tato akce je nevratná. Chcete-li člena rychle přidat zpět do organizace, je třeba jej znovu pozvat a přijmout. Tento proces může trvat několik sekund a nelze jej přerušit ani zrušit." }, "theme": { "message": "Motiv" }, "themeDesc": { - "message": "Vyberte si šablonu pro váš webový trezor." + "message": "Zvolte šablonu pro Váš webový trezor." }, "themeSystem": { "message": "Použít systémový motiv" @@ -4661,22 +4661,22 @@ "message": "Stav hromadné akce" }, "bulkConfirmMessage": { - "message": "Úspěšně potvrzeno." + "message": "Úspěšně potvrzeno" }, "bulkReinviteMessage": { - "message": "Znovu úspěšně pozváno." + "message": "Znovu úspěšně pozváno" }, "bulkRemovedMessage": { - "message": "Úspěšně odstraněno" + "message": "Úspěšně odebráno" }, "bulkRevokedMessage": { - "message": "Revoked organization access successfully" + "message": "Úspěšně odvolán přístup do organizace" }, "bulkRestoredMessage": { - "message": "Restored organization access successfully" + "message": "Úspěšně obnoven přístup do organizace" }, "bulkFilteredMessage": { - "message": "Vyloučené, neplatí pro tuto akci." + "message": "Vyloučené, neplatí pro tuto akci" }, "fingerprint": { "message": "Otisk prstu" @@ -4685,10 +4685,10 @@ "message": "Odebrat uživatele" }, "revokeUsers": { - "message": "Revoke users" + "message": "Odvolat uživatele" }, "restoreUsers": { - "message": "Restore users" + "message": "Obnovit uživatele" }, "error": { "message": "Chyba" @@ -4700,29 +4700,29 @@ "message": "Nastavení poskytovatele" }, "setupProviderLoginDesc": { - "message": "Byli jste pozváni k nastavení nového poskytovatele. Chcete-li pokračovat, musíte se přihlásit nebo vytvořit nový Bitwarden účet." + "message": "Byli jste pozváni k nastavení nového poskytovatele. Chcete-li pokračovat, musíte se přihlásit nebo vytvořit nový účet na Bitwardenu." }, "setupProviderDesc": { - "message": "Pro dokončení nastavení poskytovatele, zadejte prosím níže uvedené údaje. Pokud máte nějaké dotazy, kontaktujte zákaznickou podporu." + "message": "Pro dokončení nastavení poskytovatele, zadejte níže uvedené údaje. Pokud máte nějaké dotazy, kontaktujte zákaznickou podporu." }, "providerName": { - "message": "Jméno poskytovatele" + "message": "Název poskytovatele" }, "providerSetup": { - "message": "Poskytovatel byl vytvořen." + "message": "Poskytovatel byl úspěšně vytvořen" }, "clients": { "message": "Klienti" }, "client": { - "message": "Client", + "message": "Klient", "description": "This is used as a table header to describe which client application created an event log." }, "providerAdmin": { "message": "Administrátor poskytovatele" }, "providerAdminDesc": { - "message": "Uživatel s nejvyšším oprávněním, který může spravovat všechny aspekty vašeho poskytovatele a také přístup a správu klientských organizací." + "message": "Uživatel s nejvyšším oprávněním, který může spravovat všechny aspekty Vašeho poskytovatele a také přístup a správu klientských organizací." }, "serviceUser": { "message": "Servisní uživatel" @@ -4731,31 +4731,31 @@ "message": "Servisní uživatelé mohou přistupovat ke všem klientským organizacím a spravovat je." }, "providerInviteUserDesc": { - "message": "Invite a new user to your Provider by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." + "message": "Pozvěte nového uživatele k Vašemu poskytovateli zadáním e-mailové adresy jeho účtu na Bitwardenu. Pokud ještě nemá účet na Bitwardenu, bude vyzván k vytvoření nového účtu." }, "joinProvider": { - "message": "Join Provider" + "message": "Připojit se k poskytovateli" }, "joinProviderDesc": { - "message": "You've been invited to join the Provider listed above. To accept the invitation, you need to log in or create a new Bitwarden account." + "message": "Byly jste pozváni se připojit k výše uvedenému poskytovateli. Pro přijetí pozvánky se musíte přihlásit nebo si založit nový účet na Bitwardenu." }, "providerInviteAcceptFailed": { - "message": "Unable to accept invitation. Ask a Provider admin to send a new invitation." + "message": "Nelze přijmout pozvánku. Požádejte administrátora poskytovatele o zaslání nové pozvánky." }, "providerInviteAcceptedDesc": { - "message": "You can access this Provider once an administrator confirms your membership. We'll send you an email when that happens." + "message": "K tomuto poskytovateli můžete přistupovat jakmile administrátor potvrdí Vaše členství. Až se tak stane, pošleme Vám e-mail." }, "providerUsersNeedConfirmed": { - "message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the Provider until they are confirmed." + "message": "Někteří uživatelé přijali pozvánku, ale nejdříve musí být potvrzeni. Dokud nedojde k potvrzení, nebudou mít tito uživatelé přístup k poskytovateli." }, "provider": { "message": "Poskytovatel" }, "newClientOrganization": { - "message": "New client organization" + "message": "Nová organizace klienta" }, "newClientOrganizationDesc": { - "message": "Create a new client organization that will be associated with you as the Provider. You will be able to access and manage this organization." + "message": "Vytvoří novou organizaci klienta, která bude spojena s Vámi jako poskytovatel. Budete mít přístup a budete moci spravovat tuto organizaci." }, "addExistingOrganization": { "message": "Přidat existující organizaci" @@ -4764,7 +4764,7 @@ "message": "Můj poskytovatel" }, "addOrganizationConfirmation": { - "message": "Are you sure you want to add $ORGANIZATION$ as a client to $PROVIDER$?", + "message": "Opravdu chcete přidat $ORGANIZATION$ jako klienta pro $PROVIDER$?", "placeholders": { "organization": { "content": "$1", @@ -4777,10 +4777,10 @@ } }, "organizationJoinedProvider": { - "message": "Organization was successfully added to the Provider" + "message": "Organizace byla úspěšně přidána k poskytovateli" }, "accessingUsingProvider": { - "message": "Accessing organization using Provider $PROVIDER$", + "message": "Přistupování k organizaci pomocí poskytovatele $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -4789,13 +4789,13 @@ } }, "providerIsDisabled": { - "message": "Provider suspended" + "message": "Poskytovatel byl deaktivován" }, "providerUpdated": { - "message": "Provider saved" + "message": "Poskytovatel byl uložen" }, "yourProviderIs": { - "message": "Your Provider is $PROVIDER$. They have administrative and billing privileges for your organization.", + "message": "Váš poskytovatel je $PROVIDER$. Ma administrátorská a fakturační oprávnění pro Vaši organizaci.", "placeholders": { "provider": { "content": "$1", @@ -4804,7 +4804,7 @@ } }, "detachedOrganization": { - "message": "The organization $ORGANIZATION$ has been detached from your Provider.", + "message": "Organizace $ORGANIZATION$ byla oddělena od Vašeho poskytovatele.", "placeholders": { "organization": { "content": "$1", @@ -4813,22 +4813,22 @@ } }, "detachOrganizationConfirmation": { - "message": "Are you sure you want to detach this organization? The organization will continue to exist but will no longer be managed by the Provider." + "message": "Opravdu chcete oddělit tuto organizaci? Organizace bude nadále existovat, ale již nebude spravována poskytovatelem." }, "add": { "message": "Přidat" }, "updatedMasterPassword": { - "message": "Hlavní heslo aktualizováno" + "message": "Hlavní heslo bylo aktualizováno" }, "updateMasterPassword": { "message": "Aktualizovat hlavní heslo" }, "updateMasterPasswordWarning": { - "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Administrátor v organizaci nedávno změnil Vaše hlavní heslo. Pro přístup k trezoru jej nyní musíte změnit. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se znovu přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny." }, "masterPasswordInvalidWarning": { - "message": "Your master password does not meet the policy requirements of this organization. In order to join the organization, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Vaše hlavní heslo nesplňuje zásady Vaší organizace. Pro přístup k organizaci musíte nyní aktualizovat své hlavní heslo. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny." }, "updateWeakMasterPasswordWarning": { "message": "Vaše hlavní heslo nesplňuje jednu nebo více zásad Vaší organizace. Pro přístup k trezoru musíte nyní aktualizovat své hlavní heslo. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny." @@ -4837,22 +4837,22 @@ "message": "Časový limit trezoru" }, "maximumVaultTimeoutDesc": { - "message": "Nastavení maximálního časového limitu trezoru pro všechny uživatele." + "message": "Nastaví maximální časový limit trezoru pro všechny uživatele." }, "maximumVaultTimeoutLabel": { - "message": "Maximum vault timeout" + "message": "Maximální časový limit trezoru" }, "invalidMaximumVaultTimeout": { - "message": "Invalid maximum vault timeout." + "message": "Neplatný maximální časový limit trezoru." }, "hours": { - "message": "Hodin" + "message": "Hodiny" }, "minutes": { - "message": "Minut" + "message": "Minuty" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "Zásady Vaší organizace nastavily maximální povolený časový limit trezoru na $HOURS$ hodin a $MINUTES$ minut.", "placeholders": { "hours": { "content": "$1", @@ -4891,205 +4891,205 @@ } }, "customVaultTimeout": { - "message": "Custom vault timeout" + "message": "Vlastní časový limit trezoru" }, "vaultTimeoutToLarge": { - "message": "Your vault timeout exceeds the restriction set by your organization." + "message": "Časový limit Vašeho trezoru překračuje omezení stanovená Vaší organizací." }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Minimální vlastní časový limit je 1 minuta." }, "vaultTimeoutRangeError": { - "message": "Vault timeout is not within allowed range." + "message": "Časový limit trezoru není v rámci povoleného rozsahu." }, "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "message": "Odebrat osobní export trezoru" }, "disablePersonalVaultExportDesc": { - "message": "Do not allow members to export their individual vault data." + "message": "Nedovolí, aby členové exportovali svá osobní data trezoru." }, "vaultExportDisabled": { - "message": "Vault export removed" + "message": "Export trezoru byl odebrán" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your individual vault." + "message": "Jedna nebo více zásad organizace Vám brání v exportu Vašeho osobního trezoru." }, "activateAutofill": { - "message": "Activate auto-fill" + "message": "Aktivovat automatické vyplnění" }, "activateAutofillPolicyDesc": { "message": "Aktivuje automatické vyplnění při načítání stránky pro rozšíření prohlížeče pro všechny existující i nové členy." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Kompromitované nebo nedůvěryhodné webové stránky mohou zneužívat automatické vyplňování při načítání stránky." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Více informací o automatickém vyplňování" }, "selectType": { - "message": "Select SSO type" + "message": "Zvolte typ SSO" }, "type": { "message": "Typ" }, "openIdConnectConfig": { - "message": "OpenID connect configuration" + "message": "Konfigurace připojení OpenID" }, "samlSpConfig": { - "message": "SAML service provider configuration" + "message": "Konfigurace servisního poskytovatele SAML" }, "samlIdpConfig": { - "message": "SAML identity provider configuration" + "message": "Konfigurace poskytovatele identit SAML" }, "callbackPath": { - "message": "Callback path" + "message": "Cesta zpětného volání" }, "signedOutCallbackPath": { - "message": "Signed out callback path" + "message": "Odhlášeno od cesty zpětného volání" }, "authority": { - "message": "Authority" + "message": "Autorita" }, "clientId": { - "message": "Client ID" + "message": "ID klienta" }, "clientSecret": { - "message": "Client secret" + "message": "Tajný klíč klienta" }, "metadataAddress": { - "message": "Metadata address" + "message": "Adresa metadat" }, "oidcRedirectBehavior": { - "message": "OIDC redirect behavior" + "message": "Chování přesměrování ODIC" }, "getClaimsFromUserInfoEndpoint": { - "message": "Get claims from user info endpoint" + "message": "Získat nároky z koncového bodu informací o uživateli" }, "additionalScopes": { - "message": "Custom scopes" + "message": "Vlastní rozsahy" }, "additionalUserIdClaimTypes": { - "message": "Custom user ID claim types" + "message": "Typy nároků vlastního ID uživatele" }, "additionalEmailClaimTypes": { - "message": "Email claim types" + "message": "Typy e-mailových nároků" }, "additionalNameClaimTypes": { - "message": "Custom name claim types" + "message": "Typy nároků vlastních jmen" }, "acrValues": { - "message": "Requested authentication context class reference values" + "message": "Požadované referenční hodnoty kontextové třídy ověřování" }, "expectedReturnAcrValue": { - "message": "Expected \"acr\" claim value in response" + "message": "Očekávaná hodnota nároku \"acr\" v odpovědi" }, "spEntityId": { - "message": "SP entity ID" + "message": "ID entity SP" }, "spMetadataUrl": { - "message": "SAML 2.0 metadata URL" + "message": "URL metadat SAML 2.0" }, "spAcsUrl": { - "message": "Assertion consumer service (ACS) URL" + "message": "URL ACS (Assertion Consumer Service)" }, "spNameIdFormat": { - "message": "Formát jména ID" + "message": "Formát ID názvu" }, "spOutboundSigningAlgorithm": { - "message": "Outbound signing algorithm" + "message": "Algoritmus odchozího podepisování" }, "spSigningBehavior": { - "message": "Signing behavior" + "message": "Chování podepisování" }, "spMinIncomingSigningAlgorithm": { - "message": "Minimum incoming signing algorithm" + "message": "Minimální příchozí podepisovací algoritmus" }, "spWantAssertionsSigned": { - "message": "Expect signed assertions" + "message": "Očekávaná podepsaná tvrzení" }, "spValidateCertificates": { - "message": "Validate certificates" + "message": "Ověřit certifikáty" }, "idpEntityId": { - "message": "ID subjektu" + "message": "ID entity" }, "idpBindingType": { - "message": "Binding type" + "message": "Typ vazby" }, "idpSingleSignOnServiceUrl": { - "message": "Single sign-on service URL" + "message": "URL pro jednotné přihlášení" }, "idpSingleLogoutServiceUrl": { - "message": "Single log-out service URL" + "message": "URL pro jednotné odhlášení" }, "idpX509PublicCert": { - "message": "X509 public certificate" + "message": "Veřejný certifikát X509" }, "idpOutboundSigningAlgorithm": { - "message": "Outbound signing algorithm" + "message": "Algoritmus odchozího podepisování" }, "idpAllowUnsolicitedAuthnResponse": { - "message": "Allow unsolicited authentication response" + "message": "Umožnit nevyžádanou ověřovací odpověď" }, "idpAllowOutboundLogoutRequests": { - "message": "Allow outbound logout requests" + "message": "Umožnit odchozí požadavky na odhlášení" }, "idpSignAuthenticationRequests": { - "message": "Sign authentication requests" + "message": "Požadavky na ověření podpisu" }, "ssoSettingsSaved": { - "message": "Single sign-on configuration saved" + "message": "Konfigurace jednotného přihlášení byla uložena" }, "sponsoredFamilies": { "message": "Free Bitwarden Families" }, "sponsoredFamiliesEligible": { - "message": "You and your family are eligible for Free Bitwarden Families. Redeem with your personal email to keep your data secure even when you are not at work." + "message": "Vy a Vaše rodina máte nárok na Free Bitwarden Families. Nárok můžete uplatnit Vaším osobním e-mailem, abyste zajistili bezpečnost Vašich dat, i když nejste v práci." }, "sponsoredFamiliesEligibleCard": { - "message": "Redeem your Free Bitwarden for Families plan today to keep your data secure even when you are not at work." + "message": "Uplatněte ještě dnes svůj plán Free Bitwarden for Families, aby byla Vaše data bezpečná, i když nejste v práci." }, "sponsoredFamiliesInclude": { - "message": "The Bitwarden for Families plan include" + "message": "Plán Bitwarden for Families obsahuje" }, "sponsoredFamiliesPremiumAccess": { - "message": "Premium access for up to 6 users" + "message": "Prémiový přístup až pro 6 uživatelů" }, "sponsoredFamiliesSharedCollections": { - "message": "Shared collections for Family secrets" + "message": "Sdílené kolekce pro tajné klíče rodiny" }, "badToken": { - "message": "The link is no longer valid. Please have the sponsor resend the offer." + "message": "Odkaz již není platný. Požádejte sponzora o opakované odeslání nabídky." }, "reclaimedFreePlan": { - "message": "Reclaimed free plan" + "message": "Bezplatný plán byl znovu nárokován" }, "redeem": { - "message": "Redeem" + "message": "Uplatnit" }, "sponsoredFamiliesSelectOffer": { - "message": "Select the organization you would like sponsored" + "message": "Vyberte organizaci, kterou chcete sponzorovat" }, "familiesSponsoringOrgSelect": { - "message": "Which Free Families offer would you like to redeem?" + "message": "Kterou nabídku Bitwarden Families chcete uplatnit?" }, "sponsoredFamiliesEmail": { - "message": "Enter your personal email to redeem Bitwarden Families" + "message": "Pro uplatnění Bitwarden Families zadejte Váš osobní e-mail" }, "sponsoredFamiliesLeaveCopy": { - "message": "If you remove an offer or are removed from the sponsoring organization, your Families sponsorship will expire at the next renewal date." + "message": "Pokud odeberete nabídku nebo budete odebráni ze sponzorské organizace, Vaše sponzorství rodiny vyprší k dalšímu datu obnovy." }, "acceptBitwardenFamiliesHelp": { - "message": "Accept offer for an existing organization or create a new Families organization." + "message": "Přijmout nabídku pro existující organizaci nebo vytvořit novou organizaci rodin." }, "setupSponsoredFamiliesLoginDesc": { - "message": "You've been offered a free Bitwarden Families plan organization. To continue, you need to log in to the account that received the offer." + "message": "Byla Vám nabídnuta bezplatná organizace plánu Bitwarden Families. Chcete-li pokračovat, musíte se přihlásit k účtu, který obdržel nabídku." }, "sponsoredFamiliesAcceptFailed": { - "message": "Unable to accept offer. Please resend the offer email from your Enterprise account and try again." + "message": "Nelze přijmout nabídku. Znovu odešlete e-mail s nabídkou z účtu Enterprise a zkuste to znovu." }, "sponsoredFamiliesAcceptFailedShort": { - "message": "Unable to accept offer. $DESCRIPTION$", + "message": "Nelze přijmout nabídku. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -5098,19 +5098,19 @@ } }, "sponsoredFamiliesOffer": { - "message": "Accept Free Bitwarden Families" + "message": "Přijmout Free Bitwarden Families" }, "sponsoredFamiliesOfferRedeemed": { - "message": "Free Bitwarden Families offer successfully redeemed" + "message": "Nabídka Free Bitwarden Families byla úspěšně uplatněna" }, "redeemed": { - "message": "Redeemed" + "message": "Uplatněno" }, "redeemedAccount": { - "message": "Account redeemed" + "message": "Účet byl uplatněn" }, "revokeAccount": { - "message": "Revoke account $NAME$", + "message": "Odvolat účet $NAME$", "placeholders": { "name": { "content": "$1", @@ -5119,7 +5119,7 @@ } }, "resendEmailLabel": { - "message": "Resend sponsorship email to $NAME$ sponsorship", + "message": "Znovu poslat sponzorský e-mail pro sponzorství $NAME$", "placeholders": { "name": { "content": "$1", @@ -5128,61 +5128,61 @@ } }, "freeFamiliesPlan": { - "message": "Free Families plan" + "message": "Plán Free Families" }, "redeemNow": { - "message": "Redeem now" + "message": "Uplatnit nyní" }, "recipient": { - "message": "Recipient" + "message": "Příjemce" }, "removeSponsorship": { - "message": "Remove sponsorship" + "message": "Odebrat sponzorství" }, "removeSponsorshipConfirmation": { - "message": "After removing a sponsorship, you will be responsible for this subscription and related invoices. Are you sure you want to continue?" + "message": "Po odebrání sponzorství budete zodpovědni za toto předplatné a související faktury. Opravdu chcete pokračovat?" }, "sponsorshipCreated": { - "message": "Sponsorship created" + "message": "Sponzorství bylo vytvořeno" }, "emailSent": { - "message": "Email odeslán" + "message": "E-mail byl odeslán" }, "revokeSponsorshipConfirmation": { - "message": "After removing this account, the Families plan sponsorship will expire at the end of the billing period. You will not be able to redeem a new sponsorship offer until the existing one expires. Are you sure you want to continue?" + "message": "Po odebrání tohoto účtu vyprší sponzorování rodinného plánu na konci fakturační doby. Nebudete moci uplatnit novou nabídku sponzorování, dokud stávající neskončí. Opravdu chcete pokračovat?" }, "removeSponsorshipSuccess": { - "message": "Sponsorship removed" + "message": "Sponzorství bylo odebráno" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Chyba Key Connector: ujistěte se, že je Key Connector k dispozici a funguje správně." }, "keyConnectorUrl": { - "message": "Key Connector URL" + "message": "URL Key Connectoru" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "Poslat ověřovací kód na Váš e-mail" }, "sendCode": { - "message": "Send code" + "message": "Poslat kód" }, "codeSent": { - "message": "Code sent" + "message": "Kód byl odeslán" }, "verificationCode": { "message": "Ověřovací kód" }, "confirmIdentity": { - "message": "Confirm your identity to continue." + "message": "Pro pokračování potvrďte svou identitu." }, "verificationCodeRequired": { - "message": "Verification code is required." + "message": "Je vyžadován ověřovací kód." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "Neplatný ověřovací kód" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "$ORGANIZATION$ používá SSO s vlastním serverem s klíči. Hlavní heslo pro členy této organizace již není vyžadováno.", "placeholders": { "organization": { "content": "$1", @@ -5191,37 +5191,37 @@ } }, "leaveOrganization": { - "message": "Leave organization" + "message": "Opustit organizaci" }, "removeMasterPassword": { - "message": "Remove master password" + "message": "Odebrat hlavní heslo" }, "removedMasterPassword": { - "message": "Master password removed" + "message": "Hlavní heslo bylo odebráno" }, "allowSso": { - "message": "Allow SSO authentication" + "message": "Povolit ověření přes SSO" }, "allowSsoDesc": { - "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." + "message": "Po nastavení bude Vaše konfigurace uložena a členové se budou moci ověřit pomocí jejich přihlašovacích údajů poskytovatele identity." }, "ssoPolicyHelpStart": { - "message": "Use the", + "message": "Použít", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpLink": { - "message": "require single-sign-on authentication policy", + "message": "vyžadování zásad ověření jednotným přihlášením", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { - "message": "to require all members to log in with SSO.", + "message": "pro to, aby se všichni členové přihlašovali pomocí SSO.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "memberDecryptionOption": { - "message": "Member decryption options" + "message": "Volby dešifrování členů" }, "memberDecryptionPassDesc": { - "message": "Once authenticated, members will decrypt vault data using their master passwords." + "message": "Po ověření budou členové dešifrovat data v trezoru pomocí jejich hlavních hesel." }, "keyConnector": { "message": "Key Connector" @@ -5239,124 +5239,124 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { - "message": "\"Login with SSO and Key Connector Decryption\" is activated. This policy will only apply to owners and admins." + "message": "Je aktivní volba \"Přihlásit se s SSO a dešifrováním Key Connectorem\". Zásady se budou vztahovat jen na vlastníky a adminostrátory." }, "enabledSso": { - "message": "SSO turned on" + "message": "SSO je zapnuto" }, "disabledSso": { - "message": "SSO turned on" + "message": "SSO je vypnuto" }, "enabledKeyConnector": { - "message": "Key Connector activated" + "message": "Je aktivován Key Connector" }, "disabledKeyConnector": { - "message": "Key Connector deactivated" + "message": "Key Connector je deaktivován" }, "keyConnectorWarning": { - "message": "Once members begin using Key Connector, your organization cannot revert to master password decryption. Proceed only if you are comfortable deploying and managing a key server." + "message": "Jakmile členové začnou používat Key Connector, Vaše organizace se nemůže vrátit k dešifrování hlavního hesla. Pokračujte jen v případě, že bez problémů dokážete nasadit a spravovat server s klíči." }, "migratedKeyConnector": { - "message": "Migrated to Key Connector" + "message": "Migrováno do Key Connectoru" }, "paymentSponsored": { - "message": "Please provide a payment method to associate with the organization. Don't worry, we won't charge you anything unless you select additional features or your sponsorship expires. " + "message": "Zadejte metodu platby, která se připojí k organizaci. Nebudeme Vám nic účtovat, dokud nevyberete další funkce nebo dokud nevyprší Vaše sponzorství. " }, "orgCreatedSponsorshipInvalid": { - "message": "The sponsorship offer has expired. You may delete the organization you created to avoid a charge at the end of your 7 day trial. Otherwise you may close this prompt to keep the organization and assume billing responsibility." + "message": "Nabídka sponzorství vypršela. Vytvořenou organizaci můžete smazat, abyste se vyhnuli poplatku na konci 7denní zkušební doby. V opačném případě můžete tuto výzvu zavřít, abyste si organizaci ponechali a převzali odpovědnost za vyúčtování." }, "newFamiliesOrganization": { - "message": "New Families organization" + "message": "Nová organizace Families" }, "acceptOffer": { - "message": "Accept offer" + "message": "Přijmout Nabídku" }, "sponsoringOrg": { - "message": "Sponsoring organization" + "message": "Sponzorující organizace" }, "keyConnectorTest": { "message": "Test" }, "keyConnectorTestSuccess": { - "message": "Success! Key Connector reached." + "message": "Úspěch! Byl kontaktován Key Connector." }, "keyConnectorTestFail": { - "message": "Cannot reach Key Connector. Check URL." + "message": "Nelze kontaktovat Key Connector. Zkontrolujte URL." }, "sponsorshipTokenHasExpired": { - "message": "The sponsorship offer has expired." + "message": "Nabídka sponzorství již vypršela." }, "freeWithSponsorship": { - "message": "FREE with sponsorship" + "message": "ZDARMA se sponzorstvím" }, "viewBillingSyncToken": { - "message": "View billing sync token" + "message": "Zobrazit fakturační synchronizační token" }, "generateBillingSyncToken": { - "message": "Generate billing sync token" + "message": "Vygenerovat fakturační synchronizační token" }, "copyPasteBillingSync": { - "message": "Copy and paste this token into the billing sync settings of your self-hosted organization." + "message": "Zkopírujte a vložte tento token do nastavení fakturační synchronizace vlastní organizace." }, "billingSyncCanAccess": { - "message": "Your billing sync token can access and edit this organization's subscription settings." + "message": "Fakturační synchronizační token může přistupovat k nastavení předplatného této organizace a upravovat jej." }, "manageBillingSync": { - "message": "Manage billing sync" + "message": "Spravovat fakturační synchronizaci" }, "setUpBillingSync": { - "message": "Set up billing sync" + "message": "Nastavit fakturační synchronizaci" }, "generateToken": { - "message": "Generate token" + "message": "Vygenerovat token" }, "rotateToken": { - "message": "Rotate token" + "message": "Měnit token" }, "rotateBillingSyncTokenWarning": { - "message": "If you proceed, you will need to re-setup billing sync on your self-hosted server." + "message": "Pokud budete pokračovat, budete muset znovu nastavit fakturační synchronizaci na vlastním serveru." }, "rotateBillingSyncTokenTitle": { - "message": "Rotating the billing sync token will invalidate the previous token." + "message": "Měnění fakturačního synchronizačního tokenu zruší platnost předchozího tokenu." }, "selfHostingTitle": { - "message": "Self-hosting" + "message": "Vlastní hosting" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." + "message": "Pro nastavení organizace na vlastním serveru musíte nahrát licenční soubor. Chcete-li podporovat plány Free Families a pokročilé možnosti fakturace pro Vaši organizaci na vlastním serveru, budete muset nastavit synchronizaci fakturace." }, "billingSyncApiKeyRotated": { - "message": "Token rotated" + "message": "Token byl vyměněn" }, "billingSyncDesc": { - "message": "Billing sync unlocks Families sponsorships and automatic license syncing on your server. After making updates in the Bitwarden cloud server, select Sync License to apply changes." + "message": "Synchronizace fakturace odemkne sponzorství Families a automatickou synchronizaci licencí na serveru. Po provedení aktualizací na cloudovém serveru Bitwardenu použijte pro použití změn funkci \"Synchronizovat licenci\"." }, "billingSyncKeyDesc": { - "message": "A billing sync token from your cloud organization's subscription settings is required to complete this form." + "message": "K vyplnění tohoto formuláře je vyžadován fakturační synchronizační token z nastavení předplatného Vaší cloudové organizace." }, "billingSyncKey": { - "message": "Billing sync token" + "message": "Fakturační synchronizační token" }, "active": { "message": "Aktivní" }, "inactive": { - "message": "Inactive" + "message": "Neaktivní" }, "sentAwaitingSync": { - "message": "Sent (awaiting sync)" + "message": "Odesláno (čeká na synchronizaci)" }, "sent": { - "message": "Sent" + "message": "Odesláno" }, "requestRemoved": { - "message": "Removed (awaiting sync)" + "message": "Odebráno (čeká na synchronizaci)" }, "requested": { - "message": "Requested" + "message": "Vyžádáno" }, "formErrorSummaryPlural": { - "message": "$COUNT$ fields above need your attention.", + "message": "$COUNT$ polí výše vyžadují Vaši pozornost.", "placeholders": { "count": { "content": "$1", @@ -5365,10 +5365,10 @@ } }, "formErrorSummarySingle": { - "message": "1 field above needs your attention." + "message": "1 pole výše vyžaduje Vaši pozornost." }, "fieldRequiredError": { - "message": "$FIELDNAME$ is required.", + "message": "$FIELDNAME$ je vyžadováno.", "placeholders": { "fieldname": { "content": "$1", @@ -5377,10 +5377,10 @@ } }, "required": { - "message": "required" + "message": "vyžadováno" }, "characterMaximum": { - "message": "$MAX$ character maximum", + "message": "Maximálně $MAX$ znaků", "placeholders": { "max": { "content": "$1", @@ -5389,28 +5389,28 @@ } }, "idpSingleSignOnServiceUrlRequired": { - "message": "Required if Entity ID is not a URL." + "message": "Vyžadováno, pokud ID entity není URL." }, "openIdOptionalCustomizations": { - "message": "Optional customizations" + "message": "Volitelné úpravy" }, "openIdAuthorityRequired": { - "message": "Required if Authority is not valid." + "message": "Vyžadováno, pokud není autorita platná." }, "separateMultipleWithComma": { - "message": "Separate multiple with a comma." + "message": "Další oddělte čárkami." }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "Vypršel časový limit relace. Vraťte se zpět a zkuste se znovu přihlásit." }, "exportingPersonalVaultTitle": { - "message": "Exporting individual vault" + "message": "Exportování osobního trezoru" }, "exportingOrganizationVaultTitle": { - "message": "Exporting organization vault" + "message": "Exportování trezoru organizace" }, "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated password history or attachments.", + "message": "Budou exportovány jen osobní položky trezoru spojené s $EMAIL$. Položky trezoru organizace nebudou zahrnuty. Budou exportovány jen informace o položkách trezoru a nebudou zahrnuty související historie hesel ani přílohy.", "placeholders": { "email": { "content": "$1", @@ -5419,7 +5419,7 @@ } }, "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "message": "Exportován bude jen trezor organizace přidružený k položce $ORGANIZATION$. Osobní položky trezoru a položky z jiných organizací nebudou zahrnuty.", "placeholders": { "organization": { "content": "$1", @@ -5428,28 +5428,28 @@ } }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "Přístup byl odepřen. Nemáte oprávnění k zobrazení této stránky." }, "masterPassword": { - "message": "Master password" + "message": "Hlavní heslo" }, "security": { - "message": "Security" + "message": "Zabezpečení" }, "keys": { - "message": "Keys" + "message": "Klíče" }, "billingHistory": { - "message": "Billing history" + "message": "Historie fakturace" }, "backToReports": { - "message": "Back to reports" + "message": "Zpět do hlášení" }, "organizationPicker": { - "message": "Organization picker" + "message": "Výběr organizace" }, "currentOrganization": { - "message": "Current organization", + "message": "Aktuální organizace", "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountLoggedInAsName": { @@ -5465,7 +5465,7 @@ "message": "Nastavení účtu" }, "generator": { - "message": "Generator" + "message": "Generátor" }, "whatWouldYouLikeToGenerate": { "message": "Co chcete vygenerovat?" @@ -5474,45 +5474,45 @@ "message": "Typ hesla" }, "regenerateUsername": { - "message": "Regenerate username" + "message": "Znovu vygenerovat uživatelské jméno" }, "generateUsername": { - "message": "Generate username" + "message": "Vygenerovat uživatelské jméno" }, "usernameType": { - "message": "Username type" + "message": "Typ uživatelského jména" }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "E-mailová adresa s plusem", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Použijte funkce podadres Vašeho poskytovatele e-mailu." }, "catchallEmail": { - "message": "Catch-all email" + "message": "E-mail pro doménový koš" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Použijte nakonfigurovanou univerzální schránku své domény." }, "random": { - "message": "Random", + "message": "Náhodně", "description": "Generates domain-based username using random letters" }, "randomWord": { - "message": "Random word" + "message": "Náhodné slovo" }, "service": { - "message": "Service" + "message": "Služba" }, "unknownCipher": { - "message": "Unknown item, you may need to request permission to access this item." + "message": "Neznámá položka, možná budete muset požádat o oprávnění pro přístup k této položce." }, "cannotSponsorSelf": { - "message": "You cannot redeem for the active account. Enter a different email." + "message": "Nemůžete uplatnit pro aktivní účet. Zadejte jiný e-mail." }, "revokeWhenExpired": { - "message": "Expires $DATE$", + "message": "Vyprší $DATE$", "placeholders": { "date": { "content": "$1", @@ -5521,7 +5521,7 @@ } }, "awaitingSyncSingular": { - "message": "Token rotated $DAYS$ day ago. Update the billing sync token in your self-hosted organization settings.", + "message": "Token se změnil před $DAYS$ dnem. Aktualizujte fakturační synchronizační token v nastavení vlastního hostingu Vaší organizace.", "placeholders": { "days": { "content": "$1", @@ -5530,7 +5530,7 @@ } }, "awaitingSyncPlural": { - "message": "Token rotated $DAYS$ days ago. Update the billing sync token in your self-hosted organization settings.", + "message": "Token se změnil před $DAYS$ dny. Aktualizujte fakturační synchronizační token v nastavení vlastního hostingu Vaší organizace.", "placeholders": { "days": { "content": "$1", @@ -5539,14 +5539,14 @@ } }, "lastSync": { - "message": "Last sync", + "message": "Poslední synchronizace", "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { - "message": "Self-hosted sponsorships synced." + "message": "Sponzoringy na vlastním hostingu byly synchronizovány." }, "billingManagedByProvider": { - "message": "Managed by $PROVIDER$", + "message": "Spravováno poskytovatelem $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -5555,36 +5555,36 @@ } }, "billingContactProviderForAssistance": { - "message": "Please reach out to them for further assistance", + "message": "Pro další pomoc kontaktujte tohoto poskytovatele", "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "Alias přeposílaného e-mailu" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Vygeneruje alias e-mailu pomocí externí přeposílací služby." }, "hostname": { - "message": "Hostname", + "message": "Název hostitele", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API access token" + "message": "Přístupový token API" }, "deviceVerification": { - "message": "Device verification" + "message": "Ověřování zařízení" }, "enableDeviceVerification": { - "message": "Turn on device verification" + "message": "Zapnout ověřování zařízení" }, "deviceVerificationDesc": { - "message": "Verification codes are sent to your email address when logging in from an unrecognized device" + "message": "Při přihlášení z neznámého zařízení budou na Vaši e-mailovou adresu odeslány ověřovací kódy." }, "updatedDeviceVerification": { - "message": "Updated device verification" + "message": "Ověření aktualizovaného zařízení" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Are you sure you want to turn on device verification? The verification code emails will arrive at: $EMAIL$", + "message": "Opravdu chcete zapnout ověřování zařízení? Ověřovací kódy budou zaslány na e-mail $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -5593,67 +5593,67 @@ } }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Je vyžadováno předplatné Premium" }, "scim": { "message": "Poskytování SCIM", "description": "The text, 'SCIM', is an acronymn and should not be translated." }, "scimDescription": { - "message": "Automaticky zajišťuje uživatelům a skupinám vašeho preferovaného poskytovatele identity prostřednictvím SCIM poskytování", + "message": "Automatické zajišťování uživatelů a skupin u preferovaného poskytovatele identit prostřednictvím zajišťování SCIM.", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimEnabledCheckboxDesc": { - "message": "Aktivovat SCIM", + "message": "Povolit SCIM", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimEnabledCheckboxDescHelpText": { - "message": "Nastavte svého preferovaného poskytovatele identity nastavením URL a SCIM API klíče", + "message": "Nastavte svého preferovaného poskytovatele identity nastavením URL a klíče SCIM API", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimApiKeyHelperText": { - "message": "Tento klíč API má přístup ke správě uživatelů ve vaší organizaci. Měl by být zachován v tajnosti." + "message": "Tento klíč API má přístup ke správě uživatelů ve Vaší organizaci. Měl by být zachován v tajnosti." }, "copyScimKey": { - "message": "Zkopírujte SCIM API klíč do schránky", + "message": "Kopírovat klíč SCIM API do schránky", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKey": { - "message": "Vyměňte SCIM API klíč", + "message": "Měnit klíč SCIM API", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKeyWarning": { - "message": "Opravdu chcete změnit SCIM API klíč? Aktuální klíč již nebude fungovat pro žádné existující integrace.", + "message": "Opravdu chcete měnit klíč SCIM API? Aktuální klíč již nebude fungovat pro žádné existující integrace.", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateKey": { "message": "Změnit klíč" }, "scimApiKey": { - "message": "SCIM API klíč", + "message": "Klíč SCIM API", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "copyScimUrl": { - "message": "Zkopírujte URL adresu SCIM koncového bodu do schránky", + "message": "Kopírovat URL koncového bodu SCIM do schránky", "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimUrl": { - "message": "SCIM URL", + "message": "URL SCIM", "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimApiKeyRotated": { - "message": "SCIM API klíč byl úspěšně změněn", + "message": "Klíč SCIM API byl úspěšně změněn", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "scimSettingsSaved": { - "message": "Nastavení SCIM bylo úspěšně uloženo", + "message": "Nastavení SCIM bylo uloženo", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "inputRequired": { - "message": "Položka nesmí být prázdná." + "message": "Je vyžadován vstup." }, "inputEmail": { - "message": "Neplatná e-mailová adresa." + "message": "Vstup není e-mailová adresa." }, "inputMinLength": { "message": "Vstup musí mít alespoň $COUNT$ znaků.", @@ -5665,7 +5665,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "Vstup nesmí být delší než $COUNT$ znaků.", "placeholders": { "count": { "content": "$1", @@ -5674,7 +5674,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Následující znaky nejsou povoleny: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -5701,10 +5701,10 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 nebo více e-mailů jsou neplatné" }, "tooManyEmails": { - "message": "You can only submit up to $COUNT$ emails at a time", + "message": "Najednou můžete odeslat jen $COUNT$ e-mailů", "placeholders": { "count": { "content": "$1", @@ -5713,7 +5713,7 @@ } }, "fieldsNeedAttention": { - "message": "$COUNT$ výše uvedených polí vyžaduje vaši pozornost.", + "message": "$COUNT$ polí výše vyžaduje Vaši pozornost.", "placeholders": { "count": { "content": "$1", @@ -5731,225 +5731,225 @@ "message": "Členové" }, "reporting": { - "message": "Reporting" + "message": "Hlášení" }, "numberOfUsers": { - "message": "Number of users" + "message": "Počet uživatelů" }, "loggingInAs": { - "message": "Logging in as" + "message": "Přihlašování jako" }, "notYou": { - "message": "Not you?" + "message": "Nejste to Vy?" }, "pickAnAvatarColor": { - "message": "Pick an avatar color" + "message": "Zvolte barvu avatara" }, "customizeAvatar": { - "message": "Customize avatar" + "message": "Přizpůsobit avatara" }, "avatarUpdated": { - "message": "Avatar updated" + "message": "Avatar byl aktualizován" }, "brightBlue": { - "message": "Bright Blue" + "message": "Světle modrá" }, "green": { - "message": "Green" + "message": "Zelená" }, "orange": { - "message": "Orange" + "message": "Oranžová" }, "lavender": { - "message": "Lavender" + "message": "Levandulová" }, "yellow": { - "message": "Yellow" + "message": "Žlutá" }, "indigo": { - "message": "Indigo" + "message": "Tmavě modrá" }, "teal": { "message": "Teal" }, "salmon": { - "message": "Salmon" + "message": "Lososová" }, "pink": { - "message": "Pink" + "message": "Růžová" }, "customColor": { - "message": "Custom Color" + "message": "Vlastní barva" }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- Vybrat --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- Pište pro filtrování --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "Načítání voleb..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "Nebyly nalezeny žádné položky" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Vymazat vše" }, "toggleCharacterCount": { - "message": "Toggle character count", + "message": "Zobrazit počet znaků", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "passwordCharacterCount": { - "message": "Password character count", + "message": "Počet znaků hesla", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "hide": { - "message": "Hide" + "message": "Skrýt" }, "projects": { - "message": "Projects", + "message": "Projekty", "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited", + "message": "Naposledy upraveno", "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret", + "message": "Upravit tajný klíč", "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret", + "message": "Přidat tajný klíč", "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name", + "message": "Kopírovat název tajného klíče", "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value", + "message": "Kopírovat hodnotu tajného klíče", "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret", + "message": "Smazat tajný klíč", "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets", + "message": "Smazat tajné klíče", "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { - "message": "Permanently delete secret" + "message": "Trvale smazat tajný klíč" }, "hardDeleteSecrets": { - "message": "Permanently delete secrets" + "message": "Trvale smazat tajné klíče" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "message": "Vyberte projekty, se kterými bude spojen tajný klíč. Tajný klíč budou moci vidět jen uživatelé organizace s přístupem k těmto projektům.", "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects", + "message": "Vybrat projekty", "description": "A label for a type-to-filter input field to choose projects." }, "searchProjects": { - "message": "Search projects", + "message": "Prohledat projekty", "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project", + "message": "Projekt", "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project", + "message": "Upravit projekt", "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project", + "message": "Zobrazit projekt", "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project", + "message": "Smazat projekt", "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects", + "message": "Smazat projekty", "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret", + "message": "Tajný klíč", "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account", + "message": "Účet služby", "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts", + "message": "Účty služeb", "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets", + "message": "Tajné klíče", "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair", + "message": "Dvojice Název/Hodnota", "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited", + "message": "Tajný klíč byl upraven", "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created", + "message": "Tajný klíč byl vytvořen", "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret", + "message": "Nový tajný klíč", "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account", + "message": "Nový účet služby", "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show", + "message": "Žádné tajné klíče k zobrazení", "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets.", + "message": "Chcete-li začít, přidejte nový tajný klíč nebo importujte tajný klíč.", "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { - "message": "There are no secrets in the trash." + "message": "V koši nejsou žádné tajné klíče." }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access.", + "message": "Abyste mohli začít automatizovat přístup k tajnému kliči, vytvořte nový účet služby.", "description": "Message to encourage the user to start creating service accounts." }, "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet", + "message": "Nyní není nic k zobrazení", "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets", + "message": "Prohledat tajné klíče", "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts", + "message": "Smazat účty služby", "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account", + "message": "Smazat účet služby", "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account", + "message": "Zobrazit účet služby", "description": "Action to view the details of a service account." }, "deleteServiceAccountDialogMessage": { - "message": "Deleting service account $SERVICE_ACCOUNT$ is permanent and irreversible.", + "message": "Smazání účtu služby $SERVICE_ACCOUNT$ je trvalé a nevratné.", "placeholders": { "service_account": { "content": "$1", @@ -5958,10 +5958,10 @@ } }, "deleteServiceAccountsDialogMessage": { - "message": "Deleting service accounts is permanent and irreversible." + "message": "Smazání účtů služby je trvalé a nevratné." }, "deleteServiceAccountsConfirmMessage": { - "message": "Delete $COUNT$ service accounts", + "message": "Smazat $COUNT$ účtů služby", "placeholders": { "count": { "content": "$1", @@ -5970,98 +5970,98 @@ } }, "deleteServiceAccountToast": { - "message": "Service account deleted" + "message": "Účet služby byl smazán" }, "deleteServiceAccountsToast": { - "message": "Service accounts deleted" + "message": "Účet služeb byly smazány" }, "searchServiceAccounts": { - "message": "Search service accounts", + "message": "Prohledat účty služeb", "description": "Placeholder text for searching service accounts." }, "editServiceAccount": { - "message": "Edit service account", + "message": "Upravit účet služby", "description": "Title for editing a service account." }, "addProject": { - "message": "Add project", + "message": "Přidat projekt", "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited", + "message": "Projekt byl upraven", "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved", + "message": "Projekt byl uložen", "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created", + "message": "Projekt byl vytvořen", "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name", + "message": "Název projektu", "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project", + "message": "Nový projekt", "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations.", + "message": "Smazání tajných klíčů může ovlivnit existující integrace.", "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash", + "message": "Tajné klíče byly přesunuty do koše", "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { - "message": "Are you sure you want to permanently delete this secret?" + "message": "Opravdu chcete tento tajný klíč trvale smazat?" }, "hardDeleteSecretsConfirmation": { - "message": "Are you sure you want to permanently delete these secrets?" + "message": "Opravdu chcete tyto tajné klíče trvale smazat?" }, "hardDeletesSuccessToast": { - "message": "Secrets permanently deleted" + "message": "Tajné klíče byly trvale smazány" }, "smAccess": { - "message": "Access", + "message": "Přístup", "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret", + "message": "Projekt, Tajný klíč", "description": "" }, "serviceAccountName": { - "message": "Service account name", + "message": "Název účtu služby", "description": "Label for the name of a service account" }, "serviceAccountCreated": { - "message": "Service account created", + "message": "Účet služby byl vytvořen", "description": "Notifies that a new service account has been created" }, "serviceAccountUpdated": { - "message": "Service account updated", + "message": "Účet služby byl aktualizován", "description": "Notifies that a service account has been updated" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets", + "message": "Napište nebo vyberte projekty nebo tajné klíče", "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter", + "message": "Pište pro filtrování", "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted", + "message": "Projekty byly smazány", "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Project deleted", + "message": "Projekty byly smazány", "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { - "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "message": "Smazání projektu $PROJECT$ je trvalé a nevratné.", "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { @@ -6071,7 +6071,7 @@ } }, "deleteProjectInputLabel": { - "message": "Type \"$CONFIRM$\" to continue", + "message": "Pro pokračování napište \"$CONFIRM$\"", "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { @@ -6081,7 +6081,7 @@ } }, "deleteProjectConfirmMessage": { - "message": "Delete $PROJECT$", + "message": "Smazat $PROJECT$", "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { @@ -6091,7 +6091,7 @@ } }, "deleteProjectsConfirmMessage": { - "message": "Delete $COUNT$ Projects", + "message": "Smazat $COUNT$ projektů", "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { @@ -6101,34 +6101,34 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible.", + "message": "Smazání projektů je trvalé a nevratné.", "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display", + "message": "Žádné projekty k zobrazení", "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets.", + "message": "Chcete-li začít s organizováním tajných klíčů, přidejte nový projekt.", "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required", + "message": "Je vyžadováno potvrzení", "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:", + "message": "Následující projekty nemohou být smazány:", "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash", + "message": "Tajný klíč byl přesunut do koše", "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { - "message": "Secret permanently deleted" + "message": "Tajný klíč byl trvale smazán" }, "accessTokens": { - "message": "Access tokens", + "message": "Přístupové tokeny", "description": "Title for the section displaying access tokens." }, "newAccessToken": { @@ -6136,88 +6136,88 @@ "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires", + "message": "Vyprší", "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read", + "message": "Jen ke čtení", "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show", + "message": "Žádné přístupové tokeny k zobrazení", "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token", + "message": "Chcete-li začít, vytvořte přístupový token", "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing.", + "message": "Před zavřením přístupového tokenu si jej stáhněte nebo zkopírujte.", "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:", + "message": "Platnost končí:", "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved", + "message": "Přístupové tokeny nejsou uloženy a nelze je znovu získat", "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token", + "message": "Kopírovat token", "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token", + "message": "Přístupový token", "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required", + "message": "Je vyžadováno datum expirace", "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard", + "message": "Přístupový token byl vytvořen a zkopírován do schránky", "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "accessTokenPermissionsBetaNotification": { - "message": "Permissions management is unavailable for beta.", + "message": "Správa oprávnění není k dispozici pro beta.", "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version." }, "revokeAccessToken": { - "message": "Revoke access token", + "message": "Odvolat přístupový token", "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "Odvolat přístupové tokeny" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "Odvolání přístupových tokenů je trvalé a nevratné." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "Přístupové tokeny byly odvolány", "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "Nebyl vybrán žádný přístupový token pro zrušení", + "message": "Nebyl vybrán žádný přístupový token pro odvolání", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { - "message": "Submenu" + "message": "Podmenu" }, "from": { - "message": "From" + "message": "Od" }, "to": { - "message": "To" + "message": "Do" }, "member": { "message": "Člen" }, "update": { - "message": "Update" + "message": "Aktualizovat" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ $QUANTITY$ dalších", "placeholders": { "quantity": { "content": "$1", @@ -6226,127 +6226,127 @@ } }, "groupInfo": { - "message": "Group info" + "message": "Informace o skupině" }, "editGroupMembersDesc": { - "message": "Grant members access to the group's assigned collections." + "message": "Udělí členům přístup k přiřazeným kolekcím skupiny." }, "editGroupCollectionsDesc": { - "message": "Grant access to collections by adding them to this group." + "message": "Udělí členům přístup ke kolekcím přidáním do této skupiny." }, "accessAllCollectionsDesc": { - "message": "Grant access to all current and future collections." + "message": "Udělí přístup ke všem aktuálním i budoucím kolekcím." }, "accessAllCollectionsHelp": { - "message": "If checked, this will replace all other collection permissions." + "message": "Pokud je zaškrtnuto, nahradí to všechna ostatní oprávnění ke kolekcím." }, "selectMembers": { - "message": "Select members" + "message": "Vybrat členy" }, "selectCollections": { - "message": "Select collections" + "message": "Vybrat kolekce" }, "role": { "message": "Role" }, "removeMember": { - "message": "Remove member" + "message": "Odebrat člena" }, "collection": { - "message": "Collection" + "message": "Kolekce" }, "noCollection": { - "message": "No collection" + "message": "Žádná kolekce" }, "canView": { - "message": "Can view" + "message": "Může zobrazit" }, "canViewExceptPass": { - "message": "Can view, except passwords" + "message": "Může zobrazit kromě hesel" }, "canEdit": { - "message": "Can edit" + "message": "Může upravovat" }, "canEditExceptPass": { - "message": "Can edit, except passwords" + "message": "Může upravovat kromě hesel" }, "noCollectionsAdded": { - "message": "No collections added" + "message": "Nebyly přidány žádné kolekce" }, "noMembersAdded": { - "message": "No members added" + "message": "Nebyli přidáni žádní členové" }, "noGroupsAdded": { - "message": "No groups added" + "message": "Nebyly přidány žádné skupiny" }, "group": { - "message": "Group" + "message": "Skupina" }, "groupAccessAll": { - "message": "This group can access and modify all items." + "message": "Tato skupina může vidět a upravovat vše." }, "memberAccessAll": { - "message": "This member can access and modify all items." + "message": "Tento uživatel může vidět a upravovat vše." }, "domainVerification": { - "message": "Domain verification" + "message": "Ověření domény" }, "newDomain": { - "message": "New domain" + "message": "Nová doména" }, "noDomains": { - "message": "No domains" + "message": "Žádné domény" }, "noDomainsSubText": { - "message": "Connecting a domain allows members to skip the SSO identifier field during Login with SSO." + "message": "Připojení domény umožňuje členům přeskočit pole identifikátoru SSO během přihlašování pomocí SSO." }, "verifyDomain": { - "message": "Verify domain" + "message": "Ověřit doménu" }, "reverifyDomain": { - "message": "Reverify domain" + "message": "Znovu ověřit doménu" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "Kopírovat TXT záznam DNS" }, "dnsTxtRecord": { - "message": "DNS TXT record" + "message": "TXT záznam DNS" }, "dnsTxtRecordInputHint": { - "message": "Copy and paste the TXT record into your DNS Provider." + "message": "Zkopírujte a vložte TXT záznam do poskytovatele DNS." }, "domainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be verified." + "message": "Příklad: mydomain.com. Poddomény vyžadují samostatné záznamy, které je třeba ověřit." }, "automaticDomainVerification": { - "message": "Automatic Domain Verification" + "message": "Automatické ověření domény" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden will attempt to verify the domain 3 times during the first 72 hours. If the domain can’t be verified, check the DNS record in your host and manually verify. The domain will be removed from your organization in 7 days if it is not verified" + "message": "Bitwarden se pokusí ověřit doménu třikrát během prvních 72 hodin. Pokud doménu nelze ověřit, zkontrolujte záznam DNS v hostitelském počítači a ověřte ji ručně. Pokud se doména nepodaří ověřit, bude z Vaší organizace odebrána do 7 dnů." }, "invalidDomainNameMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be verified." + "message": "Vstup není platný formát. Příklad: mydomain.com. Poddomény vyžadují samostatné záznamy, které je třeba ověřit." }, "removeDomain": { - "message": "Remove domain" + "message": "Odebrat doménu" }, "removeDomainWarning": { - "message": "Removing a domain cannot be undone. Are you sure you want to continue?" + "message": "Odebrání domény není možné vrátit. Opravdu chcete pokračovat?" }, "domainRemoved": { - "message": "Domain removed" + "message": "Doména byla odebrána" }, "domainSaved": { - "message": "Domain saved" + "message": "Doména byla uložena" }, "domainVerified": { - "message": "Domain verified" + "message": "Doména byla ověřena" }, "duplicateDomainError": { - "message": "You can't claim the same domain twice." + "message": "Nemůžete nárokovat stejnou doménu dvakrát." }, "domainNotAvailable": { - "message": "Someone else is using $DOMAIN$. Use a different domain to continue.", + "message": "Někdo jiný používá $DOMAIN$. Použijte jinou doménu pro pokračování.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6355,7 +6355,7 @@ } }, "domainNotVerified": { - "message": "$DOMAIN$ not verified. Check your DNS record.", + "message": "$DOMAIN$ nebyla ověřena. Zkontrolujte Váš DNS záznam.", "placeholders": { "DOMAIN": { "content": "$1", @@ -6364,28 +6364,28 @@ } }, "domainStatusVerified": { - "message": "Verified" + "message": "Ověřeno" }, "domainStatusUnverified": { - "message": "Unverified" + "message": "Neověřeno" }, "domainNameTh": { - "message": "Name" + "message": "Název" }, "domainStatusTh": { - "message": "Status" + "message": "Stav" }, "lastChecked": { - "message": "Last checked" + "message": "Posední kontrola" }, "editDomain": { - "message": "Edit domain" + "message": "Upravit doménu" }, "domainFormInvalid": { - "message": "There are form errors that need your attention" + "message": "Existují chyby ve formulářích, které vyžadují Vaši pozornost" }, "addedDomain": { - "message": "Added domain $DOMAIN$", + "message": "Přidána doména $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -6394,7 +6394,7 @@ } }, "removedDomain": { - "message": "Removed domain $DOMAIN$", + "message": "Odebrána doména $DOMAIN$", "placeholders": { "DOMAIN": { "content": "$1", @@ -6403,7 +6403,7 @@ } }, "domainVerifiedEvent": { - "message": "$DOMAIN$ verified", + "message": "$DOMAIN$ byla ověřena", "placeholders": { "DOMAIN": { "content": "$1", @@ -6412,7 +6412,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ not verified", + "message": "$DOMAIN$ nebyla ověřena", "placeholders": { "DOMAIN": { "content": "$1", @@ -6421,46 +6421,46 @@ } }, "membersColumnHeader": { - "message": "Member/Group" + "message": "Člen/Skupina" }, "groupAndMemberColumnHeader": { - "message": "Member" + "message": "Člen" }, "selectGroupsAndMembers": { - "message": "Select groups and members" + "message": "Zvolte skupiny a členy" }, "selectGroups": { - "message": "Select groups" + "message": "Zvolte skupiny" }, "userPermissionOverrideHelper": { - "message": "Permissions set for a member will replace permissions set by that member's group" + "message": "Oprávnění nastavená pro člena nahradí oprávnění nastavená skupinou tohoto člena" }, "noMembersOrGroupsAdded": { - "message": "No members or groups added" + "message": "Nebyli přidáni žádní členové ani skupiny" }, "deleted": { - "message": "Deleted" + "message": "Smazáno" }, "memberStatusFilter": { - "message": "Member status filter" + "message": "Filtr stavu člena" }, "inviteMember": { - "message": "Invite member" + "message": "Pozvat uživatele" }, "needsConfirmation": { - "message": "Needs confirmation" + "message": "Vyžaduje potvrzení" }, "memberRole": { - "message": "Member role" + "message": "Role člena" }, "moreFromBitwarden": { - "message": "More from Bitwarden" + "message": "Více od Bitwardenu" }, "switchProducts": { - "message": "Switch products" + "message": "Přepnout produkty" }, "freeOrgInvLimitReachedManageBilling": { - "message": "Free organizations may have up to $SEATCOUNT$ members. Upgrade to a paid plan to invite more members.", + "message": "Bezplatné organizace mohou mít až $SEATCOUNT$ členů. Chcete-li pozvat více členů, přejděte na placený plán.", "placeholders": { "seatcount": { "content": "$1", @@ -6469,7 +6469,7 @@ } }, "freeOrgInvLimitReachedNoManageBilling": { - "message": "Free organizations may have up to $SEATCOUNT$ members. Contact your organization owner to upgrade.", + "message": "Bezplatné organizace mohou mít až $SEATCOUNT$ členů. Pro aktualizaci kontaktujte majitele organizace.", "placeholders": { "seatcount": { "content": "$1", @@ -6478,7 +6478,7 @@ } }, "freeOrgMaxCollectionReachedManageBilling": { - "message": "Free organizations may have up to $COLLECTIONCOUNT$ collections. Upgrade to a paid plan to add more collections.", + "message": "Bezplatné organizace mohou mít až $COLLECTIONCOUNT$ kolekcí. Chcete-li přidat více kolekcí, přejděte na placený tarif.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -6487,7 +6487,7 @@ } }, "freeOrgMaxCollectionReachedNoManageBilling": { - "message": "Free organizations may have up to $COLLECTIONCOUNT$ collections. Contact your organization owner to upgrade.", + "message": "Bezplatné organizace mohou mít až $COLLECTIONCOUNT$ kolekcí. Pro aktualizaci kontaktujte majitele organizace.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -6499,13 +6499,13 @@ "message": "Server" }, "exportData": { - "message": "Export data" + "message": "Exportovat data" }, "exportingOrganizationSecretDataTitle": { - "message": "Exporting Organization Secret Data" + "message": "Exportování tajných dat organizace" }, "exportingOrganizationSecretDataDescription": { - "message": "Only the Secrets Manager data associated with $ORGANIZATION$ will be exported. Items in other products or from other organizations will not be included.", + "message": "Exportována budou jen tajná data organizace přidružená k položce $ORGANIZATION$. Položky v ostatních produktech a položky z jiných organizací nebudou zahrnuty.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -6514,106 +6514,118 @@ } }, "fileUpload": { - "message": "File upload" + "message": "Nahrát soubor" }, "acceptedFormats": { - "message": "Accepted Formats:" + "message": "Povolené formáty:" }, "copyPasteImportContents": { - "message": "Copy & paste import contents:" + "message": "Kopírovat a vložit obsah importu:" }, "or": { - "message": "or" + "message": "nebo" }, "licenseAndBillingManagement": { - "message": "License and billing management" + "message": "Správa licencí a fakturace" }, "automaticSync": { - "message": "Automatic sync" + "message": "Automatická synchronizace" }, "manualUpload": { - "message": "Manual upload" + "message": "Ruční nahrání" }, "manualUploadDesc": { - "message": "If you do not want to opt into billing sync, manually upload your license here." + "message": "Pokud se nechcete rozhodnout pro synchronizaci fakturace, nahrajte licenci ručně zde." }, "syncLicense": { - "message": "Sync license" + "message": "Synchronizovat licenci" }, "licenseSyncSuccess": { - "message": "Successfully synced license" + "message": "Licence byla úspěšně synchronizována" }, "licenseUploadSuccess": { - "message": "Successfully uploaded license" + "message": "Licence byla úspěšně nahrána" }, "lastLicenseSync": { - "message": "Last license sync" + "message": "Poslední synchronizace licence" }, "billingSyncHelp": { - "message": "Billing Sync help" + "message": "Nápověda pro synchronizaci fakturací" + }, + "licensePaidFeaturesHelp": { + "message": "Nápověda k placeným funkcím v licenci" + }, + "selfHostGracePeriodHelp": { + "message": "Po vypršení předplatného máte 60 dní na použití aktualizovaného licenčního souboru pro Vaši organizaci. Lhůta k odkladu končí $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } }, "uploadLicense": { - "message": "Upload license" + "message": "Nahrát licenci" }, "projectPeopleDescription": { - "message": "Grant groups or people access to this project." + "message": "Udělí skupinám nebo lidem přístup k tomuto projektu." }, "projectPeopleSelectHint": { - "message": "Type or select people or groups" + "message": "Napište nebo vyberte osoby nebo skupiny" }, "projectServiceAccountsDescription": { - "message": "Grant service accounts access to this project." + "message": "Udělí servisním účtům přístup k tomuto projektu." }, "projectServiceAccountsSelectHint": { - "message": "Type or select service accounts" + "message": "Napište nebo vyberte servisní účty" }, "projectEmptyPeopleAccessPolicies": { - "message": "Add people or groups to start collaborating" + "message": "Přidejte lidi nebo skupiny a začněte spolupracovat" }, "projectEmptyServiceAccountAccessPolicies": { - "message": "Add service accounts to grant access" + "message": "Přidejte servisní účty pro udělení přístupu" }, "serviceAccountPeopleDescription": { - "message": "Grant groups or people access to this service account." + "message": "Udělí skupinám nebo lidem přístup k tomuto servisnímu účtu." }, "serviceAccountProjectsDescription": { - "message": "Assign projects to this service account. " + "message": "Přiřaďte projekty k tomuto účtu služby. " }, "serviceAccountEmptyProjectAccesspolicies": { - "message": "Add projects to grant access" + "message": "Přidat projekty pro udělení přístupu" }, "canReadWrite": { - "message": "Can read, write" + "message": "Může číst, zapisovat" }, "groupSlashUser": { - "message": "Group/User" + "message": "Skupina/Uživatel" }, "lowKdfIterations": { - "message": "Low KDF Iterations" + "message": "Nízke iterace KDF" }, "updateLowKdfIterationsDesc": { "message": "Aktualizujte své nastavení šifrování tak, aby splňovalo nová bezpečnostní doporučení a zlepšilo ochranu účtu." }, "changeKdfLoggedOutWarning": { - "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login setup. We recommend exporting your vault before changing your encryption settings to prevent data loss." + "message": "Pokračováním se odhlásíte ze všech aktivních relací. Budete se muset znovu přihlásit a dokončit nastavení dvoufázového přihlášení. Před změnou nastavení šifrování doporučujeme exportovat trezor, aby nedošlo ke ztrátě dat." }, "secretsManagerBeta": { - "message": "Secrets Manager Beta" + "message": "Správce tajných klíčů v programu Beta" }, "secretsManagerBetaDesc": { - "message": "Enable user access to the Secrets Manager at no charge during the Beta program." + "message": "Povolí přístup uživatele ke správě tajných klíčů zdarma v rámci programu Beta." }, "userAccessSecretsManager": { - "message": "This user can access the Secrets Manager Beta" + "message": "Tento uživatel může přistupovat ke správci tajných klíčů v rámci programu Beta" }, "important": { - "message": "Important:" + "message": "Důležité:" }, "viewAll": { - "message": "View all" + "message": "Zobrazit vše" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "Zobrazování $PORTION$ z $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -6626,16 +6638,16 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "Vyřešte chyby níže a zkuste to znovu." }, "description": { - "message": "Description" + "message": "Popis" }, "errorReadingImportFile": { - "message": "An error occurred when trying to read the import file" + "message": "V průběhu pokusu o přečtení souboru s importem se vyskytla chyba" }, "accessedSecret": { - "message": "Accessed secret $SECRET_ID$.", + "message": "Přistoupeno k tajnému klíči $SECRET_ID$.", "placeholders": { "secret_id": { "content": "$1", @@ -6648,29 +6660,29 @@ "description": "Software Development Kit" }, "createSecret": { - "message": "Create a secret" + "message": "Vytvořit tajný klíč" }, "createProject": { - "message": "Create a project" + "message": "Vytvořit projekt" }, "createServiceAccount": { - "message": "Create a service account" + "message": "Vytvořit účet služby" }, "downloadThe": { - "message": "Download the", + "message": "Stáhnout", "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" }, "smCLI": { "message": "Secrets Manager CLI" }, "importSecrets": { - "message": "Import secrets" + "message": "Importovat tajné klíče" }, "getStarted": { - "message": "Get started" + "message": "Začínáme" }, "complete": { - "message": "$COMPLETED$/$TOTAL$ Complete", + "message": "Dokončeno $COMPLETED$/$TOTAL$", "placeholders": { "COMPLETED": { "content": "$1", @@ -6683,70 +6695,70 @@ } }, "restoreSecret": { - "message": "Restore secret" + "message": "Obnovit tajný klíč" }, "restoreSecrets": { - "message": "Restore secrets" + "message": "Obnovit tajné klíče" }, "restoreSecretPrompt": { - "message": "Are you sure you want to restore this secret?" + "message": "Opravdu chcete obnovit tento tajný klíč?" }, "restoreSecretsPrompt": { - "message": "Are you sure you want to restore these secrets?" + "message": "Opravdu chcete obnovit tyto tajné klíče?" }, "secretRestoredSuccessToast": { - "message": "Secret restored" + "message": "Tajný klíč byl obnoven" }, "secretsRestoredSuccessToast": { - "message": "Secrets restored" + "message": "Tajné klíče byly obnoveny" }, "selectionIsRequired": { - "message": "Selection is required." + "message": "Je vyžadován výběr." }, "secretsManagerSubscriptionDesc": { - "message": "Turn on organization access to the Secrets Manager at no charge during the Beta program. Users can be granted access to the Beta in Members." + "message": "Zapněte přístup organizace ke správci tajných klíčů zdarma během programu Beta. Uživatelé mohou získat přístup k betaverzi v sekci Členové." }, "secretsManagerEnable": { - "message": "Enable Secrets Manager Beta" + "message": "Povolit program Beta pro správce tajných klíčů" }, "saPeopleWarningTitle": { - "message": "Access tokens still available" + "message": "Přístupové tokeny jsou stále k dispozici" }, "saPeopleWarningMessage": { - "message": "Removing people from a service account does not remove the access tokens they created. For security best practice, it is recommended to revoke access tokens created by people removed from a service account." + "message": "Odebráním osob z účtu služby se neodeberou přístupové tokeny, které tyto osoby vytvořily. V rámci osvědčených bezpečnostních postupů se doporučuje zrušit přístupové tokeny vytvořené osobami odebranými z účtu služby." }, "smAccessRemovalWarningProjectTitle": { - "message": "Remove access to this project" + "message": "Odebrat přístup k tomuto projektu" }, "smAccessRemovalWarningProjectMessage": { - "message": "This action will remove your access to the project." + "message": "Tato akce odebere Váš přístup k projektu." }, "smAccessRemovalWarningSaTitle": { - "message": "Remove access to this service account" + "message": "Odebrat přístup k tomuto účtu služby" }, "smAccessRemovalWarningSaMessage": { - "message": "This action will remove your access to the service account." + "message": "Tato akce odebere Váš přístup k účtu služby." }, "removeAccess": { - "message": "Remove access" + "message": "Odebrat přístup" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Zkontrolovat heslo, zda nebylo odhaleno" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Odhalené hlavní heslo" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Heslo bylo nalezeno mezi odhalenými hesly. K zabezpečení Vašeho účtu používejte jedinečné heslo. Opravdu chcete používat odhalené heslo?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Slabé a odhalené hlavní heslo" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Slabé heslo bylo nalezeno mezi odhalenými hesly. K zabezpečení Vašeho účtu používejte silné a jedinečné heslo. Opravdu chcete používat toto heslo?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "Alespoň $LENGTH$ znaků", "placeholders": { "length": { "content": "$1", @@ -6755,7 +6767,7 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "Hlavní heslo musí obsahovat alespoň $LENGTH$ znaků.", "placeholders": { "length": { "content": "$1", @@ -6764,18 +6776,29 @@ } }, "dismiss": { - "message": "Dismiss" + "message": "Zavřít" }, "notAvailableForFreeOrganization": { - "message": "Tato funkce není dostupná pro bezplatné organizace. Pro upgrade kontaktujte vlastníka organizace." + "message": "Tato funkce není dostupná pro bezplatné organizace. Pro aktualizaci kontaktujte vlastníka organizace." }, "smProjectSecretsNoItemsNoAccess": { - "message": "Obraťte se na správce Vaší organizace pro správu tajemství pro tento projekt.", + "message": "Obraťte se na správce Vaší organizace pro správu tajných klíčů pro tento projekt.", "description": "The message shown to the user under a project's secrets tab when the user only has read access to the project." }, "enforceOnLoginDesc": { "message": "Bude vyžadovat od stávajících členů, aby změnili svá hesla" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Nemáte oprávnění tento projekt smazat", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 7872a69084e..13e7f1be72e 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 224d5c91bb7..7557309f923 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Hjælp til faktureringssynk" }, + "licensePaidFeaturesHelp": { + "message": "Hjælp til licensbetalte funktioner" + }, + "selfHostGracePeriodHelp": { + "message": "Ved abonnementsudløb kan der indenfor 60 dage føjes en opdateret licensfil til organisationen. Henstandsperioden udløber pr. $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload licens" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Kræv, at eksisterende medlemmer ændrer deres adgangskoder" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Ingen tilladelse til at slette dette objekt", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 3aa6a7a10b0..cdd1be02034 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -5227,7 +5227,7 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Verbinde die Anmeldung über SSO mit deinem selbst gehosteten Entschlüsselungsschlüssel-Server. Mit dieser Option müssen Mitglieder ihre Master-Passwörter nicht verwenden, um Tresordaten zu entschlüsseln.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Hilfe zur Rechnungssynchronisation" }, + "licensePaidFeaturesHelp": { + "message": "Hilfe zur Lizenzierung von bezahlten Funktionen" + }, + "selfHostGracePeriodHelp": { + "message": "Nachdem dein Abonnement abgelaufen ist, hast du 60 Tage Zeit, um eine aktualisierte Lizenzdatei für deine Organisation anzuwenden. Die Nachfrist endet am $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Lizenz hochladen" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Bestehende Mitglieder auffordern, ihre Passwörter zu ändern" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Dir fehlen die Berechtigungen, dieses Projekt zu löschen.", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,7 +6811,7 @@ "message": "KDF-Einstellungen aktualisieren" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Vertrauenswürdige Geräteverschlüsselung" }, "memberDecryptionTdeDescStart": { "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 5c6124f6b2c..5afe16696ac 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Μεταφόρτωση άδειας" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 646285b5c7a..8dde1d44494 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload licence" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index a40eb4b58c2..90ba58b1dcb 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 3ae4d00f05d..33e2dfed401 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index b83ca176868..159365557ea 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Ayuda de sincronización de facturación" }, + "licensePaidFeaturesHelp": { + "message": "Ayuda a las funciones por licencia premium" + }, + "selfHostGracePeriodHelp": { + "message": "Después de que caduque su suscripción, tiene 60 días para aplicar un archivo de licencia actualizado a su organización. El periodo de gracia termina $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Subir licencia" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Requiere que los miembros existentes cambien sus contraseñas" }, + "region": { + "message": "Región" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "EEUU", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "No tiene permisos para eliminar este proyecto", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 99341480e53..17ec0414d2b 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index b26b182c828..572183c14c1 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 9fc68a99b41..e25da8c824e 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -1256,7 +1256,7 @@ "message": "داده‌ها با موفقیت درون ریزی شد" }, "importSuccessNumberOfItems": { - "message": "A total of $AMOUNT$ items were imported.", + "message": "تعداد $AMOUNT$ مورد وارد شده است.", "placeholders": { "amount": { "content": "$1", @@ -2029,7 +2029,7 @@ "message": "لغو اشتراک" }, "subscriptionExpiration": { - "message": "Subscription expiration" + "message": "انقضای اشتراک" }, "subscriptionCanceled": { "message": "اشتراک شما لغو گردید." @@ -2751,7 +2751,7 @@ } }, "viewCollectionWithName": { - "message": "View collection - $NAME$", + "message": "مشاهده مجموعه - $NAME$", "placeholders": { "name": { "content": "$1", @@ -2760,7 +2760,7 @@ } }, "editItemWithName": { - "message": "Edit item - $NAME$", + "message": "ویرایش مجموعه - $NAME$", "placeholders": { "name": { "content": "$1", @@ -3144,7 +3144,7 @@ "message": "زمانی که یک سرپرست عضویت شما را تأیید کرد، می‌توانید به این سازمان دسترسی داشته باشید. زمانی که این اتفاق بیفتد، یک ایمیل برای شما ارسال خواهیم کرد." }, "inviteInitAcceptedDesc": { - "message": "You can now access this organization." + "message": "اکنون می‌توانید به این سازمان دسترسی داشته باشید." }, "inviteAcceptFailed": { "message": "قادر به پذیرش دعوت نیست. از مدیر سازمان بخواهید دعوتنامه جدیدی ارسال کند." @@ -4831,7 +4831,7 @@ "message": "کلمه عبور اصلی شما الزامات سیاست این سازمان را برآورده نمی‌کند. برای پیوستن به سازمان، باید کلمه عبور اصلی خود را هم اکنون به‌روز کنید. ادامه، شما را از نشست فعلی خود خارج می‌کند و از شما می‌خواهد دوباره وارد سیستم شوید. نشست‌های فعال در دستگاه‌های دیگر ممکن است تا یک ساعت فعال بمانند." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, "maximumVaultTimeout": { "message": "متوقف شدن گاو‌صندوق" @@ -4865,7 +4865,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", "placeholders": { "hours": { "content": "$1", @@ -4882,7 +4882,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "سباست‌های سازمان شما، عملگر زمان‌بندی گاوصندوق شما را روی $ACTION$ تنظیم کرده است.", "placeholders": { "action": { "content": "$1", @@ -4918,7 +4918,7 @@ "message": "پر کردن خودکار را فعال کنید" }, "activateAutofillPolicyDesc": { - "message": "Activate the auto-fill on page load setting on the browser extension for all existing and new members." + "message": "تنظیم پر کردن خودکار در بارگذاری صفحه را در افزونه مرورگر برای همه اعضای موجود و جدید فعال کنید." }, "experimentalFeature": { "message": "وب‌سایت‌های در معرض خطر یا نامعتبر می‌توانند از پر کردن خودکار در بارگذاری صفحه سوء استفاده کنند." @@ -5227,15 +5227,15 @@ "message": "رابط کلید" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "ورود به سیستم با SSO را به سرور کلید رمزگشایی خود میزبانی شده متصل کنید. با استفاده از این گزینه، اعضا نیازی به استفاده از کلمه عبور اصلی خود برای رمزگشایی داده‌های گاوصندوق ندارند. ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "به احراز هویت SSO و سیاست‌های سازمانی واحد نیاز دارد", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "برای راه اندازی رمزگشایی Key Connector مورد نیاز است. برای راهنمایی راه اندازی با پشتیبانی Bitwarden تماس بگیرید.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -5453,7 +5453,7 @@ "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountLoggedInAsName": { - "message": "Account: Logged in as $NAME$", + "message": "حساب کاربری: با نام $NAME$ وارد شده‌اید", "placeholders": { "name": { "content": "$1", @@ -5683,7 +5683,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "مقدار ورودی باید حداقل $MIN$ باشد.", "placeholders": { "min": { "content": "$1", @@ -5692,7 +5692,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "مقدار ورودی نباید از $MAX$ تجاوز کند.", "placeholders": { "max": { "content": "$1", @@ -5970,7 +5970,7 @@ } }, "deleteServiceAccountToast": { - "message": "Service account deleted" + "message": "حساب سرویس حذف شد" }, "deleteServiceAccountsToast": { "message": "حساب‌های سرویس حذف شد" @@ -6132,7 +6132,7 @@ "description": "Title for the section displaying access tokens." }, "newAccessToken": { - "message": "New access token", + "message": "توکن دسترسی جدید", "description": "Button label for creating a new access token." }, "expires": { @@ -6198,7 +6198,7 @@ "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "No access token selected to revoke", + "message": "هیچ توکن دسترسی برای لغو انتخاب نشده است", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "راهنمای همگام‌سازی صورتحساب" }, + "licensePaidFeaturesHelp": { + "message": "ویژگی‌های پولی مجوز کمک می‌کند" + }, + "selfHostGracePeriodHelp": { + "message": "پس از انقضای اشتراک شما، 60 روز فرصت دارید تا فایل مجوز به روز شده را در سازمان خود اعمال کنید. پایان دوره مهلت $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "بارگذاری مجوز" }, @@ -6592,10 +6604,10 @@ "message": "تکرار KDF کم" }, "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." + "message": "تنظیمات رمزگذاری خود را برای رعایت توصیه‌های امنیتی جدید و بهبود حفاظت از حساب به‌روزرسانی کنید." }, "changeKdfLoggedOutWarning": { - "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login setup. We recommend exporting your vault before changing your encryption settings to prevent data loss." + "message": "ادامه، شما را از تمام نشست‌های فعال خارج می‌کند. شما باید دوباره وارد شوید و راه اندازی دو مرحله ای ورود را تکمیل کنید. توصیه می‌کنیم قبل از تغییر در تنظیمات رمزگذاری برای جلوگیری از، از دست رفتن داده‌ها، گاوصندوق خود را برون ریزی کنید." }, "secretsManagerBeta": { "message": "بتا مدیر اسرار" @@ -6767,39 +6779,50 @@ "message": "نادیده گرفتن" }, "notAvailableForFreeOrganization": { - "message": "This feature is not available for free organizations. Contact your organization owner to upgrade." + "message": "این ویژگی برای سازمان‌های رایگان در دسترس نیست. برای ارتقا با مالک سازمان خود تماس بگیرید." }, "smProjectSecretsNoItemsNoAccess": { - "message": "Contact your organization's admin to manage secrets for this project.", + "message": "برای مدیریت اسرار این پروژه با سرپرست سازمان خود تماس بگیرید.", "description": "The message shown to the user under a project's secrets tab when the user only has read access to the project." }, "enforceOnLoginDesc": { - "message": "Require existing members to change their passwords" + "message": "از اعضای موجود بخواهید کلمه‌های عبور خود را تغییر دهند" + }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" }, "smProjectDeleteAccessRestricted": { - "message": "You don't have permissions to delete this project", + "message": "شما مجوز حذف این پروژه را ندارید", "description": "The individual description shown to the user when the user doesn't have access to delete a project." }, "smProjectsDeleteBulkConfirmation": { - "message": "The following projects can not be deleted. Would you like to continue?", + "message": "پروژه‌های زیر قابل حذف نیستند. آیا می‌خواهید ادامه دهید؟", "description": "The message shown to the user when bulk deleting projects and the user doesn't have access to some projects." }, "updateKdfSettings": { - "message": "Update KDF settings" + "message": "تنظیمات KDF را به‌روز کنید" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "رمزگذاری دستگاه مورد اعتماد" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "پس از احراز هویت، اعضا با استفاده از کلید ذخیره شده در دستگاه خود، داده‌های گاوصندوق را رمزگشایی می‌کنند.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "سیاست بازنشانی کلمه عبور اصلی", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "با ثبت نام خودکار زمانی که از این گزینه استفاده می‌شود روشن می‌شود.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 0f136b0519a..6f64031de33 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -2029,7 +2029,7 @@ "message": "Irtisano tilaus" }, "subscriptionExpiration": { - "message": "Tilauksen päättyminen" + "message": "Tilaus päättyy" }, "subscriptionCanceled": { "message": "Tilaus irtisanottiin." @@ -2445,7 +2445,7 @@ "message": "Tapahtumalokit" }, "people": { - "message": "Ihmiset" + "message": "Henkilöt" }, "policies": { "message": "Käytännöt" @@ -5227,15 +5227,15 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Liitä kertakirjautuminen itse ylläpitämääsi salauksenpurun avainpalvelimeen. Tätä valintaa käyttämällä jäsenten ei tarvitse käyttää pääsalasanojaan holvin salauksen purkuun.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "\"Vaadi todennus kertakirjautumisella\" ja \"Yksittäinen organisaatio\" -käytännöt", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "vaaditaan Key Connector -salauksenpurun käyttöönottoon. Ole yhteydessä Bitwardenin asiakaspalveluun saadaksesi apua määritykseen.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6198,7 +6198,7 @@ "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "Käyttötunnistetta ei ole valittu kumottavaksi", + "message": "Mitätöitäviä käyttötunnisteita ei valittu", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Laskutuksen synkronoinnin ohje" }, + "licensePaidFeaturesHelp": { + "message": "Maksullisen lisenssin oiminaisuusopas" + }, + "selfHostGracePeriodHelp": { + "message": "Kun tilauksesi päättyy, sinulla on 60 päivää aikaa päivittää organisaatiosi lisenssitiedosto ajan tasalle. Varoaika päättyy $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Tallenna lisenssi" }, @@ -6635,7 +6647,7 @@ "message": "Tuontitiedostoa luettaessa tapahtui virhe." }, "accessedSecret": { - "message": "Salaisuus avattiin $SECRET_ID$.", + "message": "Avasi salaisuuden $SECRET_ID$.", "placeholders": { "secret_id": { "content": "$1", @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Vaadi nykyisiä jäseniä vaihtamaan salasanansa" }, + "region": { + "message": "Alue" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Käyttöoikeutesi eivät salli tämän projektin poistamista", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Päivitä KDF-asetukset" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Luotettu laitesalaus" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Kun jäsenet on todennettu, he voivat purkaa holvin salauksen heidän laitteillaan säilytettävällä avaimella.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "Pääsalasanan palautuskäytäntö", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "automaattisella liitoksella otetaan käyttöön tätä valintaa käytettäessä.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 866cc9f5c99..0e773217e8a 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Tulong sa Pagsingil Sync" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Mag-upload ng lisensya" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 2210690eb73..dfd0090d79a 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Aide sur la Synchronisation de la Facturation" }, + "licensePaidFeaturesHelp": { + "message": "Aide sur les fonctionnalités payantes de la licence" + }, + "selfHostGracePeriodHelp": { + "message": "Après l'expiration de votre abonnement, vous avez 60 jours pour appliquer un fichier de licence mis à jour à votre organisation. La période de grâce se termine le $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Téléverser la licence" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Exiger que les membres existants changent leurs mots de passe" }, + "region": { + "message": "Région" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Vous n'avez pas les droits pour supprimer ce projet", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 7872a69084e..13e7f1be72e 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index a13e1a7b029..a44d6b8becf 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index aa05de57df7..b74b448b9c4 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 375d11fa133..d3c6a469f0f 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Pomoć za sinkronizaciju naplate" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Prenesi licencu" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 02a483debe3..2dd2fa6b9b7 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -5227,15 +5227,15 @@ "message": "Kulcskapcsoló" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Kapcsoljuk az egyszeri bejelentkezést a saját üzemeltetésű visszafejtési kulcsszerveréhez. Ezzel a lehetőséggel a tagoknak nem kell használniuk fő jelszavaikat a tárolóadatok visszafejtéséhez.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "SSO-hitelesítést és önálló szervezeti szabályzatot igényelnek", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "szükségesek a Key Connector visszafejtésének beállításához. Beállítási segítségért forduljunk a Bitwarden ügyfélszolgálatához.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Számlázási szinkronizálás súgó" }, + "licensePaidFeaturesHelp": { + "message": "Licensz fizetős funkciók súgó" + }, + "selfHostGracePeriodHelp": { + "message": "Az előfizetés lejárta után 60 nap áll rendelkezésére a frissített licenszfájl alkalmazásához a szervezetben. A türelmi időszak lejárata: $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Licensz letöltése" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "A meglévő tagoknak meg kell változtatniuk jelszavaikat." }, + "region": { + "message": "Régió" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Nincs jogosulltság ezen projekt törléséhez.", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "KDF beállítások frissítése" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Megbízható eszköztitkosítás" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "A hitelesítés után a tagok az eszközükön tárolt kulccsal visszafejtik a tároló adatait.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "mesterjelszó alaphelyzetbe állítási szabályzat", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "automatikus regisztrációval bekapcsolásra kerül ezen opció használatával.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 1d65434418f..99a3acdd862 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index aa02e33f5a1..c4eb7b6b5ae 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Aiuto per la sincronizzazione della fatturazione" }, + "licensePaidFeaturesHelp": { + "message": "Guida alle funzionalità a pagamento con licenza" + }, + "selfHostGracePeriodHelp": { + "message": "Dopo che il tuo abbonamento scade, hai 60 giorni per applicare un file di licenza aggiornato alla tua organizzazione. Il periodo di grazia termina il $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Carica licenza" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Obbliga i membri esistenti a cambiare le loro password" }, + "region": { + "message": "Regione" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Non hai l'autorizzazione per eliminare questo progetto", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index a3193f034a7..b58fad1d1ed 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -5227,15 +5227,15 @@ "message": "キーコネクター" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "SSO でログインして自己ホスト型の復号キーサーバーに接続します。このオプションを使用すると、メンバーは保管庫のデータを復号するためにマスターパスワードを使用する必要はありません。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "SSO 認証と単一の組織ポリシーが必要です", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "キーコネクターの復号のセットアップに必要です。Bitwarden サポートにお問い合わせください。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "請求同期のヘルプ" }, + "licensePaidFeaturesHelp": { + "message": "有料機能ライセンスのヘルプ" + }, + "selfHostGracePeriodHelp": { + "message": "サブスクリプションの有効期限が切れた後、60日以内なら期限を更新したライセンスファイルを組織に適用できます。猶予期間は $GRACE_PERIOD_END_DATE$ までです。", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "ライセンスをアップロード" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "パスワードを変更するには、メンバーが存在しないといけません" }, + "region": { + "message": "リージョン" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "米国", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "このプロジェクトを削除する権限がありません", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "KDF の設定を更新する" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "信頼できるデバイスの暗号化" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "認証が完了すると、メンバーはデバイスに保存されているキーを使用して保管庫のデータを復号します。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "マスターパスワードのリセットポリシー", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "このオプションを使用すると、自動登録が有効になります。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 8da28142fc2..9331bfc82e2 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 7872a69084e..13e7f1be72e 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 8c463f86374..8f6407f7576 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 2b70172330d..007d37be7cd 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 09c4b21f75b..bb763b2d728 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -5227,15 +5227,15 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Savienot pierakstīšanos ar vienoto pieteikšanos pašizvietotā atšifrēšanas atslēgu serverī. Šī iespēja nodrošina, ka dalībniekiem nebūs nepieciešama galvenā parole, lai atšifrētu glabātavas saturu.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "Pieprasīt vienoto pieteikšanos un vienas apvienības nosacījumi", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "ir nepieciešami, lai uzstādītu Key Connector atšifrēšanu. Jāsazinās ar Bitwarden atbalstu, lai iegūtu palīdzību uzstādīšanā.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Norēķinu sinhronizācijas palīdzība" }, + "licensePaidFeaturesHelp": { + "message": "Palīdzība par licences apmaksātajām iespējām" + }, + "selfHostGracePeriodHelp": { + "message": "Pēc abonementa izbeigšanās ir 60 dienas, lai apvienībai piemērotu atjauninātu licenci. Atjaunošanas laika posms beidzas $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Augšupielādēt licenci" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Pieprasīt esošajiem dalībniekiem nomainīt to paroles" }, + "region": { + "message": "Apgabals" + }, + "eu": { + "message": "ES", + "description": "European Union" + }, + "us": { + "message": "ASV", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Nav nepieciešamo atļauju, lai izdzēstu šo projektu", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Atjaunināt KDF iestatījumus" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Uzticamo ierīču šifrēšana" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Pēc pieteikšanās dalībnieki atšifrēs glabātavas saturu ar ierīcē glabātu atslēgu.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "Galvenās paroles atiestatīšanas nosacījums", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "ar automātisku ievietošanu sarakstā tiks ieslēgts, kad šī iespēja ir izmantota.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 855daa89ba3..b54b1a07dd2 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 7872a69084e..13e7f1be72e 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 514af6b4c00..9c4d4cecd8f 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Hjelp til fakturasynkronisering" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Last opp lisens" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 058092eaf0b..06fcd6e89a1 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 6f8070942b8..c8a99bea69f 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Hulp bij facturatiesynchronisatie" }, + "licensePaidFeaturesHelp": { + "message": "Licentiehulp betaalde functionaliteit" + }, + "selfHostGracePeriodHelp": { + "message": "Als je abonnement is verlopen, heb je 60 dagen voor het toepassen van een bijgewerkt licentiebestand op je organisatie. De gratieperiode eindigt $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Licentie uploaden" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Verplicht bestaande leden hun wachtwoord te wijzigen" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Je hebt geen rechten om dit project te verwijderen", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 9120b783cbf..1f20f1b7565 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 7872a69084e..13e7f1be72e 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 4b33353e54f..075336f6128 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -5227,7 +5227,7 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Połącz logowanie za pomocą SSO z Twoim serwerem kluczy odszyfrowania. Używając tej opcji, użytkownicy nie będą musieli używać swoich haseł głównych, aby odszyfrować dane sejfu.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { @@ -5235,7 +5235,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "są wymagane do skonfigurowania deszyfrowania Key Connector. Skontaktuj się z pomocą Bitwarden, aby uzyskać pomoc.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Pomoc synchronizacji płatności" }, + "licensePaidFeaturesHelp": { + "message": "Pomoc w zakresie płatnych funkcji licencyjnych" + }, + "selfHostGracePeriodHelp": { + "message": "Po wygaśnięciu subskrypcji masz 60 dni na dodanie zaktualizowanego pliku licencji dla Twojej organizacji. Okres karencji kończy się $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Prześlij licencję" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Wymagaj od istniejących członków zmiany haseł" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Nie masz uprawnień do usunięcia tego projektu", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Zaktualizuj ustawienia KDF" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Szyfrowanie zaufanego urządzenia" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Po uwierzytelnieniu użytkownicy odszyfrowają dane sejfu przy użyciu klucza zapisanego na ich urządzeniu.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "Zasady resetowania hasła głównego", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "z automatycznym zapisem włączy się, gdy ta opcja jest używana.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 1b10a10c9ad..ce6b449b55c 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index c9aa8ba987a..79aeec7ed51 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -180,7 +180,7 @@ "message": "Não atribuido" }, "noneFolder": { - "message": "Nenhuma pasta", + "message": "Em nenhuma pasta", "description": "This is the folder for uncategorized items" }, "addFolder": { @@ -297,10 +297,10 @@ "description": "Search Secure Note type" }, "searchVault": { - "message": "Pesquisar cofre" + "message": "Procurar no cofre" }, "searchMyVault": { - "message": "Search my vault" + "message": "Procurar no meu cofre" }, "searchOrganization": { "message": "Search organization" @@ -360,7 +360,7 @@ "message": "Apelido" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "address1": { "message": "Endereço 1" @@ -405,7 +405,7 @@ "message": "Ver item" }, "new": { - "message": "New", + "message": "Novo", "description": "for adding new items" }, "item": { @@ -462,7 +462,7 @@ "message": "Eu" }, "myVault": { - "message": "O meu Cofre" + "message": "O meu cofre" }, "allVaults": { "message": "Todos os Cofres" @@ -628,7 +628,7 @@ "message": "Criar conta" }, "newAroundHere": { - "message": "Novo por aqui?" + "message": "É novo por cá?" }, "startTrial": { "message": "Iniciar avaliação" @@ -658,10 +658,10 @@ "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer." }, "masterPassImportant": { - "message": "As palavras-passe mestras não podem ser recuperadas se as esquecer!" + "message": "A palavras-passe mestra não pode ser recuperada se a esquecer!" }, "masterPassHintDesc": { - "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer." + "message": "Uma dica da palavra-passe mestra pode ajudá-lo a lembrar-se da sua palavra-passe, caso se esqueça dela." }, "reTypeMasterPass": { "message": "Reescreva a palavra-passe mestra" @@ -691,13 +691,13 @@ "message": "Endereço de email inválido." }, "masterPasswordRequired": { - "message": "A palavra-passe mestra é necessária." + "message": "É necessária a palavra-passe mestra." }, "confirmMasterPasswordRequired": { "message": "É necessário reescrever a palavra-passe mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A palavra-passe mestra deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -819,7 +819,7 @@ "message": "Enviar email com o código de confirmação novamente" }, "useAnotherTwoStepMethod": { - "message": "Utilizar outro método de início de sessão de dois passos" + "message": "Utilizar outro método de verificação de dois passos" }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." @@ -831,13 +831,13 @@ "message": "Início de sessão indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem o início de sessão de dois passos ativado, no entanto, nenhum dos provedores de início de sessão de dois passos configurados são suportados por este navegador web." + "message": "Esta conta tem a verificação de dois passos configurada, no entanto, nenhum dos fornecedores de dois passos configurados é suportado por este navegador web." }, "noTwoStepProviders2": { "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou adicione provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicação de autenticador)." }, "twoStepOptions": { - "message": "Opções de início de sessão de dois passos" + "message": "Opções de verificação de dois passos" }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus provedores de dois passos? Utilize o seu código de recuperação para desativar todos os provedores de dois passos da sua conta." @@ -1292,7 +1292,7 @@ "message": "Selecione o ficheiro a importar" }, "chooseFile": { - "message": "Escolher Ficheiro" + "message": "Escolher ficheiro" }, "noFileChosen": { "message": "Nenhum ficheiro escolhido" @@ -1384,7 +1384,7 @@ "message": "Domínios atualizados" }, "twoStepLogin": { - "message": "Início de sessão de dois passos" + "message": "Verificação de dois passos" }, "twoStepLoginEnforcement": { "message": "Aplicação do Início de Sessão de Dois Passos" @@ -1412,7 +1412,7 @@ "message": "Ver código de recuperação" }, "providers": { - "message": "Provedores", + "message": "Fornecedores", "description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc." }, "enable": { @@ -1441,7 +1441,7 @@ "message": "Tem acesso premium" }, "alreadyPremiumFromOrg": { - "message": "Já tem acesso às funcionalidades premium por causa de uma organização da qual é um membro." + "message": "Já tem acesso a funcionalidades Premium devido a uma organização de que é membro." }, "manage": { "message": "Gerir" @@ -1653,7 +1653,7 @@ "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "orgsReportsDesc": { - "message": "Identifique e feche lacunas de segurança nas contas da sua organização ao clicar nos relatórios abaixo.", + "message": "Identifique e elimine as lacunas de segurança nas contas da sua organização ao clicar nos relatórios abaixo.", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { @@ -1892,7 +1892,7 @@ "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, "premiumSignUpTwoStep": { - "message": "Opções adicionais de início de sessão de dois passos, como YubiKey, FIDO U2F, e Duo." + "message": "Opções adicionais de verificação de dois passos, como YubiKey, FIDO U2F e Duo." }, "premiumSignUpEmergency": { "message": "Acesso de emergência" @@ -2307,7 +2307,7 @@ } }, "limitedUsers": { - "message": "Limite de $COUNT$ utilizadores (incluindo a si)", + "message": "Limite de $COUNT$ utilizadores (incluindo o próprio)", "placeholders": { "count": { "content": "$1", @@ -2490,7 +2490,7 @@ "message": "Quando um membro é revogado, já não terá acesso aos dados da organização. Para restaurar rapidamente o acesso ao membro vá para a aba Revogada." }, "removeUserConfirmationKeyConnector": { - "message": "Atenção! Este utilizador necessita do Key Connector para gerir a sua encriptação. A remoção deste utilizador da sua organização desativará permanentemente a sua conta. Esta ação não pode ser desfeita. Deseja prosseguir?" + "message": "Atenção! Este utilizador necessita do Key Connector para gerir a sua encriptação. Ao remover este utilizador da sua organização desativará permanentemente a sua conta. Esta ação não pode ser desfeita. Deseja prosseguir?" }, "externalId": { "message": "Id externa" @@ -2643,7 +2643,7 @@ "message": "Palavra-passe da conta alterada." }, "enabledUpdated2fa": { - "message": "Início de sessão em dois passos ativado/atualizado." + "message": "Verificação de dois passos guardada" }, "disabled2fa": { "message": "Início de sessão de dois passos desativado." @@ -2796,7 +2796,7 @@ } }, "autofilledItemId": { - "message": "Item $ID$ auto-preenchido.", + "message": "Item $ID$ preenchido automaticamente.", "placeholders": { "id": { "content": "$1", @@ -3186,13 +3186,13 @@ "message": "Minha organização" }, "organizationInfo": { - "message": "Informações da Organização" + "message": "Informações da organização" }, "deleteOrganization": { "message": "Eliminar organização" }, "deletingOrganizationContentWarning": { - "message": "Digite a senha mestra para confirmar a exclusão de $ORGANIZATION$ e todos os dados associados. Os dados do cofre no $ORGANIZATION$ incluem:", + "message": "Introduza a palavra-passe mestra para confirmar a eliminação de $ORGANIZATION$ e de todos os dados associados. Os dados do cofre em $ORGANIZATION$ incluem:", "placeholders": { "organization": { "content": "$1", @@ -3345,7 +3345,7 @@ "message": "Assinatura atualizada" }, "additionalOptions": { - "message": "Opções Adicionais" + "message": "Opções adicionais" }, "additionalOptionsDesc": { "message": "Para ajuda adicional no gerenciamento da sua assinatura, entre em contato com o suporte ao cliente." @@ -4207,7 +4207,7 @@ "message": "Acesso de emergência rejeitado" }, "passwordResetFor": { - "message": "Redefinição da palavra-passe para $USER$. Pode agora iniciar sessão utilizando a nova palavra-passe.", + "message": "Palavra-passe de $USER$ redefinida. Pode agora iniciar sessão utilizando a nova palavra-passe.", "placeholders": { "user": { "content": "$1", @@ -4915,16 +4915,16 @@ "message": "Uma ou mais políticas da organização impedem que exporte o seu cofre pessoal." }, "activateAutofill": { - "message": "Activate auto-fill" + "message": "Ativar o preenchimento automático" }, "activateAutofillPolicyDesc": { - "message": "Activate the auto-fill on page load setting on the browser extension for all existing and new members." + "message": "Ative a definição do preenchimento automático no carregamento da página na extensão do navegador para todos os membros existentes e novos." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Os sites comprometidos ou não fiáveis podem explorar o preenchimento automático no carregamento da página." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Saber mais sobre o preenchimento automático" }, "selectType": { "message": "Selecionar tipo de SSO" @@ -5161,7 +5161,7 @@ "message": "Key Connector URL" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { "message": "Enviar código" @@ -5356,7 +5356,7 @@ "message": "Requested" }, "formErrorSummaryPlural": { - "message": "$COUNT$ campos acima necessitam da sua atenção.", + "message": "Os $COUNT$ campos acima precisam da sua atenção.", "placeholders": { "count": { "content": "$1", @@ -5365,7 +5365,7 @@ } }, "formErrorSummarySingle": { - "message": "1 campo acima necessita da sua atenção." + "message": "1 campo acima precisa da sua atenção." }, "fieldRequiredError": { "message": "$FIELDNAME$ é necessário.", @@ -5392,7 +5392,7 @@ "message": "Necessário se o ID da Entidade não for um URL." }, "openIdOptionalCustomizations": { - "message": "Personalizações Opcionais" + "message": "Personalizações opcionais" }, "openIdAuthorityRequired": { "message": "Required if Authority is not valid." @@ -5404,13 +5404,13 @@ "message": "A sua sessão expirou. Por favor, volte atrás e tente iniciar sessão novamente." }, "exportingPersonalVaultTitle": { - "message": "A Exportar Cofre Pessoal" + "message": "A exportar cofre pessoal" }, "exportingOrganizationVaultTitle": { - "message": "A Exportar Cofre da Organização" + "message": "A exportar cofre da organização" }, "exportingPersonalVaultDescription": { - "message": "Apenas os itens do cofre pessoal associado ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", + "message": "Apenas os itens do cofre pessoal associado a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", "placeholders": { "email": { "content": "$1", @@ -5468,7 +5468,7 @@ "message": "Generator" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "O que é que gostaria de gerar?" }, "passwordType": { "message": "Password type" @@ -5572,16 +5572,16 @@ "message": "API access token" }, "deviceVerification": { - "message": "Verificação do Dispositivo" + "message": "Verificação do dispositivo" }, "enableDeviceVerification": { - "message": "Ativar a Verificação do Dispositivo" + "message": "Ativar a verificação do dispositivo" }, "deviceVerificationDesc": { "message": "Quando ativada, são enviados códigos de verificação para o seu endereço de e-mail ao iniciar sessão a partir de um dispositivo não reconhecido" }, "updatedDeviceVerification": { - "message": "Verificação do Dispositivo Atualizada" + "message": "Verificação do dispositivo atualizada" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { "message": "Tem a certeza de que deseja ativar a Verificação do Dispositivo? Os e-mails com os códigos de verificação serão enviados para: $EMAIL$", @@ -5785,7 +5785,7 @@ "message": "-- Select --" }, "multiSelectPlaceholder": { - "message": "-- Escreva para Filtrar --" + "message": "-- Escreva para filtrar --" }, "multiSelectLoading": { "message": "A recuperar opções..." @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6755,7 +6767,7 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "A palavra-passe mestra deve ter pelo menos $LENGTH$ caracteres.", "placeholders": { "length": { "content": "$1", @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Região" + }, + "eu": { + "message": "UE", + "description": "European Union" + }, + "us": { + "message": "EUA", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index f18a12a5979..81247543973 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 4cd29d0b017..1f0be6cf33e 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Справка по синхронизации биллинга" }, + "licensePaidFeaturesHelp": { + "message": "Справка по платным лицензионным функциям" + }, + "selfHostGracePeriodHelp": { + "message": "После истечения срока действия подписки у вас есть 60 дней, чтобы применить обновленный файл лицензии к вашей организации. Льготный период заканчивается: $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Загрузить лицензию" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Требовать от существующих пользователей смены паролей" }, + "region": { + "message": "Регион" + }, + "eu": { + "message": "Европа", + "description": "European Union" + }, + "us": { + "message": "США", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "У вас недостаточно прав для удаления этого проекта", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 5f3b655d196..23f9c3f3c03 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 71471e8a4ba..06f5fe780d4 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Požadovať po súčasných členoch, aby si zmenili heslo" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Na odstránenie tohto projektu nemáte oprávnenia", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 9b39fc09ebd..f5328846bca 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -1111,7 +1111,7 @@ } }, "loggedOutWarning": { - "message": "Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Po tem dejanju boste odjavljeni in se boste morali prijaviti ponovno. Prijave na drugih napravah bodo ostale aktivne še največ eno uro." }, "emailChanged": { "message": "E-poštni naslov spremenjen" @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6595,7 +6607,7 @@ "message": "Update your encryption settings to meet new security recommendations and improve account protection." }, "changeKdfLoggedOutWarning": { - "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login setup. We recommend exporting your vault before changing your encryption settings to prevent data loss." + "message": "Po tem dejanju boste odjavljeni iz vseh aktivnih sej (na vseh napravah). Prijaviti se boste morali ponovno in zaključiti nastavitev dvostopenjske prijave. Priporočamo vam, da pred tem izvozite svoje podatke, da jih v tem procesu ne bi izgubili." }, "secretsManagerBeta": { "message": "Secrets Manager Beta" @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index c43f2596e5f..2424782b0ce 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Помоћ синх наплате" }, + "licensePaidFeaturesHelp": { + "message": "Помоћ функције које се плаћају лиценцом" + }, + "selfHostGracePeriodHelp": { + "message": "Након што ваша претплата истекне, имате 60 дана да примените ажурирану лиценцу на Вашу организацију. Грациозни период се завршава $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Унос лиценце" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Захтевајте од постојећих чланова да промене њихове лозинке" }, + "region": { + "message": "Регион" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Немате дозволе да избришете овај пројекат", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "Ажурирати KDF подешавања" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Шифровање поузданог уређаја" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Када се аутентификују, чланови ће дешифровати податке из сефљ користећи кључ сачуван на њиховом уређају.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "политика ресетовања главне лозинке", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "са аутоматским уписом ће се укључити када се користи ова опција.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 3b5f75bd253..cf1696e720a 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 5c4c81ae186..69a6a8ad2cd 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 7872a69084e..13e7f1be72e 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 4a0ec91734e..d0df03ccc24 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Upload license" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index afd0c90f900..32bb5c7394a 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -5227,15 +5227,15 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "SSO ile oturum açmak için şirket içinde barındırılan şifre çözme anahtarı sunucunuza bağlayın. Bu seçenek kullanılırsa, üyelerin kasa verilerinin şifresini çözmek için ana parolalarını kullanmaları gerekmez", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "SSO kimlik doğrulaması ve tek kuruluş ilkeleri gerektirir", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "Anahtar Bağlayıcı şifre çözmeyi ayarlamak için gereklidir. Kurulum yardımı için Bitwarden Desteği ile iletişime geçin.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Fatura Eşitlemesi yardımı" }, + "licensePaidFeaturesHelp": { + "message": "Lisanslı ücretli özellikler yardımı" + }, + "selfHostGracePeriodHelp": { + "message": "Aboneliğiniz sona erdikten sonra, güncellenmiş bir lisans dosyasını kuruluşunuza uygulamak için 60 gününüz vardır. Ek süre $GRACE_PERIOD_END_DATE$ tarihinde sona erer.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Lisansı yükle" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Mevcut üyelerin parolalarını değiştirmelerini zorunlu tut" }, + "region": { + "message": "Bölge" + }, + "eu": { + "message": "AB", + "description": "European Union" + }, + "us": { + "message": "ABD", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "Bu projeyi silme izniniz yok", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6788,18 +6811,18 @@ "message": "KDF ayarlarını güncelle" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Güvenilir cihaz şifrelemesi" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Bir kez imliği doğrulandıktan sonra üyeler, cihazlarında saklanan bir anahtarı kullanarak kasa verilerinin şifresini çözebilir.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "ana parola sıfırlama ilkesi", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "Bu seçenek kullanıldığında otomatik kayıt ile açılacaktır.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index ba959c9b86d..5d311a057b0 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -2751,7 +2751,7 @@ } }, "viewCollectionWithName": { - "message": "View collection - $NAME$", + "message": "Переглянути збірку - $NAME$", "placeholders": { "name": { "content": "$1", @@ -2760,7 +2760,7 @@ } }, "editItemWithName": { - "message": "Edit item - $NAME$", + "message": "Редагувати елемент - $NAME$", "placeholders": { "name": { "content": "$1", @@ -5227,15 +5227,15 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "Під'єднайте вхід з SSO до свого власного сервера ключів розшифрування. Скориставшись цією можливістю, учасникам не потрібен буде головний пароль для розшифрування даних сховища.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "Вимога SSO автентифікації та політик єдиної організації", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "є обов'язковими для налаштування розшифрування за допомогою Key Connector. Зверніться до служби підтримки Bitwarden для отримання допомоги з налаштуванням.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -5453,7 +5453,7 @@ "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountLoggedInAsName": { - "message": "Account: Logged in as $NAME$", + "message": "Обліковий запис: Вхід виконано як $NAME$", "placeholders": { "name": { "content": "$1", @@ -6198,7 +6198,7 @@ "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "No access token selected to revoke", + "message": "Не вибрано токенів доступу для відкликання", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Допомога з платіжною синхронізацією" }, + "licensePaidFeaturesHelp": { + "message": "Довідка щодо платних можливостей ліцензії" + }, + "selfHostGracePeriodHelp": { + "message": "Після завершення передплати ви матимете 60 днів, щоб застосувати оновлений файл ліцензії для організації. Пільговий період завершується $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Вивантажити ліцензію" }, @@ -6592,7 +6604,7 @@ "message": "Низький показник KDF-ітерацій" }, "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." + "message": "Оновіть свої налаштування шифрування згідно з новими рекомендаціями щодо безпеки для вдосконалення захисту облікового запису." }, "changeKdfLoggedOutWarning": { "message": "Продовжуючи, ви вийдете з усіх активних сеансів. Необхідно буде повторно виконати вхід і пройти двоетапну перевірку. Перед зміною налаштувань шифрування ми рекомендуємо експортувати ваше сховище, щоб запобігти можливій втраті даних." @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Вимагати від наявних учасників змінювати паролі" }, + "region": { + "message": "Регіон" + }, + "eu": { + "message": "ЄС", + "description": "European Union" + }, + "us": { + "message": "США", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "У вас немає дозволу на видалення цього проєкту", "description": "The individual description shown to the user when the user doesn't have access to delete a project." @@ -6785,21 +6808,21 @@ "description": "The message shown to the user when bulk deleting projects and the user doesn't have access to some projects." }, "updateKdfSettings": { - "message": "Update KDF settings" + "message": "Оновити налаштування KDF" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Шифрування досвіреного пристрою" }, "memberDecryptionTdeDescStart": { - "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", + "message": "Після авторизації учасники розшифровуватимуть дані сховища з використанням ключа, збереженого на їхньому пристрої.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescLink": { - "message": "master password reset policy", + "message": "Політика скидання головного пароля", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescEnd": { - "message": "with automatic enrollment will turn on when this option is used.", + "message": "з автоматичним розгортанням увімкнеться, якщо використовується ця опція.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The master password reset policy with automatic enrollment will turn on when this option is used.'" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 5bae2a630c3..9d0d958352d 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Trợ giúp về Đồng Bộ Thanh Toán" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "Tải lên giấy phép" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index dd4e7801aae..36cf56e1845 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -6198,7 +6198,7 @@ "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "未选择要撤销的访问令牌", + "message": "未选中任何要撤销的访问令牌", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "计费同步帮助" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "订阅到期后,您有 60 天时间为您的组织应用更新后的许可证文件。宽限期结束于 $GRACE_PERIOD_END_DATE$。", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "上传许可证" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "要求现有成员更改他们的密码" }, + "region": { + "message": "区域" + }, + "eu": { + "message": "欧盟", + "description": "European Union" + }, + "us": { + "message": "美国", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "您无权删除此项目", "description": "The individual description shown to the user when the user doesn't have access to delete a project." diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 3b229d49f6c..c5eb754cd15 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -6552,6 +6552,18 @@ "billingSyncHelp": { "message": "Billing Sync help" }, + "licensePaidFeaturesHelp": { + "message": "License paid features help" + }, + "selfHostGracePeriodHelp": { + "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "placeholders": { + "GRACE_PERIOD_END_DATE": { + "content": "$1", + "example": "May 12, 2024" + } + } + }, "uploadLicense": { "message": "上傳授權證" }, @@ -6776,6 +6788,17 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, + "region": { + "message": "Region" + }, + "eu": { + "message": "EU", + "description": "European Union" + }, + "us": { + "message": "US", + "description": "United States" + }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", "description": "The individual description shown to the user when the user doesn't have access to delete a project." From b3e276e8d5a684a849b26dec49c28365a9ddefef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 10:39:08 +0200 Subject: [PATCH 049/299] Autosync the updated translations (#5515) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ca/messages.json | 6 +-- apps/browser/src/_locales/nl/messages.json | 2 +- apps/browser/src/_locales/pt_PT/messages.json | 54 +++++++++---------- apps/browser/src/_locales/sl/messages.json | 18 +++---- apps/browser/store/locales/pt_PT/copy.resx | 2 +- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index e117d21790c..91bbfdb48b4 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -2222,17 +2222,17 @@ } }, "region": { - "message": "Region" + "message": "Regió" }, "opensInANewWindow": { "message": "S'obri en una finestra nova" }, "eu": { - "message": "EU", + "message": "UE", "description": "European Union" }, "us": { - "message": "US", + "message": "EUA", "description": "United States" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index cf3cae05d40..68a6ba26b1f 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -2225,7 +2225,7 @@ "message": "Regio" }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "Opent in een nieuw venster" }, "eu": { "message": "EU", diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 99503282049..c68d9cff8fe 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden", + "message": "Bitwarden - Gestor de palavras-passe gratuito", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -38,10 +38,10 @@ "message": "Palavra-passe Mestra" }, "masterPassDesc": { - "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer." + "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não há forma de recuperar a palavra-passe no caso de a esquecer." }, "masterPassHintDesc": { - "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer." + "message": "Uma dica da palavra-passe mestra pode ajudá-lo a lembrar-se da sua palavra-passe, caso se esqueça dela." }, "reTypeMasterPass": { "message": "Re-digite a palavra-passe mestra" @@ -59,7 +59,7 @@ "message": "O meu cofre" }, "allVaults": { - "message": "Todos os Cofres" + "message": "Todos os cofres" }, "tools": { "message": "Ferramentas" @@ -89,7 +89,7 @@ "message": "Copiar código de segurança" }, "autoFill": { - "message": "Auto-preencher" + "message": "Preenchimento automático" }, "generatePasswordCopied": { "message": "Gerar Palavra-passe (copiada)" @@ -157,7 +157,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Início de Sessão de Dois Passos" + "message": "Verificação de dois passos" }, "logOut": { "message": "Terminar Sessão" @@ -196,7 +196,7 @@ "message": "Ajuda e feedback" }, "helpCenter": { - "message": "Centrro de ajuda do Bitwarden" + "message": "Centro de ajuda do Bitwarden" }, "communityForums": { "message": "Explorar os fóruns da comunidade do Bitwarden" @@ -279,7 +279,7 @@ "message": "Evitar caracteres ambíguos" }, "searchVault": { - "message": "Pesquisar cofre" + "message": "Procurar no cofre" }, "edit": { "message": "Editar" @@ -348,7 +348,7 @@ "message": "O seu navegador web não suporta cópia fácil da área de transferência. Em alternativa, copie manualmente." }, "verifyIdentity": { - "message": "Verificar Identidade" + "message": "Verificar identidade" }, "yourVaultIsLocked": { "message": "O seu cofre está bloqueado. Verifique a sua palavra-passe mestra para continuar." @@ -433,7 +433,7 @@ "message": "Endereço de email inválido." }, "masterPasswordRequired": { - "message": "A palavra-passe mestra é necessária." + "message": "É necessária a palavra-passe mestra." }, "confirmMasterPasswordRequired": { "message": "É necessário reescrever a palavra-passe mestra." @@ -507,7 +507,7 @@ "message": "Pode alterar a sua palavra-passe mestra no cofre web bitwarden.com. Pretende visitar o website agora?" }, "twoStepLoginConfirmation": { - "message": "O início de sessão de dois passos torna a sua conta mais segura ao requerer que verifique o seu início de sessão com outro dispositivo como uma chave de segurança, aplicação de autenticação, SMS, chamada telefónica, ou email. O início de sessão de dois passos pode ser ativado no cofre web bitwarden.com. Pretende visitar o website agora?" + "message": "A verificação de dois passos torna a sua conta mais segura, exigindo que verifique o seu início de sessão com outro dispositivo, como uma chave de segurança, aplicação de autenticação, SMS, chamada telefónica ou e-mail. A verificação de dois passos pode ser configurada em bitwarden.com. Pretende visitar o site agora?" }, "editedFolder": { "message": "Pasta editada" @@ -583,7 +583,7 @@ "message": "Pesquisar tipo" }, "noneFolder": { - "message": "Nenhuma pasta", + "message": "Em nenhuma pasta", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -787,7 +787,7 @@ "message": "1 GB de armazenamento encriptado para anexos de ficheiros." }, "ppremiumSignUpTwoStep": { - "message": "Opções de início de sessão de dois passos adicionais como YubiKey, FIDO U2F, e Duo." + "message": "Opções adicionais de verificação de dois passos, como YubiKey, FIDO U2F e Duo." }, "ppremiumSignUpReports": { "message": "Higiene de palavras-passe, saúde das contas, e relatórios de brechas de dados para manter o seu cofre seguro." @@ -868,7 +868,7 @@ "message": "Enviar código de verificação novamente" }, "useAnotherTwoStepMethod": { - "message": "Utilizar outro método de início de sessão de dois passos" + "message": "Utilizar outro método de verificação de dois passos" }, "insertYubiKey": { "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma." @@ -889,13 +889,13 @@ "message": "Início de sessão indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem o início de sessão de dois passos ativado, no entanto, nenhum dos provedores de início de sessão de dois passos configurados são suportados por este navegador web." + "message": "Esta conta tem a verificação de dois passos configurada, no entanto, nenhum dos fornecedores de dois passos configurados é suportado por este navegador web." }, "noTwoStepProviders2": { "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou adicione provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicação de autenticador)." }, "twoStepOptions": { - "message": "Opções de início de sessão de dois passos" + "message": "Opções de verificação de dois passos" }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus provedores de dois passos? Utilize o seu código de recuperação para desativar todos os provedores de dois passos da sua conta." @@ -1155,7 +1155,7 @@ "message": "Último nome" }, "fullName": { - "message": "Nome Completo" + "message": "Nome completo" }, "identityName": { "message": "Nome de identidade" @@ -1274,7 +1274,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Nome do Domínio", + "message": "Nome do domínio", "description": "Domain name. Ex. website.com" }, "host": { @@ -1863,7 +1863,7 @@ "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Palavra-passe Mestra Atualizada" + "message": "Palavra-passe mestra atualizada" }, "updateMasterPassword": { "message": "Atualizar Senha Mestra" @@ -1977,10 +1977,10 @@ "message": "A sua sessão expirou. Por favor, volte atrás e tente iniciar sessão novamente." }, "exportingPersonalVaultTitle": { - "message": "A Exportar Cofre Pessoal" + "message": "A exportar cofre pessoal" }, "exportingPersonalVaultDescription": { - "message": "Apenas os itens do cofre pessoal associado ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", + "message": "Apenas os itens do cofre pessoal associado a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos.", "placeholders": { "email": { "content": "$1", @@ -2017,16 +2017,16 @@ "message": "Aleatório" }, "randomWord": { - "message": "Palavra Aleatória" + "message": "Palavra aleatória" }, "websiteName": { - "message": "Nome do Site" + "message": "Nome do site" }, "whatWouldYouLikeToGenerate": { - "message": "O que desejaria de gerar?" + "message": "O que é que gostaria de gerar?" }, "passwordType": { - "message": "Tipo de Palavra-passe" + "message": "Tipo de palavra-passe" }, "service": { "message": "Serviço" @@ -2114,10 +2114,10 @@ "message": "Utilizador incorreto?" }, "newAroundHere": { - "message": "Novo por aqui?" + "message": "É novo por cá?" }, "rememberEmail": { - "message": "Relembrar e-mail" + "message": "Lembrar e-mail" }, "loginWithDevice": { "message": "Log in with device" diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 91fdc621fdf..53c32c686c5 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Prijavite se ali ustvarite nov račun za dostop do vašega varnega trezorja." + "message": "Prijavite se ali ustvarite nov račun za dostop do svojega varnega trezorja." }, "createAccount": { "message": "Ustvari račun" @@ -38,10 +38,10 @@ "message": "Glavno geslo" }, "masterPassDesc": { - "message": "Glavno geslo je geslo, ki ga uporabljate za dostop do vašega trezorja. Zelo pomembno je, da ne pozabite vaše glavno geslo. Gesla ni mogoče obnoviti v primeru, če ga pozabite." + "message": "Glavno geslo je geslo, ki ga uporabljate za dostop do svojega trezorja. Zelo pomembno je, da ga ne pozabite. Če pozabite glavno geslo, ga ne bo mogoče obnoviti." }, "masterPassHintDesc": { - "message": "Namig glavnega gesla vam lahko pomaga, da se spomnite vašega gesla, če ga pozabite." + "message": "Če pozabite glavno geslo, boste prejeli ta namig, da bi se gesla laže spomnili." }, "reTypeMasterPass": { "message": "Ponovno vnesite glavno geslo" @@ -678,13 +678,13 @@ "message": "Ta datoteka z izvoženimi podatki vsebuje podatke iz vašega trezorja v nešifrirani obliki. Ne shranjujte in ne pošiljajte je po nezavarovanih kanalih, kot je elektronska pošta. Po uporabi jo takoj izbrišite." }, "encExportKeyWarningDesc": { - "message": "Ta izvoz šifrira vaše podatke z uporabo ključa za šifriranje. Če boste kdaj zamenjali ključ za šifriranje, je potrebno, da ponovno naredite izvoz, ker ne boste mogli dešifrirati to izvoženo datoteko." + "message": "Ta izvoz šifrira vaše podatke z uporabo ključa za šifriranje. Če boste kdaj zamenjali ključ za šifriranje, boste morali podatke izvoziti ponovno, saj pričujočega izvoza ne boste mogli več dešifrirati." }, "encExportAccountWarningDesc": { "message": "Ključ za šifriranje je edinstven za vsak Bitwarden račun, zato ni mogoče da se uvozi šifrirana datoteka v drugi račun." }, "exportMasterPassword": { - "message": "Vnesite vaše glavno geslo za izvoz podatkov iz vašega trezorja." + "message": "Za izvoz podatkov iz trezorja vnesite svoje glavno geslo." }, "shared": { "message": "V skupni rabi" @@ -763,7 +763,7 @@ "message": "Funkcija ni na voljo." }, "updateKey": { - "message": "Ne morete koristiti to funkcijo dokler ne posodobite vaš ključ za šifriranje." + "message": "To funkcijo lahko uporabite šele, ko posodobite svoj šifrirni ključ." }, "premiumMembership": { "message": "Premium članstvo" @@ -841,7 +841,7 @@ "message": "Premium članstvo je potrebno za uporabo te funkcije." }, "enterVerificationCodeApp": { - "message": "Vnesite 6-mestno verifikacijsko kodo iz vaše verifikacijske aplikacije." + "message": "Vnesite 6-mestno verifikacijsko kodo iz svoje aplikacije za avtentikacijo." }, "enterVerificationCodeEmail": { "message": "Vnesite 6-mestno verifikacijsko kodo, ki vam je bila poslana na $EMAIL$.", @@ -898,7 +898,7 @@ "message": "Možnosti dvostopenjske prijave" }, "recoveryCodeDesc": { - "message": "Ste izgubili dostop do vseh vaših ponudnikov dvostopenjske prijave? Uporabite svojo kodo za obnovitev in tako onemogočite dvostopenjsko prijavo v svoj račun." + "message": "Ste izgubili dostop do vseh ponudnikov dvostopenjske prijave? Uporabite svojo kodo za obnovitev in tako onemogočite dvostopenjsko prijavo v svoj račun." }, "recoveryCodeTitle": { "message": "Koda za obnovitev" @@ -1050,7 +1050,7 @@ "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Če kliknete izven pojavnega okna, da preverite vašo epošto za vašo verifikacijsko kodo, bo to povročilo, da se je pojavno okno zapre. Želite odpreti to pojavno okno v novem oknu, tako, da se ne bo zaprlo?" + "message": "Če kliknete izven tega pojavnega okna, da bi preverili pošto, se to pojavno okno zaprlo. Želite odpreti to pojavno okno v novem oknu, da se ne bo zaprlo?" }, "popupU2fCloseMessage": { "message": "Ta spletni brskalnik ne more obdelati U2F zahteve v tem pojavnem oknu. Želite odpreti to pojavno okno v novem oknu, tako, da se lahko prijavite z U2F?" diff --git a/apps/browser/store/locales/pt_PT/copy.resx b/apps/browser/store/locales/pt_PT/copy.resx index 9fd0780a540..b0100928669 100644 --- a/apps/browser/store/locales/pt_PT/copy.resx +++ b/apps/browser/store/locales/pt_PT/copy.resx @@ -167,7 +167,7 @@ Secure and share sensitive data within your Bitwarden Vault from any browser, mo O seu cofre é também convenientemente acessível a partir do menu de contexto de clique de lado direito do rato - Gira automaticamente palvras-passe fortes, aleatórias e seguras + Gera automaticamente palavras-passe fortes, aleatórias e seguras A sua informação é gerida com segurança utilizando encriptação AES-256 bits From 1638a1d6f58416db4596406e6af9548153d95b23 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 10:52:48 +0200 Subject: [PATCH 050/299] Autosync the updated translations (#5519) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/pt_PT/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index c68d9cff8fe..a151ff0fa88 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Gestor de palavras-passe gratuito", + "message": "Bitwarden - Free Password Manager", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { From f7b372a0b068e89b724115a6036902b539b8a4ad Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 26 May 2023 15:58:06 +0200 Subject: [PATCH 051/299] [PM-2276] Upgrade Storybook to v7 (#5258) --- .github/whitelist-capital-letters.txt | 1 - .github/workflows/chromatic.yml | 5 + .storybook/main.js | 33 - .storybook/main.ts | 53 + .storybook/preview.js | 38 - .storybook/preview.tsx | 39 + .storybook/tsconfig.json | 1 + angular.json | 31 +- .../access-selector.stories.ts | 7 +- .../product-switcher.stories.ts | 65 +- .../shared/report-card/report-card.stories.ts | 14 +- .../shared/report-list/report-list.stories.ts | 14 +- .../vault-items/vault-items.stories.ts | 21 +- .../secrets-manager/layout/layout.stories.ts | 75 +- .../overview/onboarding.stories.ts | 26 +- .../secrets-manager/shared/header.stories.ts | 29 +- .../{in-forms.stories.mdx => in-forms.mdx} | 0 .../src/async-actions/in-forms.stories.ts | 26 +- .../{overview.stories.mdx => overview.mdx} | 0 ...{standalone.stories.mdx => standalone.mdx} | 0 .../src/async-actions/standalone.stories.ts | 39 +- libs/components/src/avatar/avatar.stories.ts | 55 +- .../src/badge-list/badge-list.stories.ts | 27 +- libs/components/src/badge/badge.stories.ts | 71 +- .../banner.mdx} | 18 +- libs/components/src/banner/banner.stories.ts | 50 +- .../src/breadcrumbs/breadcrumbs.stories.ts | 98 +- .../button.mdx} | 22 +- libs/components/src/button/button.stories.ts | 150 +- .../components/src/callout/callout.stories.ts | 50 +- .../src/checkbox/checkbox.stories.ts | 73 +- .../color-password.component.ts | 2 +- .../color-password/color-password.stories.ts | 62 +- .../src/dialog/dialog.service.stories.ts | 8 +- .../src/dialog/dialog/dialog.stories.ts | 208 +- ...ple-configurable-dialog.service.stories.ts | 8 +- .../dialog/simple-dialog.service.stories.ts | 8 +- .../simple-dialog/simple-dialog.stories.ts | 116 +- .../src/form-field/bit-validators.stories.ts | 20 +- .../src/form-field/error-summary.stories.ts | 53 +- .../src/form-field/form-field.stories.ts | 313 +- .../src/form-field/multi-select.stories.ts | 423 +- .../password-input-toggle.stories.ts | 83 +- libs/components/src/form/form.stories.ts | 129 +- .../src/icon-button/icon-button.stories.ts | 128 +- libs/components/src/icon/icon.stories.ts | 32 +- libs/components/src/index.ts | 1 + libs/components/src/input/index.ts | 1 + libs/components/src/link/link.stories.ts | 184 +- libs/components/src/menu/menu.stories.ts | 74 +- .../src/navigation/nav-group.stories.ts | 48 +- .../src/navigation/nav-item.stories.ts | 80 +- .../src/no-items/no-items.stories.ts | 44 +- .../src/progress/progress.stories.ts | 29 +- .../src/radio-button/radio-button.stories.ts | 122 +- libs/components/src/search/search.stories.ts | 20 +- libs/components/src/select/select.stories.ts | 40 +- .../{colors.stories.mdx => colors.mdx} | 6 +- .../{forms-docs.stories.mdx => forms.mdx} | 2 +- .../stories/{icons.stories.mdx => icons.mdx} | 4 +- .../{input-docs.stories.mdx => input.mdx} | 4 +- ...roduction.stories.mdx => introduction.mdx} | 6 +- .../src/stories/typography.stories.mdx | 59 - .../table.mdx} | 16 +- libs/components/src/table/table.stories.ts | 256 +- libs/components/src/tabs/tabs.stories.ts | 137 +- .../src/toggle-group/toggle-group.stories.ts | 54 +- libs/components/src/typography/typography.mdx | 67 + .../src/typography/typography.stories.ts | 102 +- libs/components/tailwind.config.js | 7 +- package-lock.json | 18634 ++++------------ package.json | 28 +- 72 files changed, 6340 insertions(+), 16409 deletions(-) delete mode 100644 .storybook/main.js create mode 100644 .storybook/main.ts delete mode 100644 .storybook/preview.js create mode 100644 .storybook/preview.tsx rename libs/components/src/async-actions/{in-forms.stories.mdx => in-forms.mdx} (100%) rename libs/components/src/async-actions/{overview.stories.mdx => overview.mdx} (100%) rename libs/components/src/async-actions/{standalone.stories.mdx => standalone.mdx} (100%) rename libs/components/src/{stories/banner-docs.stories.mdx => banner/banner.mdx} (82%) rename libs/components/src/{stories/button-docs.stories.mdx => button/button.mdx} (88%) create mode 100644 libs/components/src/input/index.ts rename libs/components/src/stories/{colors.stories.mdx => colors.mdx} (98%) rename libs/components/src/stories/{forms-docs.stories.mdx => forms.mdx} (97%) rename libs/components/src/stories/{icons.stories.mdx => icons.mdx} (99%) rename libs/components/src/stories/{input-docs.stories.mdx => input.mdx} (95%) rename libs/components/src/stories/{Introduction.stories.mdx => introduction.mdx} (99%) delete mode 100644 libs/components/src/stories/typography.stories.mdx rename libs/components/src/{stories/table-docs.stories.mdx => table/table.mdx} (96%) create mode 100644 libs/components/src/typography/typography.mdx diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index 9e585d170e9..1fbed379d64 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -24,7 +24,6 @@ ./libs/angular/src/validators/notAllowedValueAsync.validator.ts ./libs/angular/src/services/theming/themeBuilder.ts ./libs/angular/src/interfaces/selectOptions.ts -./libs/components/src/stories/Introduction.stories.mdx ./libs/common/src/misc/nodeUtils.ts ./libs/common/src/misc/linkedFieldOption.decorator.ts ./libs/common/src/misc/serviceUtils.ts diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 453a19423ab..212a80de745 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -31,12 +31,17 @@ jobs: - name: Install Node dependencies run: npm ci + + # Manual build the storybook to resolve a chromatic/storybook bug related to TurboSnap + - name: Build Storybook + run: npm run build-storybook:ci - name: Publish to Chromatic uses: chromaui/action@a89b674adf766dbde41ad9ea2b2b60b91188a0f0 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + storybookBuildDir: ./storybook-static exitOnceUploaded: true onlyChanged: true externals: "[\"libs/components/**/*.scss\", \"libs/components/tailwind.config*.js\"]" diff --git a/.storybook/main.js b/.storybook/main.js deleted file mode 100644 index 3db3964022e..00000000000 --- a/.storybook/main.js +++ /dev/null @@ -1,33 +0,0 @@ -const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); - -module.exports = { - stories: [ - "../libs/components/src/**/*.stories.mdx", - "../libs/components/src/**/*.stories.@(js|jsx|ts|tsx)", - "../apps/web/src/**/*.stories.mdx", - "../apps/web/src/**/*.stories.@(js|jsx|ts|tsx)", - "../bitwarden_license/bit-web/src/**/*.stories.mdx", - "../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)", - ], - addons: [ - "@storybook/addon-links", - "@storybook/addon-essentials", - "@storybook/addon-a11y", - "storybook-addon-designs", - ], - framework: "@storybook/angular", - core: { - builder: "webpack5", - disableTelemetry: true, - }, - env: (config) => ({ - ...config, - FLAGS: JSON.stringify({ - secretsManager: true, - }), - }), - webpackFinal: async (config, { configType }) => { - config.resolve.plugins = [new TsconfigPathsPlugin()]; - return config; - }, -}; diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 00000000000..a7f12f469ba --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,53 @@ +import { StorybookConfig } from "@storybook/angular"; +import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; +import remarkGfm from "remark-gfm"; + +const config: StorybookConfig = { + stories: [ + "../libs/components/src/**/*.mdx", + "../libs/components/src/**/*.stories.@(js|jsx|ts|tsx)", + "../apps/web/src/**/*.mdx", + "../apps/web/src/**/*.stories.@(js|jsx|ts|tsx)", + "../bitwarden_license/bit-web/src/**/*.mdx", + "../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)", + ], + addons: [ + "@storybook/addon-links", + "@storybook/addon-essentials", + "@storybook/addon-a11y", + { + name: "@storybook/addon-docs", + options: { + mdxPluginOptions: { + mdxCompileOptions: { + remarkPlugins: [remarkGfm], + }, + }, + }, + }, + ], + framework: { + name: "@storybook/angular", + options: {}, + }, + core: { + disableTelemetry: true, + }, + env: (config) => ({ + ...config, + FLAGS: JSON.stringify({ + secretsManager: true, + }), + }), + webpackFinal: async (config, { configType }) => { + if (config.resolve) { + config.resolve.plugins = [new TsconfigPathsPlugin()] as any; + } + return config; + }, + docs: { + autodocs: true, + }, +}; + +export default config; diff --git a/.storybook/preview.js b/.storybook/preview.js deleted file mode 100644 index 754e8d2b884..00000000000 --- a/.storybook/preview.js +++ /dev/null @@ -1,38 +0,0 @@ -import { setCompodocJson } from "@storybook/addon-docs/angular"; -import { componentWrapperDecorator, addDecorator } from "@storybook/angular"; - -import docJson from "../documentation.json"; -setCompodocJson(docJson); - -export const parameters = { - actions: { argTypesRegex: "^on[A-Z].*" }, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - }, - }, - options: { - storySort: { - order: ["Documentation", ["Introduction", "Colors", "Icons"], "Component Library"], - }, - }, - docs: { inlineStories: true }, -}; - -// ng-template is used to scope any template reference variables and isolate the previews -const decorator = componentWrapperDecorator( - (story) => ` - -
${story}
-
- -
${story}
-
- - - -` -); - -addDecorator(decorator); diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx new file mode 100644 index 00000000000..86ab6ab3748 --- /dev/null +++ b/.storybook/preview.tsx @@ -0,0 +1,39 @@ +import { setCompodocJson } from "@storybook/addon-docs/angular"; +import { componentWrapperDecorator } from "@storybook/angular"; +import type { Preview } from "@storybook/angular"; + +import docJson from "../documentation.json"; +setCompodocJson(docJson); + +const decorator = componentWrapperDecorator( + (story) => ` + +
${story}
+
+ +
${story}
+
+ + ` +); + +const preview: Preview = { + decorators: [decorator], + parameters: { + actions: { argTypesRegex: "^on[A-Z].*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + options: { + storySort: { + order: ["Documentation", ["Introduction", "Colors", "Icons"], "Component Library"], + }, + }, + docs: { source: { type: "dynamic", excludeDecorators: true } }, + }, +}; + +export default preview; diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json index 397be6b000c..113cc5bcde5 100644 --- a/.storybook/tsconfig.json +++ b/.storybook/tsconfig.json @@ -7,6 +7,7 @@ "exclude": ["../src/test.setup.ts", "../apps/src/**/*.spec.ts", "../libs/**/*.spec.ts"], "files": [ "./typings.d.ts", + "./preview.tsx", "../libs/components/src/main.ts", "../libs/components/src/polyfills.ts" ] diff --git a/angular.json b/angular.json index a2b82cc64e9..4b62c771cbf 100644 --- a/angular.json +++ b/angular.json @@ -135,20 +135,25 @@ } }, "defaultConfiguration": "development" - } - } - }, - "storybook": { - "projectType": "application", - "root": "libs/components", - "sourceRoot": "libs/components/src", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", + }, + "storybook": { + "builder": "@storybook/angular:start-storybook", "options": { - "tsConfig": ".storybook/tsconfig.json", - "styles": ["libs/components/src/styles.scss", "libs/components/src/styles.css"], - "scripts": [] + "configDir": ".storybook", + "browserTarget": "components:build", + "compodoc": true, + "compodocArgs": ["-p", "./tsconfig.json", "-e", "json", "-d", "."], + "port": 6006 + } + }, + "build-storybook": { + "builder": "@storybook/angular:build-storybook", + "options": { + "configDir": ".storybook", + "browserTarget": "components:build", + "compodoc": true, + "compodocArgs": ["-e", "json", "-d", "."], + "outputDir": "storybook-static" } } } diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts index e503aad5871..4fa8e43520d 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.stories.ts @@ -1,6 +1,7 @@ +import { importProvidersFrom } from "@angular/core"; import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; import { action } from "@storybook/addon-actions"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { applicationConfig, Meta, moduleMetadata, Story } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { @@ -39,12 +40,14 @@ export default { FormsModule, TabsModule, TableModule, - PreloadedEnglishI18nModule, JslibModule, IconButtonModule, ], providers: [], }), + applicationConfig({ + providers: [importProvidersFrom(PreloadedEnglishI18nModule)], + }), ], parameters: {}, argTypes: { diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts b/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts index d9494b5eb29..82144afa723 100644 --- a/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts +++ b/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts @@ -1,6 +1,6 @@ -import { Component, Directive, Input } from "@angular/core"; +import { Component, Directive, Input, importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; import { BehaviorSubject } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -49,36 +49,7 @@ export default { StoryLayoutComponent, StoryContentComponent, ], - imports: [ - JslibModule, - MenuModule, - IconButtonModule, - LinkModule, - RouterModule.forRoot( - [ - { - path: "", - component: StoryLayoutComponent, - children: [ - { - path: "", - redirectTo: "vault", - pathMatch: "full", - }, - { - path: "sm/:organizationId", - component: StoryContentComponent, - }, - { - path: "vault", - component: StoryContentComponent, - }, - ], - }, - ], - { useHash: true } - ), - ], + imports: [JslibModule, MenuModule, IconButtonModule, LinkModule, RouterModule], providers: [ { provide: OrganizationService, useClass: MockOrganizationService }, MockOrganizationService, @@ -93,6 +64,36 @@ export default { }, ], }), + applicationConfig({ + providers: [ + importProvidersFrom( + RouterModule.forRoot( + [ + { + path: "", + component: StoryLayoutComponent, + children: [ + { + path: "", + redirectTo: "vault", + pathMatch: "full", + }, + { + path: "sm/:organizationId", + component: StoryContentComponent, + }, + { + path: "vault", + component: StoryContentComponent, + }, + ], + }, + ], + { useHash: true } + ) + ), + ], + }), ], } as Meta; diff --git a/apps/web/src/app/reports/shared/report-card/report-card.stories.ts b/apps/web/src/app/reports/shared/report-card/report-card.stories.ts index 82c5c4e83b3..f3dea693b36 100644 --- a/apps/web/src/app/reports/shared/report-card/report-card.stories.ts +++ b/apps/web/src/app/reports/shared/report-card/report-card.stories.ts @@ -1,5 +1,6 @@ +import { importProvidersFrom } from "@angular/core"; import { RouterTestingModule } from "@angular/router/testing"; -import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { BadgeModule, IconModule } from "@bitwarden/components"; @@ -15,15 +16,12 @@ export default { component: ReportCardComponent, decorators: [ moduleMetadata({ - imports: [ - JslibModule, - BadgeModule, - IconModule, - RouterTestingModule, - PreloadedEnglishI18nModule, - ], + imports: [JslibModule, BadgeModule, IconModule, RouterTestingModule], declarations: [PremiumBadgeComponent], }), + applicationConfig({ + providers: [importProvidersFrom(PreloadedEnglishI18nModule)], + }), ], args: { title: "Exposed Passwords", diff --git a/apps/web/src/app/reports/shared/report-list/report-list.stories.ts b/apps/web/src/app/reports/shared/report-list/report-list.stories.ts index 7a092d99d6d..b477792dd4b 100644 --- a/apps/web/src/app/reports/shared/report-list/report-list.stories.ts +++ b/apps/web/src/app/reports/shared/report-list/report-list.stories.ts @@ -1,5 +1,6 @@ +import { importProvidersFrom } from "@angular/core"; import { RouterTestingModule } from "@angular/router/testing"; -import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { BadgeModule, IconModule } from "@bitwarden/components"; @@ -17,15 +18,12 @@ export default { component: ReportListComponent, decorators: [ moduleMetadata({ - imports: [ - JslibModule, - BadgeModule, - RouterTestingModule, - PreloadedEnglishI18nModule, - IconModule, - ], + imports: [JslibModule, BadgeModule, RouterTestingModule, IconModule], declarations: [PremiumBadgeComponent, ReportCardComponent], }), + applicationConfig({ + providers: [importProvidersFrom(PreloadedEnglishI18nModule)], + }), ], args: { reports: Object.values(reports).map((report) => ({ diff --git a/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts b/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts index 28464289cf0..2f40ad9ab43 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts @@ -1,6 +1,6 @@ -import { Component } from "@angular/core"; +import { importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { applicationConfig, Meta, moduleMetadata, Story } from "@storybook/angular"; import { BehaviorSubject } from "rxjs"; import { AvatarUpdateService } from "@bitwarden/common/abstractions/account/avatar-update.service"; @@ -28,11 +28,6 @@ import { Unassigned } from "../../individual-vault/vault-filter/shared/models/ro import { VaultItemsComponent } from "./vault-items.component"; import { VaultItemsModule } from "./vault-items.module"; -@Component({ - template: "", -}) -class EmptyComponent {} - const organizations = [...new Array(3).keys()].map(createOrganization); const groups = [...Array(3).keys()].map(createGroupView); const collections = [...Array(5).keys()].map(createCollectionView); @@ -46,11 +41,7 @@ export default { component: VaultItemsComponent, decorators: [ moduleMetadata({ - imports: [ - VaultItemsModule, - PreloadedEnglishI18nModule, - RouterModule.forRoot([{ path: "**", component: EmptyComponent }], { useHash: true }), - ], + imports: [VaultItemsModule, RouterModule], providers: [ { provide: EnvironmentService, @@ -103,6 +94,12 @@ export default { }, ], }), + applicationConfig({ + providers: [ + importProvidersFrom(RouterModule.forRoot([], { useHash: true })), + importProvidersFrom(PreloadedEnglishI18nModule), + ], + }), ], args: { disabled: false, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts index f3ae4f57c52..533f86a6e62 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/layout.stories.ts @@ -1,6 +1,6 @@ -import { Component } from "@angular/core"; +import { Component, importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; import { BehaviorSubject } from "rxjs"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; @@ -28,43 +28,46 @@ export default { component: LayoutComponent, decorators: [ moduleMetadata({ - imports: [ - RouterModule.forRoot( - [ - { - path: "", - component: LayoutComponent, - children: [ - { - path: "", - redirectTo: "secrets", - pathMatch: "full", - }, - { - path: "secrets", - component: StoryContentComponent, - data: { - title: "secrets", - searchTitle: "searchSecrets", - }, - }, - { - outlet: "sidebar", - path: "", - component: NavigationComponent, - }, - ], - }, - ], - { useHash: true } - ), - LayoutModule, - IconModule, - PreloadedEnglishI18nModule, - ], + imports: [RouterModule, LayoutModule, IconModule], declarations: [StoryContentComponent], providers: [{ provide: OrganizationService, useClass: MockOrganizationService }], }), + applicationConfig({ + providers: [ + importProvidersFrom( + RouterModule.forRoot( + [ + { + path: "", + component: LayoutComponent, + children: [ + { + path: "", + redirectTo: "secrets", + pathMatch: "full", + }, + { + path: "secrets", + component: StoryContentComponent, + data: { + title: "secrets", + searchTitle: "searchSecrets", + }, + }, + { + outlet: "sidebar", + path: "", + component: NavigationComponent, + }, + ], + }, + ], + { useHash: true } + ) + ), + importProvidersFrom(PreloadedEnglishI18nModule), + ], + }), ], } as Meta; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts index 73fc2738ec8..a25e3863071 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/onboarding.stories.ts @@ -1,5 +1,6 @@ +import { importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { Meta, Story, applicationConfig, moduleMetadata } from "@storybook/angular"; import { delay, of, startWith } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -14,24 +15,15 @@ export default { component: OnboardingComponent, decorators: [ moduleMetadata({ - imports: [ - JslibModule, - RouterModule.forRoot( - [ - { - path: "", - component: OnboardingComponent, - }, - ], - { useHash: true } - ), - LinkModule, - IconModule, - ProgressModule, - PreloadedEnglishI18nModule, - ], + imports: [JslibModule, RouterModule, LinkModule, IconModule, ProgressModule], declarations: [OnboardingTaskComponent], }), + applicationConfig({ + providers: [ + importProvidersFrom(RouterModule.forRoot([], { useHash: true })), + importProvidersFrom(PreloadedEnglishI18nModule), + ], + }), ], } as Meta; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts index 8ded21b9566..508573d4669 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/header.stories.ts @@ -1,6 +1,12 @@ -import { Component, Injectable } from "@angular/core"; +import { Component, Injectable, importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, Story, moduleMetadata, componentWrapperDecorator } from "@storybook/angular"; +import { + Meta, + Story, + moduleMetadata, + componentWrapperDecorator, + applicationConfig, +} from "@storybook/angular"; import { BehaviorSubject, combineLatest, map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -16,8 +22,8 @@ import { NavigationModule, TabsModule, TypographyModule, + InputModule, } from "@bitwarden/components"; -import { InputModule } from "@bitwarden/components/src/input/input.module"; import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/app/tests/preloaded-english-i18n.module"; import { HeaderComponent } from "./header.component"; @@ -68,15 +74,7 @@ export default { moduleMetadata({ imports: [ JslibModule, - RouterModule.forRoot( - [ - { - path: "", - component: HeaderComponent, - }, - ], - { useHash: true } - ), + RouterModule, AvatarModule, BreadcrumbsModule, ButtonModule, @@ -87,7 +85,6 @@ export default { TabsModule, TypographyModule, NavigationModule, - PreloadedEnglishI18nModule, ], declarations: [HeaderComponent, MockProductSwitcher, MockDynamicAvatar], providers: [ @@ -100,6 +97,12 @@ export default { }, ], }), + applicationConfig({ + providers: [ + importProvidersFrom(RouterModule.forRoot([], { useHash: true })), + importProvidersFrom(PreloadedEnglishI18nModule), + ], + }), ], } as Meta; diff --git a/libs/components/src/async-actions/in-forms.stories.mdx b/libs/components/src/async-actions/in-forms.mdx similarity index 100% rename from libs/components/src/async-actions/in-forms.stories.mdx rename to libs/components/src/async-actions/in-forms.mdx diff --git a/libs/components/src/async-actions/in-forms.stories.ts b/libs/components/src/async-actions/in-forms.stories.ts index ef789dc106a..f72f1b64794 100644 --- a/libs/components/src/async-actions/in-forms.stories.ts +++ b/libs/components/src/async-actions/in-forms.stories.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; import { FormsModule, ReactiveFormsModule, Validators, FormBuilder } from "@angular/forms"; import { action } from "@storybook/addon-actions"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { delay, of } from "rxjs"; import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; @@ -145,16 +145,18 @@ export default { ], } as Meta; -const PromiseTemplate: Story = (args: PromiseExampleComponent) => ({ - props: args, - template: ``, -}); +type Story = StoryObj; -export const UsingPromise = PromiseTemplate.bind({}); +export const UsingPromise: Story = { + render: (args) => ({ + props: args, + template: ``, + }), +}; -const ObservableTemplate: Story = (args: PromiseExampleComponent) => ({ - props: args, - template: ``, -}); - -export const UsingObservable = ObservableTemplate.bind({}); +export const UsingObservable: Story = { + render: (args) => ({ + props: args, + template: ``, + }), +}; diff --git a/libs/components/src/async-actions/overview.stories.mdx b/libs/components/src/async-actions/overview.mdx similarity index 100% rename from libs/components/src/async-actions/overview.stories.mdx rename to libs/components/src/async-actions/overview.mdx diff --git a/libs/components/src/async-actions/standalone.stories.mdx b/libs/components/src/async-actions/standalone.mdx similarity index 100% rename from libs/components/src/async-actions/standalone.stories.mdx rename to libs/components/src/async-actions/standalone.mdx diff --git a/libs/components/src/async-actions/standalone.stories.ts b/libs/components/src/async-actions/standalone.stories.ts index 5a8edfaaac4..e4dec780e0b 100644 --- a/libs/components/src/async-actions/standalone.stories.ts +++ b/libs/components/src/async-actions/standalone.stories.ts @@ -1,6 +1,6 @@ import { Component } from "@angular/core"; import { action } from "@storybook/addon-actions"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { delay, of } from "rxjs"; import { LogService } from "@bitwarden/common/abstractions/log.service"; @@ -80,25 +80,24 @@ export default { ], } as Meta; -const PromiseTemplate: Story = (args: PromiseExampleComponent) => ({ - props: args, - template: ``, -}); +type PromiseStory = StoryObj; +type ObservableStory = StoryObj; -export const UsingPromise = PromiseTemplate.bind({}); +export const UsingPromise: PromiseStory = { + render: (args) => ({ + props: args, + template: ``, + }), +}; -const ObservableTemplate: Story = ( - args: ObservableExampleComponent -) => ({ - template: ``, -}); +export const UsingObservable: ObservableStory = { + render: (args) => ({ + template: ``, + }), +}; -export const UsingObservable = ObservableTemplate.bind({}); - -const RejectedPromiseTemplate: Story = ( - args: ObservableExampleComponent -) => ({ - template: ``, -}); - -export const RejectedPromise = RejectedPromiseTemplate.bind({}); +export const RejectedPromise: ObservableStory = { + render: (args) => ({ + template: ``, + }), +}; diff --git a/libs/components/src/avatar/avatar.stories.ts b/libs/components/src/avatar/avatar.stories.ts index 724dc5ec0eb..d3a00fbe344 100644 --- a/libs/components/src/avatar/avatar.stories.ts +++ b/libs/components/src/avatar/avatar.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/angular"; +import { Meta, StoryObj } from "@storybook/angular"; import { AvatarComponent } from "./avatar.component"; @@ -18,41 +18,46 @@ export default { }, } as Meta; -const Template: Story = (args: AvatarComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Default = Template.bind({}); -Default.args = { - color: "#175ddc", +export const Default: Story = { + args: { + color: "#175ddc", + }, }; -export const Large = Template.bind({}); -Large.args = { - size: "large", +export const Large: Story = { + args: { + size: "large", + }, }; -export const Small = Template.bind({}); -Small.args = { - size: "small", +export const Small: Story = { + args: { + size: "small", + }, }; -export const LightBackground = Template.bind({}); -LightBackground.args = { - color: "#d2ffcf", +export const LightBackground: Story = { + args: { + color: "#d2ffcf", + }, }; -export const Border = Template.bind({}); -Border.args = { - border: true, +export const Border: Story = { + args: { + border: true, + }, }; -export const ColorByID = Template.bind({}); -ColorByID.args = { - id: 236478, +export const ColorByID: Story = { + args: { + id: "236478", + }, }; -export const ColorByText = Template.bind({}); -ColorByText.args = { - text: "Jason Doe", +export const ColorByText: Story = { + args: { + text: "Jason Doe", + }, }; diff --git a/libs/components/src/badge-list/badge-list.stories.ts b/libs/components/src/badge-list/badge-list.stories.ts index 91214d8317f..4e580badb1a 100644 --- a/libs/components/src/badge-list/badge-list.stories.ts +++ b/libs/components/src/badge-list/badge-list.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -38,16 +38,19 @@ export default { }, } as Meta; -const ListTemplate: Story = (args: BadgeListComponent) => ({ - props: args, - template: ` - - `, -}); +type Story = StoryObj; -export const Default = ListTemplate.bind({}); -Default.args = { - badgeType: "info", - maxItems: 3, - items: ["Badge 1", "Badge 2", "Badge 3", "Badge 4", "Badge 5"], +export const Default: Story = { + render: (args) => ({ + props: args, + template: ` + + `, + }), + + args: { + badgeType: "info", + maxItems: 3, + items: ["Badge 1", "Badge 2", "Badge 3", "Badge 4", "Badge 5"], + }, }; diff --git a/libs/components/src/badge/badge.stories.ts b/libs/components/src/badge/badge.stories.ts index a5584c1a890..2efe5450d00 100644 --- a/libs/components/src/badge/badge.stories.ts +++ b/libs/components/src/badge/badge.stories.ts @@ -1,5 +1,5 @@ import { CommonModule } from "@angular/common"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { BadgeDirective } from "./badge.directive"; @@ -21,43 +21,54 @@ export default { url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?node-id=1881%3A16956", }, }, -} as Meta; +} as Meta; -const Template: Story = (args: BadgeDirective) => ({ - props: args, - template: ` - Span Badge -

- Link Badge -

- Button - `, -}); +type Story = StoryObj; -export const Primary = Template.bind({}); -Primary.args = {}; - -export const Secondary = Template.bind({}); -Secondary.args = { - badgeType: "secondary", +export const Primary: Story = { + render: (args) => ({ + props: args, + template: ` + Span Badge +

+ Link Badge +

+ Button + `, + }), }; -export const Success = Template.bind({}); -Success.args = { - badgeType: "success", +export const Secondary: Story = { + ...Primary, + args: { + badgeType: "secondary", + }, }; -export const Danger = Template.bind({}); -Danger.args = { - badgeType: "danger", +export const Success: Story = { + ...Primary, + args: { + badgeType: "success", + }, }; -export const Warning = Template.bind({}); -Warning.args = { - badgeType: "warning", +export const Danger: Story = { + ...Primary, + args: { + badgeType: "danger", + }, }; -export const Info = Template.bind({}); -Info.args = { - badgeType: "info", +export const Warning: Story = { + ...Primary, + args: { + badgeType: "warning", + }, +}; + +export const Info: Story = { + ...Primary, + args: { + badgeType: "info", + }, }; diff --git a/libs/components/src/stories/banner-docs.stories.mdx b/libs/components/src/banner/banner.mdx similarity index 82% rename from libs/components/src/stories/banner-docs.stories.mdx rename to libs/components/src/banner/banner.mdx index 61b216523bd..84c71cde954 100644 --- a/libs/components/src/stories/banner-docs.stories.mdx +++ b/libs/components/src/banner/banner.mdx @@ -1,6 +1,8 @@ -import { Meta, Story } from "@storybook/addon-docs"; +import { Meta, Story, Controls, Canvas, Primary } from "@storybook/addon-docs"; - +import * as stories from "./banner.stories"; + + # Banner @@ -15,6 +17,10 @@ persist across all pages a user navigates to. - Avoid stacking multiple banners. - Banners support a button link (text button). + + + + ## Types Icons should remain consistent across these types. Do not change the icon without consulting @@ -24,25 +30,25 @@ Use the following guidelines to help choose the correct type of banner. ### Premium - + Used primarily to encourage user to upgrade to premium. ### Info - + Used to communicate release notes, server maintenance or other informative event. ### Warning - + Used to alert the user of outdated info or versions. ### Danger - + Rarely used, but may be used to alert users over critical messages or very outdated versions. diff --git a/libs/components/src/banner/banner.stories.ts b/libs/components/src/banner/banner.stories.ts index e636124fe01..e2c8a0c82b2 100644 --- a/libs/components/src/banner/banner.stories.ts +++ b/libs/components/src/banner/banner.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -39,34 +39,46 @@ export default { argTypes: { onClose: { action: "onClose" }, }, -} as Meta; +} as Meta; -const Template: Story = (args: BannerComponent) => ({ - props: args, - template: ` - +type Story = StoryObj; + +export const Premium: Story = { + args: { + bannerType: "premium", + }, + render: (args: BannerComponent) => ({ + props: args, + template: ` + Content Really Long Text Lorem Ipsum Ipsum Ipsum - - `, -}); + + `, + }), +}; -export const Premium = Template.bind({}); Premium.args = { bannerType: "premium", }; -export const Info = Template.bind({}); -Info.args = { - bannerType: "info", +export const Info: Story = { + ...Premium, + args: { + bannerType: "info", + }, }; -export const Warning = Template.bind({}); -Warning.args = { - bannerType: "warning", +export const Warning: Story = { + ...Premium, + args: { + bannerType: "warning", + }, }; -export const Danger = Template.bind({}); -Danger.args = { - bannerType: "danger", +export const Danger: Story = { + ...Premium, + args: { + bannerType: "danger", + }, }; diff --git a/libs/components/src/breadcrumbs/breadcrumbs.stories.ts b/libs/components/src/breadcrumbs/breadcrumbs.stories.ts index 782bb39e75d..673b7027278 100644 --- a/libs/components/src/breadcrumbs/breadcrumbs.stories.ts +++ b/libs/components/src/breadcrumbs/breadcrumbs.stories.ts @@ -1,6 +1,6 @@ -import { Component } from "@angular/core"; +import { Component, importProvidersFrom } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { Meta, Story, moduleMetadata } from "@storybook/angular"; +import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; import { IconButtonModule } from "../icon-button"; import { LinkModule } from "../link"; @@ -26,16 +26,19 @@ export default { decorators: [ moduleMetadata({ declarations: [BreadcrumbComponent], - imports: [ - LinkModule, - MenuModule, - IconButtonModule, - RouterModule.forRoot([{ path: "**", component: EmptyComponent }], { useHash: true }), + imports: [LinkModule, MenuModule, IconButtonModule, RouterModule], + }), + applicationConfig({ + providers: [ + importProvidersFrom( + RouterModule.forRoot([{ path: "**", component: EmptyComponent }], { useHash: true }) + ), ], }), ], args: { items: [], + show: 3, }, argTypes: { breadcrumbs: { @@ -45,47 +48,54 @@ export default { }, } as Meta; -const Template: Story = (args: BreadcrumbsComponent) => ({ - props: args, - template: ` -

Router links

-

- - {{item.name}} - -

+type Story = StoryObj; -

Click emit

-

- - {{item.name}} - -

- `, -}); +export const TopLevel: Story = { + render: (args) => ({ + props: args, + template: ` +

Router links

+

+ + {{item.name}} + +

+ +

Click emit

+

+ + {{item.name}} + +

+ `, + }), -export const TopLevel = Template.bind({}); -TopLevel.args = { - items: [{ icon: "bwi-star", name: "Top Level" }] as Breadcrumb[], + args: { + items: [{ icon: "bwi-star", name: "Top Level" }] as Breadcrumb[], + }, }; -export const SecondLevel = Template.bind({}); -SecondLevel.args = { - items: [ - { name: "Acme Vault", route: "/" }, - { icon: "bwi-collection", name: "Collection", route: "collection" }, - ] as Breadcrumb[], +export const SecondLevel: Story = { + ...TopLevel, + args: { + items: [ + { name: "Acme Vault", route: "/" }, + { icon: "bwi-collection", name: "Collection", route: "collection" }, + ] as Breadcrumb[], + }, }; -export const Overflow = Template.bind({}); -Overflow.args = { - items: [ - { name: "Acme Vault", route: "" }, - { icon: "bwi-collection", name: "Collection", route: "collection" }, - { icon: "bwi-collection", name: "Middle-Collection 1", route: "middle-collection-1" }, - { icon: "bwi-collection", name: "Middle-Collection 2", route: "middle-collection-2" }, - { icon: "bwi-collection", name: "Middle-Collection 3", route: "middle-collection-3" }, - { icon: "bwi-collection", name: "Middle-Collection 4", route: "middle-collection-4" }, - { icon: "bwi-collection", name: "End Collection", route: "end-collection" }, - ] as Breadcrumb[], +export const Overflow: Story = { + ...TopLevel, + args: { + items: [ + { name: "Acme Vault", route: "" }, + { icon: "bwi-collection", name: "Collection", route: "collection" }, + { icon: "bwi-collection", name: "Middle-Collection 1", route: "middle-collection-1" }, + { icon: "bwi-collection", name: "Middle-Collection 2", route: "middle-collection-2" }, + { icon: "bwi-collection", name: "Middle-Collection 3", route: "middle-collection-3" }, + { icon: "bwi-collection", name: "Middle-Collection 4", route: "middle-collection-4" }, + { icon: "bwi-collection", name: "End Collection", route: "end-collection" }, + ] as Breadcrumb[], + }, }; diff --git a/libs/components/src/stories/button-docs.stories.mdx b/libs/components/src/button/button.mdx similarity index 88% rename from libs/components/src/stories/button-docs.stories.mdx rename to libs/components/src/button/button.mdx index 3551be8cf6b..fddbda36fb5 100644 --- a/libs/components/src/stories/button-docs.stories.mdx +++ b/libs/components/src/button/button.mdx @@ -1,12 +1,18 @@ -import { Meta, Story } from "@storybook/addon-docs"; +import { Meta, Story, Primary, Controls } from "@storybook/addon-docs"; - +import * as stories from "./button.stories"; + + # Button Buttons are interactive elements that can be triggered using a mouse, keyboard, or touch. They are used to indicate actions that can be performed by a user such as submitting a form. + + + + ## Guidelines ### Choosing the `` or ` - Link - `, -}); +type Story = StoryObj; -export const Primary = Template.bind({}); -Primary.args = { - buttonType: "primary", +export const Primary: Story = { + render: (args) => ({ + props: args, + template: ` + + Link + `, + }), + args: { + buttonType: "primary", + }, }; -export const Secondary = Template.bind({}); -Secondary.args = { - buttonType: "secondary", +export const Secondary: Story = { + ...Primary, + args: { + buttonType: "secondary", + }, }; -export const Danger = Template.bind({}); -Danger.args = { - buttonType: "danger", +export const Danger: Story = { + ...Primary, + args: { + buttonType: "danger", + }, }; -const AllStylesTemplate: Story = (args) => ({ - props: args, - template: ` - - - - `, -}); - -export const Loading = AllStylesTemplate.bind({}); -Loading.args = { - disabled: false, - loading: true, +export const Loading: Story = { + render: (args) => ({ + props: args, + template: ` + + + + `, + }), + args: { + disabled: false, + loading: true, + }, }; -export const Disabled = AllStylesTemplate.bind({}); -Disabled.args = { - disabled: true, - loading: false, +export const Disabled: Story = { + ...Loading, + args: { + disabled: true, + loading: false, + }, }; -const DisabledWithAttributeTemplate: Story = (args) => ({ - props: args, - template: ` - - - - - - - - - - - `, -}); - -export const DisabledWithAttribute = DisabledWithAttributeTemplate.bind({}); -DisabledWithAttribute.args = { - disabled: true, - loading: false, +export const DisabledWithAttribute: Story = { + render: (args) => ({ + props: args, + template: ` + + + + + + + + + + + `, + }), + args: { + disabled: true, + loading: false, + }, }; -const BlockTemplate: Story = (args: ButtonComponent) => ({ - props: args, - template: ` - - - [block]="true" Link - - - block Link - - `, -}); - -export const Block = BlockTemplate.bind({}); -Block.args = { - block: true, +export const Block: Story = { + render: (args: ButtonComponent) => ({ + props: args, + template: ` + + + [block]="true" Link + + + block Link + + `, + }), + args: { + block: true, + }, }; diff --git a/libs/components/src/callout/callout.stories.ts b/libs/components/src/callout/callout.stories.ts index 89469a6f645..f8738e46b3a 100644 --- a/libs/components/src/callout/callout.stories.ts +++ b/libs/components/src/callout/callout.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -35,31 +35,39 @@ export default { }, } as Meta; -const Template: Story = (args: CalloutComponent) => ({ - props: args, - template: ` - Content - `, -}); +type Story = StoryObj; -export const Success = Template.bind({}); -Success.args = { - type: "success", - title: "Success", +export const Success: Story = { + render: (args) => ({ + props: args, + template: ` + Content + `, + }), + args: { + type: "success", + title: "Success", + }, }; -export const Info = Template.bind({}); -Info.args = { - type: "info", - title: "Info", +export const Info: Story = { + ...Success, + args: { + type: "info", + title: "Info", + }, }; -export const Warning = Template.bind({}); -Warning.args = { - type: "warning", +export const Warning: Story = { + ...Success, + args: { + type: "warning", + }, }; -export const Danger = Template.bind({}); -Danger.args = { - type: "danger", +export const Danger: Story = { + ...Success, + args: { + type: "danger", + }, }; diff --git a/libs/components/src/checkbox/checkbox.stories.ts b/libs/components/src/checkbox/checkbox.stories.ts index a384dd2ce01..246e4ada7b0 100644 --- a/libs/components/src/checkbox/checkbox.stories.ts +++ b/libs/components/src/checkbox/checkbox.stories.ts @@ -1,6 +1,6 @@ import { Component, Input } from "@angular/core"; import { FormsModule, ReactiveFormsModule, FormBuilder, Validators } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/src/abstractions/i18n.service"; @@ -69,43 +69,44 @@ export default { }, } as Meta; -const DefaultTemplate: Story = (args: ExampleComponent) => ({ - props: args, - template: ``, -}); +type Story = StoryObj; -export const Default = DefaultTemplate.bind({}); -Default.parameters = { - docs: { - source: { - code: template, +export const Default: Story = { + render: (args) => ({ + props: args, + template: ``, + }), + parameters: { + docs: { + source: { + code: template, + }, }, }, -}; -Default.args = { - checked: false, - disabled: false, + args: { + checked: false, + disabled: false, + }, }; -const CustomTemplate: Story = (args) => ({ - props: args, - template: ` -
- - - -
- `, -}); -CustomTemplate.args = {}; - -export const Custom = CustomTemplate.bind({}); +export const Custom: Story = { + render: (args) => ({ + props: args, + template: ` +
+ + + +
+ `, + }), +}; diff --git a/libs/components/src/color-password/color-password.component.ts b/libs/components/src/color-password/color-password.component.ts index 14b825df715..04172bfa87d 100644 --- a/libs/components/src/color-password/color-password.component.ts +++ b/libs/components/src/color-password/color-password.component.ts @@ -23,7 +23,7 @@ enum CharacterType { preserveWhitespaces: false, }) export class ColorPasswordComponent { - @Input() private password: string = null; + @Input() password: string = null; @Input() showCount = false; characterStyles: Record = { diff --git a/libs/components/src/color-password/color-password.stories.ts b/libs/components/src/color-password/color-password.stories.ts index cba57132bb3..07418cad721 100644 --- a/libs/components/src/color-password/color-password.stories.ts +++ b/libs/components/src/color-password/color-password.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/angular"; +import { Meta, StoryObj } from "@storybook/angular"; import { ColorPasswordComponent } from "./color-password.component"; @@ -19,34 +19,40 @@ export default { }, } as Meta; -const Template: Story = (args: ColorPasswordComponent) => ({ - props: args, - template: ` - - `, -}); +type Story = StoryObj; -const WrappedTemplate: Story = (args: ColorPasswordComponent) => ({ - props: args, - template: ` -
- -
- `, -}); - -export const ColorPassword = Template.bind({}); - -export const WrappedColorPassword = WrappedTemplate.bind({}); - -export const ColorPasswordCount = Template.bind({}); -ColorPasswordCount.args = { - password: examplePassword, - showCount: true, +export const ColorPassword: Story = { + render: (args) => ({ + props: args, + template: ` + + `, + }), }; -export const WrappedColorPasswordCount = WrappedTemplate.bind({}); -WrappedColorPasswordCount.args = { - password: examplePassword, - showCount: true, +export const WrappedColorPassword: Story = { + render: (args) => ({ + props: args, + template: ` +
+ +
+ `, + }), +}; + +export const ColorPasswordCount: Story = { + ...ColorPassword, + args: { + password: examplePassword, + showCount: true, + }, +}; + +export const WrappedColorPasswordCount: Story = { + ...WrappedColorPassword, + args: { + password: examplePassword, + showCount: true, + }, }; diff --git a/libs/components/src/dialog/dialog.service.stories.ts b/libs/components/src/dialog/dialog.service.stories.ts index 5699c04abd1..c189b28bc2a 100644 --- a/libs/components/src/dialog/dialog.service.stories.ts +++ b/libs/components/src/dialog/dialog.service.stories.ts @@ -1,6 +1,6 @@ import { DIALOG_DATA, DialogModule, DialogRef } from "@angular/cdk/dialog"; import { Component, Inject } from "@angular/core"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -90,8 +90,6 @@ export default { }, } as Meta; -const Template: Story = (args: StoryDialogComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; diff --git a/libs/components/src/dialog/dialog/dialog.stories.ts b/libs/components/src/dialog/dialog/dialog.stories.ts index 6e014620138..ce9dedc1288 100644 --- a/libs/components/src/dialog/dialog/dialog.stories.ts +++ b/libs/components/src/dialog/dialog/dialog.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -50,110 +50,118 @@ export default { }, } as Meta; -const Template: Story = (args: DialogComponent) => ({ - props: args, - template: ` - - {{title}} - Dialog body text goes here. - - - - - - - `, -}); +type Story = StoryObj; -export const Default = Template.bind({}); -Default.args = { - dialogSize: "default", - title: "Default", -}; - -export const Small = Template.bind({}); -Small.args = { - dialogSize: "small", - title: "Small", -}; - -export const LongTitle = Template.bind({}); -LongTitle.args = { - dialogSize: "small", - title: "Long_Title_That_Should_Be_Truncated", -}; - -export const Large = Template.bind({}); -Large.args = { - dialogSize: "large", - title: "Large", -}; - -export const Loading = Template.bind({}); -Loading.args = { - dialogSize: "large", - loading: true, - title: "Loading", -}; - -const TemplateScrolling: Story = (args: DialogComponent) => ({ - props: args, - template: ` - - Scrolling Example - - Dialog body text goes here.
- - repeating lines of characters
+export const Default: Story = { + render: (args: DialogComponent) => ({ + props: args, + template: ` + + {{title}} + Dialog body text goes here. + + + + - end of sequence! -
- - - - -
- `, -}); - -export const ScrollingContent = TemplateScrolling.bind({}); -ScrollingContent.args = { - dialogSize: "small", + + `, + }), + args: { + dialogSize: "default", + title: "Default", + }, }; -const TemplateTabbed: Story = (args: DialogComponent) => ({ - props: args, - template: ` - - Tab Content Example - - - First Tab Content - Second Tab Content - Third Tab Content - - - - - - - - `, -}); - -export const TabContent = TemplateTabbed.bind({}); -TabContent.args = { - dialogSize: "large", - disablePadding: true, +export const Small: Story = { + ...Default, + args: { + dialogSize: "small", + title: "Small", + }, }; -TabContent.story = { + +export const LongTitle: Story = { + ...Default, + args: { + dialogSize: "small", + title: "Long_Title_That_Should_Be_Truncated", + }, +}; + +export const Large: Story = { + ...Default, + args: { + dialogSize: "large", + title: "Large", + }, +}; + +export const Loading: Story = { + ...Default, + args: { + dialogSize: "large", + loading: true, + title: "Loading", + }, +}; + +export const ScrollingContent: Story = { + render: (args: DialogComponent) => ({ + props: args, + template: ` + + Scrolling Example + + Dialog body text goes here.
+ + repeating lines of characters
+
+ end of sequence! +
+ + + + +
+ `, + }), + args: { + dialogSize: "small", + }, +}; + +export const TabContent: Story = { + render: (args) => ({ + props: args, + template: ` + + Tab Content Example + + + First Tab Content + Second Tab Content + Third Tab Content + + + + + + + + `, + }), + args: { + dialogSize: "large", + disablePadding: true, + }, parameters: { docs: { storyDescription: `An example of using the \`bitTabGroup\` component within the Dialog. The content padding should be diff --git a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts index 27c66538a0c..f8910fdb8f1 100644 --- a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts +++ b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts @@ -1,6 +1,6 @@ import { DialogModule } from "@angular/cdk/dialog"; import { Component } from "@angular/core"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { SimpleDialogType, SimpleDialogOptions } from "@bitwarden/angular/services/dialog"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -239,8 +239,6 @@ export default { }, } as Meta; -const Template: Story = (args: StoryDialogComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; diff --git a/libs/components/src/dialog/simple-dialog.service.stories.ts b/libs/components/src/dialog/simple-dialog.service.stories.ts index cab7270576e..e4d60c96de0 100644 --- a/libs/components/src/dialog/simple-dialog.service.stories.ts +++ b/libs/components/src/dialog/simple-dialog.service.stories.ts @@ -1,6 +1,6 @@ import { DialogModule, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; import { Component, Inject } from "@angular/core"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -90,8 +90,6 @@ export default { }, } as Meta; -const Template: Story = (args: StoryDialogComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts index 1e5514abe5b..27a82c46109 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { ButtonModule } from "../../button"; import { DialogTitleContainerDirective } from "../directives/dialog-title-container.directive"; @@ -22,61 +22,63 @@ export default { }, } as Meta; -const Template: Story = (args: SimpleDialogComponent) => ({ - props: args, - template: ` - - Alert Dialog - Message Content - - - - - - `, -}); +type Story = StoryObj; -export const Default = Template.bind({}); - -const TemplateWithIcon: Story = (args: SimpleDialogComponent) => ({ - props: args, - template: ` - - - Premium Subscription Available - Message Content - - - - - - `, -}); - -export const CustomIcon = TemplateWithIcon.bind({}); - -const TemplateScroll: Story = (args: SimpleDialogComponent) => ({ - props: args, - template: ` - - Alert Dialog - - Message Content - Message text goes here.
- - repeating lines of characters
-
- end of sequence! -
- - - - -
- `, -}); - -export const ScrollingContent = TemplateScroll.bind({}); -ScrollingContent.args = { - useDefaultIcon: true, +export const Default: Story = { + render: (args) => ({ + props: args, + template: ` + + Alert Dialog + Message Content + + + + + + `, + }), +}; + +export const CustomIcon: Story = { + render: (args) => ({ + props: args, + template: ` + + + Premium Subscription Available + Message Content + + + + + + `, + }), +}; + +export const ScrollingContent: Story = { + render: (args: SimpleDialogComponent) => ({ + props: args, + template: ` + + Alert Dialog + + Message Content + Message text goes here.
+ + repeating lines of characters
+
+ end of sequence! +
+ + + + +
+ `, + }), + args: { + useDefaultIcon: true, + }, }; diff --git a/libs/components/src/form-field/bit-validators.stories.ts b/libs/components/src/form-field/bit-validators.stories.ts index e12b13dd407..9e717a3510f 100644 --- a/libs/components/src/form-field/bit-validators.stories.ts +++ b/libs/components/src/form-field/bit-validators.stories.ts @@ -1,5 +1,5 @@ import { FormsModule, ReactiveFormsModule, FormBuilder } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { StoryObj, Meta, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -46,11 +46,13 @@ const template = ` `; -export const ForbiddenCharacters: Story = (args: BitFormFieldComponent) => ({ - props: { - formObj: new FormBuilder().group({ - name: ["", forbiddenCharacters(["\\", "/", "@", "#", "$", "%", "^", "&", "*", "(", ")"])], - }), - }, - template, -}); +export const ForbiddenCharacters: StoryObj = { + render: (args: BitFormFieldComponent) => ({ + props: { + formObj: new FormBuilder().group({ + name: ["", forbiddenCharacters(["\\", "/", "@", "#", "$", "%", "^", "&", "*", "(", ")"])], + }), + }, + template, + }), +}; diff --git a/libs/components/src/form-field/error-summary.stories.ts b/libs/components/src/form-field/error-summary.stories.ts index f85e579002b..16bfd99ac45 100644 --- a/libs/components/src/form-field/error-summary.stories.ts +++ b/libs/components/src/form-field/error-summary.stories.ts @@ -1,5 +1,5 @@ import { UntypedFormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -50,29 +50,28 @@ function submit() { formObj.markAllAsTouched(); } -const Template: Story = (args: BitFormFieldComponent) => ({ - props: { - formObj: formObj, - submit: submit, - ...args, - }, - template: ` -
- - Name - - - - - Email - - - - - -
- `, -}); - -export const Default = Template.bind({}); -Default.props = {}; +export const Default: StoryObj = { + render: (args) => ({ + props: { + formObj: formObj, + submit: submit, + ...args, + }, + template: ` +
+ + Name + + + + + Email + + + + + +
+ `, + }), +}; diff --git a/libs/components/src/form-field/form-field.stories.ts b/libs/components/src/form-field/form-field.stories.ts index 1b46e6e6c50..c8c520bb817 100644 --- a/libs/components/src/form-field/form-field.stories.ts +++ b/libs/components/src/form-field/form-field.stories.ts @@ -7,7 +7,7 @@ import { ValidatorFn, Validators, } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -87,173 +87,168 @@ function forbiddenNameValidator(nameRe: RegExp): ValidatorFn { function submit() { defaultFormObj.markAllAsTouched(); } +type Story = StoryObj; -const Template: Story = (args: BitFormFieldComponent) => ({ - props: { - formObj: defaultFormObj, - submit: submit, - ...args, - }, - template: ` -
+export const Default: Story = { + render: (args) => ({ + props: { + formObj: defaultFormObj, + submit: submit, + ...args, + }, + template: ` + + + Label + + Optional Hint + +
+ `, + }), +}; + +export const Required: Story = { + render: (args) => ({ + props: { + formObj: formObj, + ...args, + }, + template: ` Label - - Optional Hint + - - `, -}); + + + FormControl + + + `, + }), +}; -export const Default = Template.bind({}); -Default.props = {}; +export const Hint: Story = { + render: (args: BitFormFieldComponent) => ({ + props: { + formObj: formObj, + ...args, + }, + template: ` + + FormControl + + Long hint text + + `, + }), +}; -const RequiredTemplate: Story = (args: BitFormFieldComponent) => ({ - props: { - formObj: formObj, - ...args, - }, - template: ` - - Label - - +export const Disabled: Story = { + render: (args) => ({ + props: args, + template: ` + + Label + + + `, + }), + args: {}, +}; - - FormControl - - - `, -}); +export const InputGroup: Story = { + render: (args) => ({ + props: args, + template: ` + + Label + + $ + USD + + `, + }), + args: {}, +}; -export const Required = RequiredTemplate.bind({}); -Required.props = {}; +export const ButtonInputGroup: Story = { + render: (args) => ({ + props: args, + template: ` + + + + + + + + `, + }), + args: {}, +}; -const HintTemplate: Story = (args: BitFormFieldComponent) => ({ - props: { - formObj: formObj, - ...args, - }, - template: ` - - FormControl - - Long hint text - - `, -}); +export const DisabledButtonInputGroup: Story = { + render: (args) => ({ + props: args, + template: ` + + Label + + + + + + + `, + }), + args: {}, +}; -export const Hint = HintTemplate.bind({}); -Required.props = {}; +export const Select: Story = { + render: (args: BitFormFieldComponent) => ({ + props: args, + template: ` + + Label + + + `, + }), + args: {}, +}; -const DisabledTemplate: Story = (args: BitFormFieldComponent) => ({ - props: args, - template: ` - - Label - - - `, -}); +export const AdvancedSelect: Story = { + render: (args: BitFormFieldComponent) => ({ + props: args, + template: ` + + Label + + + + + + `, + }), +}; -export const Disabled = DisabledTemplate.bind({}); -Disabled.args = {}; - -const GroupTemplate: Story = (args: BitFormFieldComponent) => ({ - props: args, - template: ` - - Label - - $ - USD - - `, -}); - -export const InputGroup = GroupTemplate.bind({}); -InputGroup.args = {}; - -const ButtonGroupTemplate: Story = (args: BitFormFieldComponent) => ({ - props: args, - template: ` - - - - - - - - `, -}); - -export const ButtonInputGroup = ButtonGroupTemplate.bind({}); -ButtonInputGroup.args = {}; - -const DisabledButtonInputGroupTemplate: Story = ( - args: BitFormFieldComponent -) => ({ - props: args, - template: ` - - Label - - - - - - - `, -}); - -export const DisabledButtonInputGroup = DisabledButtonInputGroupTemplate.bind({}); -DisabledButtonInputGroup.args = {}; - -const SelectTemplate: Story = (args: BitFormFieldComponent) => ({ - props: args, - template: ` - - Label - - - `, -}); - -export const Select = SelectTemplate.bind({}); -Select.args = {}; - -const AdvancedSelectTemplate: Story = (args: BitFormFieldComponent) => ({ - props: args, - template: ` - - Label - - - - - - `, -}); - -export const AdvancedSelect = AdvancedSelectTemplate.bind({}); -AdvancedSelectTemplate.args = {}; - -const TextareaTemplate: Story = (args: BitFormFieldComponent) => ({ - props: args, - template: ` - - Textarea - - - `, -}); - -export const Textarea = TextareaTemplate.bind({}); -Textarea.args = {}; +export const Textarea: Story = { + render: (args: BitFormFieldComponent) => ({ + props: args, + template: ` + + Textarea + + + `, + }), + args: {}, +}; diff --git a/libs/components/src/form-field/multi-select.stories.ts b/libs/components/src/form-field/multi-select.stories.ts index a68064e07db..123f6602aec 100644 --- a/libs/components/src/form-field/multi-select.stories.ts +++ b/libs/components/src/form-field/multi-select.stories.ts @@ -7,7 +7,7 @@ import { } from "@angular/forms"; import { NgSelectModule } from "@ng-select/ng-select"; import { action } from "@storybook/addon-actions"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -75,209 +75,228 @@ function submit(formObj: FormGroup) { formObj.markAllAsTouched(); } -const MultiSelectTemplate: Story = (args: MultiSelectComponent) => ({ - props: { - formObj: formObjFactory(), - submit: submit, - ...args, - onItemsConfirmed: actionsData.onItemsConfirmed, +type Story = StoryObj; + +export const Loading: Story = { + render: (args) => ({ + props: { + formObj: formObjFactory(), + submit: submit, + ...args, + onItemsConfirmed: actionsData.onItemsConfirmed, + }, + template: ` +
+ + {{ name }} + + + {{ hint }} + + +
+ `, + }), + args: { + baseItems: [] as any, + name: "Loading", + hint: "This is what a loading multi-select looks like", + loading: true, }, - template: ` -
- - {{ name }} - - - {{ hint }} - - -
- `, -}); - -export const Loading = MultiSelectTemplate.bind({}); -Loading.args = { - baseItems: [], - name: "Loading", - hint: "This is what a loading multi-select looks like", - loading: "true", }; -export const Disabled = MultiSelectTemplate.bind({}); -Disabled.args = { - name: "Disabled", - disabled: "true", - hint: "This is what a disabled multi-select looks like", -}; - -export const Groups = MultiSelectTemplate.bind({}); -Groups.args = { - name: "Select groups", - hint: "Groups will be assigned to the associated member", - baseItems: [ - { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, - { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, - { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, - { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, - { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, - { id: "6", listName: "Group 6", labelName: "Group 6", icon: "bwi-family" }, - { id: "7", listName: "Group 7", labelName: "Group 7", icon: "bwi-family" }, - ], -}; - -export const Members = MultiSelectTemplate.bind({}); -Members.args = { - name: "Select members", - hint: "Members will be assigned to the associated group/collection", - baseItems: [ - { id: "1", listName: "Joe Smith (jsmith@mail.me)", labelName: "Joe Smith", icon: "bwi-user" }, - { - id: "2", - listName: "Tania Stone (tstone@mail.me)", - labelName: "Tania Stone", - icon: "bwi-user", - }, - { - id: "3", - listName: "Matt Matters (mmatters@mail.me)", - labelName: "Matt Matters", - icon: "bwi-user", - }, - { - id: "4", - listName: "Bob Robertson (brobertson@mail.me)", - labelName: "Bob Robertson", - icon: "bwi-user", - }, - { - id: "5", - listName: "Ashley Fletcher (aflectcher@mail.me)", - labelName: "Ashley Fletcher", - icon: "bwi-user", - }, - { id: "6", listName: "Rita Olson (rolson@mail.me)", labelName: "Rita Olson", icon: "bwi-user" }, - { - id: "7", - listName: "Final listName (fname@mail.me)", - labelName: "(fname@mail.me)", - icon: "bwi-user", - }, - ], -}; - -export const Collections = MultiSelectTemplate.bind({}); -Collections.args = { - name: "Select collections", - hint: "Collections will be assigned to the associated member", - baseItems: [ - { id: "1", listName: "Collection 1", labelName: "Collection 1", icon: "bwi-collection" }, - { id: "2", listName: "Collection 2", labelName: "Collection 2", icon: "bwi-collection" }, - { id: "3", listName: "Collection 3", labelName: "Collection 3", icon: "bwi-collection" }, - { - id: "3.5", - listName: "Child Collection 1 for Parent 1", - labelName: "Child Collection 1 for Parent 1", - icon: "bwi-collection", - parentGrouping: "Parent 1", - }, - { - id: "3.55", - listName: "Child Collection 2 for Parent 1", - labelName: "Child Collection 2 for Parent 1", - icon: "bwi-collection", - parentGrouping: "Parent 1", - }, - { - id: "3.59", - listName: "Child Collection 3 for Parent 1", - labelName: "Child Collection 3 for Parent 1", - icon: "bwi-collection", - parentGrouping: "Parent 1", - }, - { - id: "3.75", - listName: "Child Collection 1 for Parent 2", - labelName: "Child Collection 1 for Parent 2", - icon: "bwi-collection", - parentGrouping: "Parent 2", - }, - { id: "4", listName: "Collection 4", labelName: "Collection 4", icon: "bwi-collection" }, - { id: "5", listName: "Collection 5", labelName: "Collection 5", icon: "bwi-collection" }, - { id: "6", listName: "Collection 6", labelName: "Collection 6", icon: "bwi-collection" }, - { id: "7", listName: "Collection 7", labelName: "Collection 7", icon: "bwi-collection" }, - ], -}; - -export const MembersAndGroups = MultiSelectTemplate.bind({}); -MembersAndGroups.args = { - name: "Select groups and members", - hint: "Members/Groups will be assigned to the associated collection", - baseItems: [ - { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, - { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, - { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, - { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, - { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, - { id: "6", listName: "Joe Smith (jsmith@mail.me)", labelName: "Joe Smith", icon: "bwi-user" }, - { - id: "7", - listName: "Tania Stone (tstone@mail.me)", - labelName: "(tstone@mail.me)", - icon: "bwi-user", - }, - ], -}; - -export const RemoveSelected = MultiSelectTemplate.bind({}); -RemoveSelected.args = { - name: "Select groups", - hint: "Groups will be removed from the list once the dropdown is closed", - baseItems: [ - { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, - { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, - { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, - { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, - { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, - { id: "6", listName: "Group 6", labelName: "Group 6", icon: "bwi-family" }, - { id: "7", listName: "Group 7", labelName: "Group 7", icon: "bwi-family" }, - ], - removeSelectedItems: "true", -}; - -const StandaloneTemplate: Story = (args: MultiSelectComponent) => ({ - props: { - ...args, - onItemsConfirmed: actionsData.onItemsConfirmed, +export const Disabled: Story = { + ...Loading, + args: { + name: "Disabled", + disabled: true, + hint: "This is what a disabled multi-select looks like", + }, +}; + +export const Groups: Story = { + ...Loading, + args: { + name: "Select groups", + hint: "Groups will be assigned to the associated member", + baseItems: [ + { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, + { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, + { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, + { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, + { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, + { id: "6", listName: "Group 6", labelName: "Group 6", icon: "bwi-family" }, + { id: "7", listName: "Group 7", labelName: "Group 7", icon: "bwi-family" }, + ], + }, +}; + +export const Members: Story = { + ...Loading, + args: { + name: "Select members", + hint: "Members will be assigned to the associated group/collection", + baseItems: [ + { id: "1", listName: "Joe Smith (jsmith@mail.me)", labelName: "Joe Smith", icon: "bwi-user" }, + { + id: "2", + listName: "Tania Stone (tstone@mail.me)", + labelName: "Tania Stone", + icon: "bwi-user", + }, + { + id: "3", + listName: "Matt Matters (mmatters@mail.me)", + labelName: "Matt Matters", + icon: "bwi-user", + }, + { + id: "4", + listName: "Bob Robertson (brobertson@mail.me)", + labelName: "Bob Robertson", + icon: "bwi-user", + }, + { + id: "5", + listName: "Ashley Fletcher (aflectcher@mail.me)", + labelName: "Ashley Fletcher", + icon: "bwi-user", + }, + { + id: "6", + listName: "Rita Olson (rolson@mail.me)", + labelName: "Rita Olson", + icon: "bwi-user", + }, + { + id: "7", + listName: "Final listName (fname@mail.me)", + labelName: "(fname@mail.me)", + icon: "bwi-user", + }, + ], + }, +}; + +export const Collections: Story = { + ...Loading, + args: { + name: "Select collections", + hint: "Collections will be assigned to the associated member", + baseItems: [ + { id: "1", listName: "Collection 1", labelName: "Collection 1", icon: "bwi-collection" }, + { id: "2", listName: "Collection 2", labelName: "Collection 2", icon: "bwi-collection" }, + { id: "3", listName: "Collection 3", labelName: "Collection 3", icon: "bwi-collection" }, + { + id: "3.5", + listName: "Child Collection 1 for Parent 1", + labelName: "Child Collection 1 for Parent 1", + icon: "bwi-collection", + parentGrouping: "Parent 1", + }, + { + id: "3.55", + listName: "Child Collection 2 for Parent 1", + labelName: "Child Collection 2 for Parent 1", + icon: "bwi-collection", + parentGrouping: "Parent 1", + }, + { + id: "3.59", + listName: "Child Collection 3 for Parent 1", + labelName: "Child Collection 3 for Parent 1", + icon: "bwi-collection", + parentGrouping: "Parent 1", + }, + { + id: "3.75", + listName: "Child Collection 1 for Parent 2", + labelName: "Child Collection 1 for Parent 2", + icon: "bwi-collection", + parentGrouping: "Parent 2", + }, + { id: "4", listName: "Collection 4", labelName: "Collection 4", icon: "bwi-collection" }, + { id: "5", listName: "Collection 5", labelName: "Collection 5", icon: "bwi-collection" }, + { id: "6", listName: "Collection 6", labelName: "Collection 6", icon: "bwi-collection" }, + { id: "7", listName: "Collection 7", labelName: "Collection 7", icon: "bwi-collection" }, + ], + }, +}; + +export const MembersAndGroups: Story = { + ...Loading, + args: { + name: "Select groups and members", + hint: "Members/Groups will be assigned to the associated collection", + baseItems: [ + { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, + { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, + { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, + { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, + { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, + { id: "6", listName: "Joe Smith (jsmith@mail.me)", labelName: "Joe Smith", icon: "bwi-user" }, + { + id: "7", + listName: "Tania Stone (tstone@mail.me)", + labelName: "(tstone@mail.me)", + icon: "bwi-user", + }, + ], + }, +}; + +export const RemoveSelected: Story = { + ...Loading, + args: { + name: "Select groups", + hint: "Groups will be removed from the list once the dropdown is closed", + baseItems: [ + { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, + { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, + { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, + { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, + { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, + { id: "6", listName: "Group 6", labelName: "Group 6", icon: "bwi-family" }, + { id: "7", listName: "Group 7", labelName: "Group 7", icon: "bwi-family" }, + ], + removeSelectedItems: true, + }, +}; + +export const Standalone: Story = { + render: (args) => ({ + props: { + ...args, + onItemsConfirmed: actionsData.onItemsConfirmed, + }, + template: ` + + + `, + }), + args: { + baseItems: [ + { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, + { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, + { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, + { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, + { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, + { id: "6", listName: "Group 6", labelName: "Group 6", icon: "bwi-family" }, + { id: "7", listName: "Group 7", labelName: "Group 7", icon: "bwi-family" }, + ], + removeSelectedItems: true, }, - template: ` - - - `, -}); - -export const Standalone = StandaloneTemplate.bind({}); -Standalone.args = { - baseItems: [ - { id: "1", listName: "Group 1", labelName: "Group 1", icon: "bwi-family" }, - { id: "2", listName: "Group 2", labelName: "Group 2", icon: "bwi-family" }, - { id: "3", listName: "Group 3", labelName: "Group 3", icon: "bwi-family" }, - { id: "4", listName: "Group 4", labelName: "Group 4", icon: "bwi-family" }, - { id: "5", listName: "Group 5", labelName: "Group 5", icon: "bwi-family" }, - { id: "6", listName: "Group 6", labelName: "Group 6", icon: "bwi-family" }, - { id: "7", listName: "Group 7", labelName: "Group 7", icon: "bwi-family" }, - ], - removeSelectedItems: "true", }; diff --git a/libs/components/src/form-field/password-input-toggle.stories.ts b/libs/components/src/form-field/password-input-toggle.stories.ts index f39974615bb..a1e916b5e10 100644 --- a/libs/components/src/form-field/password-input-toggle.stories.ts +++ b/libs/components/src/form-field/password-input-toggle.stories.ts @@ -1,5 +1,5 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -38,49 +38,42 @@ export default { }, } as Meta; -const Template: Story = ( - args: BitPasswordInputToggleDirective -) => ({ - props: { - ...args, - }, - template: ` -
- - Password - - - -
- `, -}); +type Story = StoryObj; -export const Default = Template.bind({}); -Default.props = {}; - -const TemplateBinding: Story = ( - args: BitPasswordInputToggleDirective -) => ({ - props: { - ...args, - }, - template: ` -
- - Password - - - - - -
- `, -}); - -export const Binding = TemplateBinding.bind({}); -Binding.props = { - toggled: false, +export const Default: Story = { + render: (args) => ({ + props: args, + template: ` +
+ + Password + + + +
+ `, + }), +}; + +export const Binding: Story = { + render: (args) => ({ + props: args, + template: ` +
+ + Password + + + + + +
+ `, + }), + args: { + toggled: false, + }, }; diff --git a/libs/components/src/form/form.stories.ts b/libs/components/src/form/form.stories.ts index 45409850b38..4c0b05a083a 100644 --- a/libs/components/src/form/form.stories.ts +++ b/libs/components/src/form/form.stories.ts @@ -7,7 +7,7 @@ import { ValidatorFn, Validators, } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -81,67 +81,70 @@ function forbiddenNameValidator(nameRe: RegExp): ValidatorFn { }; } -const FullExampleTemplate: Story = (args) => ({ - props: { - formObj: exampleFormObj, - submit: () => exampleFormObj.markAllAsTouched(), - ...args, +type Story = StoryObj; + +export const FullExample: Story = { + render: (args) => ({ + props: { + formObj: exampleFormObj, + submit: () => exampleFormObj.markAllAsTouched(), + ...args, + }, + template: ` +
+ + Name + + + + + Email + + + + + Country + + + + + + + Age + + + + + Agree to terms + + Required for the service to work properly + + + + Subscribe to updates? + + Yes + + + No + + + Decide later + + + + +
+ `, + }), + + args: { + countries, }, - template: ` -
- - Name - - - - - Email - - - - - Country - - - - - - - Age - - - - - Agree to terms - - Required for the service to work properly - - - - Subscribe to updates? - - Yes - - - No - - - Decide later - - - - -
- `, -}); - -export const FullExample = FullExampleTemplate.bind({}); -FullExample.args = { - countries, }; diff --git a/libs/components/src/icon-button/icon-button.stories.ts b/libs/components/src/icon-button/icon-button.stories.ts index 944b50da722..4a0c56fbdef 100644 --- a/libs/components/src/icon-button/icon-button.stories.ts +++ b/libs/components/src/icon-button/icon-button.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/angular"; +import { Meta, StoryObj } from "@storybook/angular"; import { BitIconButtonComponent, IconButtonType } from "./icon-button.component"; @@ -31,68 +31,72 @@ export default { }, } as Meta; -const Template: Story = (args: BitIconButtonComponent) => ({ - props: { ...args, buttonTypes }, - template: ` - - - - - - - +type Story = StoryObj; - - - - - - - - - - - - - - - - -
{{buttonType}}
Default - -
Disabled - -
Loading - -
- `, -}); - -export const Default = Template.bind({}); -Default.args = { - size: "default", +export const Default: Story = { + render: (args: BitIconButtonComponent) => ({ + props: { ...args, buttonTypes }, + template: ` + + + + + + + + + + + + + + + + + + + + + + + + +
{{buttonType}}
Default + +
Disabled + +
Loading + +
+ `, + }), + args: { + size: "default", + }, }; -export const Small = Template.bind({}); -Small.args = { - size: "small", +export const Small: Story = { + ...Default, + args: { + size: "small", + }, }; diff --git a/libs/components/src/icon/icon.stories.ts b/libs/components/src/icon/icon.stories.ts index a67516f2e84..95bf457517d 100644 --- a/libs/components/src/icon/icon.stories.ts +++ b/libs/components/src/icon/icon.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/angular"; +import { Meta, StoryObj } from "@storybook/angular"; import { BitIconComponent } from "./icon.component"; @@ -10,18 +10,22 @@ export default { }, } as Meta; -const Template: Story = (args: BitIconComponent) => ({ - props: args, - template: ` -
- -
- `, -}); +type Story = StoryObj; -export const ReportExposedPasswords = Template.bind({}); - -export const UnknownIcon = Template.bind({}); -UnknownIcon.args = { - icon: "unknown", +export const ReportExposedPasswords: Story = { + render: (args) => ({ + props: args, + template: ` +
+ +
+ `, + }), +}; + +export const UnknownIcon: Story = { + ...ReportExposedPasswords, + args: { + icon: "unknown" as any, + }, }; diff --git a/libs/components/src/index.ts b/libs/components/src/index.ts index 7abe0864aaf..dbc4f0b4948 100644 --- a/libs/components/src/index.ts +++ b/libs/components/src/index.ts @@ -12,6 +12,7 @@ export * from "./dialog"; export * from "./form-field"; export * from "./icon-button"; export * from "./icon"; +export * from "./input"; export * from "./link"; export * from "./menu"; export * from "./multi-select"; diff --git a/libs/components/src/input/index.ts b/libs/components/src/input/index.ts new file mode 100644 index 00000000000..4036b8ab946 --- /dev/null +++ b/libs/components/src/input/index.ts @@ -0,0 +1 @@ +export * from "./input.module"; diff --git a/libs/components/src/link/link.stories.ts b/libs/components/src/link/link.stories.ts index 7ffc6fd2e29..76bb4d47526 100644 --- a/libs/components/src/link/link.stories.ts +++ b/libs/components/src/link/link.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { AnchorLinkDirective, ButtonLinkDirective } from "./link.directive"; import { LinkModule } from "./link.module"; @@ -24,97 +24,99 @@ export default { }, } as Meta; -const ButtonTemplate: Story = (args: ButtonLinkDirective) => ({ - props: args, - template: ` -
-
- -
-
- -
-
- -
-
- -
-
- `, -}); +type Story = StoryObj; -const AnchorTemplate: Story = (args: AnchorLinkDirective) => ({ - props: args, - template: ` -
-
- Anchor +export const Buttons: Story = { + render: (args) => ({ + props: args, + template: ` +
+
+ +
+
+ +
+
+ +
+
+ +
- - - -
- `, -}); - -export const Buttons = ButtonTemplate.bind({}); -Buttons.args = { - linkType: "primary", -}; - -export const Anchors = AnchorTemplate.bind({}); -Anchors.args = { - linkType: "primary", -}; - -const InlineTemplate: Story = (args) => ({ - props: args, - template: ` - - On the internet paragraphs often contain inline links, but few know that can be used for similar purposes. - - `, -}); - -export const Inline = InlineTemplate.bind({}); -Inline.args = { - linkType: "primary", -}; - -const DisabledTemplate: Story = (args) => ({ - props: args, - template: ` - - -
- -
- `, -}); - -export const Disabled = DisabledTemplate.bind({}); -Disabled.parameters = { - controls: { - exclude: ["linkType"], - hideNoControlsWarning: true, + `, + }), + args: { + linkType: "primary", + }, +}; + +export const Anchors: StoryObj = { + render: (args) => ({ + props: args, + template: ` + + `, + }), + args: { + linkType: "primary", + }, +}; + +export const Inline: Story = { + render: (args) => ({ + props: args, + template: ` + + On the internet paragraphs often contain inline links, but few know that can be used for similar purposes. + + `, + }), + args: { + linkType: "primary", + }, +}; + +export const Disabled: Story = { + render: (args) => ({ + props: args, + template: ` + + +
+ +
+ `, + }), + parameters: { + controls: { + exclude: ["linkType"], + hideNoControlsWarning: true, + }, }, }; diff --git a/libs/components/src/menu/menu.stories.ts b/libs/components/src/menu/menu.stories.ts index 786e7ca688d..d0f78ed66da 100644 --- a/libs/components/src/menu/menu.stories.ts +++ b/libs/components/src/menu/menu.stories.ts @@ -1,5 +1,5 @@ import { OverlayModule } from "@angular/cdk/overlay"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { ButtonModule } from "../button/button.module"; @@ -30,40 +30,42 @@ export default { }, } as Meta; -const Template: Story = (args: MenuTriggerForDirective) => ({ - props: args, - template: ` - - Anchor link - Another link - - - - +type Story = StoryObj; -
-
- +export const OpenMenu: Story = { + render: (args) => ({ + props: args, + template: ` + + Anchor link + Another link + + + + + +
+
+ +
-
- `, -}); - -const TemplateWithButton: Story = (args: MenuTriggerForDirective) => ({ - props: args, - template: ` -
- -
- - - Anchor link - Another link - - - - `, -}); - -export const OpenMenu = Template.bind({}); -export const ClosedMenu = TemplateWithButton.bind({}); + `, + }), +}; +export const ClosedMenu: Story = { + render: (args) => ({ + props: args, + template: ` +
+ +
+ + + Anchor link + Another link + + + + `, + }), +}; diff --git a/libs/components/src/navigation/nav-group.stories.ts b/libs/components/src/navigation/nav-group.stories.ts index 1c22e2bfc75..5b6e5b807c1 100644 --- a/libs/components/src/navigation/nav-group.stories.ts +++ b/libs/components/src/navigation/nav-group.stories.ts @@ -1,5 +1,5 @@ import { RouterTestingModule } from "@angular/router/testing"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { StoryObj, Meta, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -36,9 +36,10 @@ export default { }, } as Meta; -export const Default: Story = (args) => ({ - props: args, - template: ` +export const Default: StoryObj = { + render: (args) => ({ + props: args, + template: ` @@ -50,25 +51,28 @@ export const Default: Story = (args) => ({ `, -}); + }), +}; -export const Tree: Story = (args) => ({ - props: args, - template: ` - - - - - - - - +export const Tree: StoryObj = { + render: (args) => ({ + props: args, + template: ` + + + + + + + + + + + - - + - - - `, -}); + `, + }), +}; diff --git a/libs/components/src/navigation/nav-item.stories.ts b/libs/components/src/navigation/nav-item.stories.ts index e1a71289226..47960f874fb 100644 --- a/libs/components/src/navigation/nav-item.stories.ts +++ b/libs/components/src/navigation/nav-item.stories.ts @@ -1,5 +1,5 @@ import { RouterTestingModule } from "@angular/router/testing"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { StoryObj, Meta, moduleMetadata } from "@storybook/angular"; import { IconButtonModule } from "../icon-button"; @@ -23,35 +23,42 @@ export default { }, } as Meta; -const Template: Story = (args: NavItemComponent) => ({ - props: args, - template: ` - - `, -}); +type Story = StoryObj; -export const Default = Template.bind({}); -Default.args = { - text: "Hello World", - icon: "bwi-filter", +export const Default: Story = { + render: (args) => ({ + props: args, + template: ` + + `, + }), + args: { + text: "Hello World", + icon: "bwi-filter", + }, }; -export const WithoutIcon = Template.bind({}); -WithoutIcon.args = { - text: "Hello World", - icon: "", +export const WithoutIcon: Story = { + ...Default, + args: { + text: "Hello World", + icon: "", + }, }; -export const WithoutRoute: Story = (args: NavItemComponent) => ({ - props: args, - template: ` - - `, -}); +export const WithoutRoute: Story = { + render: (args: NavItemComponent) => ({ + props: args, + template: ` + + `, + }), +}; -export const WithChildButtons: Story = (args: NavItemComponent) => ({ - props: args, - template: ` +export const WithChildButtons: Story = { + render: (args: NavItemComponent) => ({ + props: args, + template: ` `, -}); + }), +}; -export const MultipleItemsWithDivider: Story = (args: NavItemComponent) => ({ - props: args, - template: ` - - - - - - `, -}); +export const MultipleItemsWithDivider: Story = { + render: (args: NavItemComponent) => ({ + props: args, + template: ` + + + + + + `, + }), +}; diff --git a/libs/components/src/no-items/no-items.stories.ts b/libs/components/src/no-items/no-items.stories.ts index 0b08aafbc11..d8e5b59bdbf 100644 --- a/libs/components/src/no-items/no-items.stories.ts +++ b/libs/components/src/no-items/no-items.stories.ts @@ -1,11 +1,13 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { ButtonModule } from "../button"; +import { NoItemsComponent } from "./no-items.component"; import { NoItemsModule } from "./no-items.module"; export default { title: "Component Library/No Items", + component: NoItemsComponent, decorators: [ moduleMetadata({ imports: [ButtonModule, NoItemsModule], @@ -13,23 +15,25 @@ export default { ], } as Meta; -const Template: Story = (args) => ({ - props: args, - template: ` - - No items found - Your description here. - - - `, -}); +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = { + render: (args) => ({ + props: args, + template: ` + + No items found + Your description here. + + + `, + }), +}; diff --git a/libs/components/src/progress/progress.stories.ts b/libs/components/src/progress/progress.stories.ts index 079f936e3af..49a5398d2d9 100644 --- a/libs/components/src/progress/progress.stories.ts +++ b/libs/components/src/progress/progress.stories.ts @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/angular"; +import { Meta, StoryObj } from "@storybook/angular"; import { ProgressComponent } from "./progress.component"; @@ -18,22 +18,23 @@ export default { }, } as Meta; -const Template: Story = (args: ProgressComponent) => ({ - props: args, -}); +type Story = StoryObj; -export const Empty = Template.bind({}); -Empty.args = { - barWidth: 0, +export const Empty: Story = { + args: { + barWidth: 0, + }, }; -export const Full = Template.bind({}); -Full.args = { - barWidth: 100, +export const Full: Story = { + args: { + barWidth: 100, + }, }; -export const CustomText = Template.bind({}); -CustomText.args = { - barWidth: 25, - text: "Loading...", +export const CustomText: Story = { + args: { + barWidth: 25, + text: "Loading...", + }, }; diff --git a/libs/components/src/radio-button/radio-button.stories.ts b/libs/components/src/radio-button/radio-button.stories.ts index 340e76c4219..d3c5716698f 100644 --- a/libs/components/src/radio-button/radio-button.stories.ts +++ b/libs/components/src/radio-button/radio-button.stories.ts @@ -1,5 +1,5 @@ import { FormsModule, ReactiveFormsModule, FormControl, FormGroup } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -34,65 +34,67 @@ export default { url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?node-id=3930%3A16850&t=xXPx6GJYsJfuMQPE-4", }, }, -} as Meta; +} as Meta; -const InlineTemplate: Story = (args: RadioGroupComponent) => ({ - props: { - formObj: new FormGroup({ - radio: new FormControl(0), - }), - }, - template: ` -
- - Group of radio buttons +type Story = StoryObj; - - First - +export const Inline: Story = { + render: () => ({ + props: { + formObj: new FormGroup({ + radio: new FormControl(0), + }), + }, + template: ` + + + Group of radio buttons + + + First + + + + Second + + + + Third + + + + `, + }), +}; - - Second - - - - Third - -
- - `, -}); - -export const Inline = InlineTemplate.bind({}); - -const BlockTemplate: Story = (args: RadioGroupComponent) => ({ - props: { - formObj: new FormGroup({ - radio: new FormControl(0), - }), - }, - template: ` -
- - Group of radio buttons - - - First - This is a hint for the first option - - - - Second - This is a hint for the second option - - - - Third - This is a hint for the third option - - -
- `, -}); - -export const Block = BlockTemplate.bind({}); +export const Block: Story = { + render: () => ({ + props: { + formObj: new FormGroup({ + radio: new FormControl(0), + }), + }, + template: ` +
+ + Group of radio buttons + + + First + This is a hint for the first option + + + + Second + This is a hint for the second option + + + + Third + This is a hint for the third option + + +
+ `, + }), +}; diff --git a/libs/components/src/search/search.stories.ts b/libs/components/src/search/search.stories.ts index 0968e9b6ed1..3167c5c7d47 100644 --- a/libs/components/src/search/search.stories.ts +++ b/libs/components/src/search/search.stories.ts @@ -1,5 +1,5 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -29,12 +29,14 @@ export default { ], } as Meta; -const Template: Story = (args: SearchComponent) => ({ - props: args, - template: ` - - `, -}); +type Story = StoryObj; -export const Default = Template.bind({}); -Default.args = {}; +export const Default: Story = { + render: (args: SearchComponent) => ({ + props: args, + template: ` + + `, + }), + args: {}, +}; diff --git a/libs/components/src/select/select.stories.ts b/libs/components/src/select/select.stories.ts index 9b38b05d6c3..540279dab0c 100644 --- a/libs/components/src/select/select.stories.ts +++ b/libs/components/src/select/select.stories.ts @@ -1,4 +1,4 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -37,22 +37,26 @@ export default { }, } as Meta; -const DefaultTemplate: Story = (args: MultiSelectComponent) => ({ - props: { - ...args, - }, - template: ` - - - - - `, -}); +type Story = StoryObj; -export const Default = DefaultTemplate.bind({}); -Default.args = {}; - -export const Disabled = DefaultTemplate.bind({}); -Disabled.args = { - disabled: true, +export const Default: Story = { + render: (args) => ({ + props: { + ...args, + }, + template: ` + + + + + `, + }), + args: {}, +}; + +export const Disabled: Story = { + ...Default, + args: { + disabled: true, + }, }; diff --git a/libs/components/src/stories/colors.stories.mdx b/libs/components/src/stories/colors.mdx similarity index 98% rename from libs/components/src/stories/colors.stories.mdx rename to libs/components/src/stories/colors.mdx index 57a15314e09..d77c726b26c 100644 --- a/libs/components/src/stories/colors.stories.mdx +++ b/libs/components/src/stories/colors.mdx @@ -67,7 +67,8 @@ export const Table = (args) => ( ); - + `} + # Colors diff --git a/libs/components/src/stories/forms-docs.stories.mdx b/libs/components/src/stories/forms.mdx similarity index 97% rename from libs/components/src/stories/forms-docs.stories.mdx rename to libs/components/src/stories/forms.mdx index 0d8c94857c0..f677684a9d2 100644 --- a/libs/components/src/stories/forms-docs.stories.mdx +++ b/libs/components/src/stories/forms.mdx @@ -1,6 +1,6 @@ import { Meta, Story, Source } from "@storybook/addon-docs"; - + # Forms diff --git a/libs/components/src/stories/icons.stories.mdx b/libs/components/src/stories/icons.mdx similarity index 99% rename from libs/components/src/stories/icons.stories.mdx rename to libs/components/src/stories/icons.mdx index 1a74a8f4ecb..b3a4cbbf99b 100644 --- a/libs/components/src/stories/icons.stories.mdx +++ b/libs/components/src/stories/icons.mdx @@ -1,6 +1,6 @@ - +{/* Iconography.stories.mdx */} -import { Meta } from "@storybook/addon-docs/"; +import { Meta } from "@storybook/addon-docs"; diff --git a/libs/components/src/stories/input-docs.stories.mdx b/libs/components/src/stories/input.mdx similarity index 95% rename from libs/components/src/stories/input-docs.stories.mdx rename to libs/components/src/stories/input.mdx index 7f9b824354a..0fd1a4890b7 100644 --- a/libs/components/src/stories/input-docs.stories.mdx +++ b/libs/components/src/stories/input.mdx @@ -1,8 +1,8 @@ import { Meta } from "@storybook/addon-docs"; - + -# `bitInput` +# Input `bitInput` is an Angular directive to be used on ``, ` -
+ diff --git a/apps/web/src/app/tools/import-export/import.component.ts b/apps/web/src/app/tools/import-export/import.component.ts index 14023c377de..cba1afdba68 100644 --- a/apps/web/src/app/tools/import-export/import.component.ts +++ b/apps/web/src/app/tools/import-export/import.component.ts @@ -1,18 +1,29 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; +import { FormBuilder, Validators } from "@angular/forms"; import { Router } from "@angular/router"; import * as JSZip from "jszip"; -import { Subject, lastValueFrom } from "rxjs"; -import { takeUntil } from "rxjs/operators"; +import { concat, Observable, Subject, lastValueFrom, combineLatest } from "rxjs"; +import { map, takeUntil } from "rxjs/operators"; import Swal, { SweetAlertIcon } from "sweetalert2"; import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { ModalService } from "@bitwarden/angular/services/modal.service"; +import { + canAccessImportExport, + OrganizationService, +} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; +import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { ImportOption, ImportResult, @@ -30,15 +41,31 @@ export class ImportComponent implements OnInit, OnDestroy { featuredImportOptions: ImportOption[]; importOptions: ImportOption[]; format: ImportType = null; - fileContents: string; fileSelected: File; - loading = false; + + folders$: Observable; + collections$: Observable; + organizations$: Observable; protected organizationId: string = null; protected destroy$ = new Subject(); private _importBlockedByPolicy = false; + formGroup = this.formBuilder.group({ + vaultSelector: [ + "myVault", + { + nonNullable: true, + validators: [Validators.required], + }, + ], + targetSelector: [null], + format: [null as ImportType | null, [Validators.required]], + fileContents: [], + file: [], + }); + constructor( protected i18nService: I18nService, protected importService: ImportServiceAbstraction, @@ -48,7 +75,11 @@ export class ImportComponent implements OnInit, OnDestroy { private logService: LogService, protected modalService: ModalService, protected syncService: SyncService, - protected dialogService: DialogServiceAbstraction + protected dialogService: DialogServiceAbstraction, + protected folderService: FolderService, + protected collectionService: CollectionService, + protected organizationService: OrganizationService, + protected formBuilder: FormBuilder ) {} protected get importBlockedByPolicy(): boolean { @@ -65,15 +96,76 @@ export class ImportComponent implements OnInit, OnDestroy { ngOnInit() { this.setImportOptions(); - this.policyService - .policyAppliesToActiveUser$(PolicyType.PersonalOwnership) + this.organizations$ = concat( + this.organizationService.memberOrganizations$.pipe( + canAccessImportExport(this.i18nService), + map((orgs) => orgs.sort(Utils.getSortFunction(this.i18nService, "name"))) + ) + ); + + combineLatest([ + this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership), + this.organizations$, + ]) .pipe(takeUntil(this.destroy$)) - .subscribe((policyAppliesToActiveUser) => { - this._importBlockedByPolicy = policyAppliesToActiveUser; + .subscribe(([policyApplies, orgs]) => { + this._importBlockedByPolicy = policyApplies; + if (policyApplies && orgs.length == 0) { + this.formGroup.disable(); + } + }); + + if (this.organizationId) { + this.formGroup.controls.vaultSelector.patchValue(this.organizationId); + this.formGroup.controls.vaultSelector.disable(); + + this.collections$ = Utils.asyncToObservable(() => + this.collectionService + .getAllDecrypted() + .then((c) => c.filter((c2) => c2.organizationId === this.organizationId)) + ); + } else { + // Filter out the `no folder`-item from folderViews$ + this.folders$ = this.folderService.folderViews$.pipe( + map((folders) => folders.filter((f) => f.id != null)) + ); + this.formGroup.controls.targetSelector.disable(); + + this.formGroup.controls.vaultSelector.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + this.organizationId = value != "myVault" ? value : undefined; + if (!this._importBlockedByPolicy) { + this.formGroup.controls.targetSelector.enable(); + } + if (value) { + this.collections$ = Utils.asyncToObservable(() => + this.collectionService + .getAllDecrypted() + .then((c) => c.filter((c2) => c2.organizationId === value)) + ); + } + }); + + this.formGroup.controls.vaultSelector.setValue("myVault"); + } + this.formGroup.controls.format.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe((value) => { + this.format = value; }); } - async submit() { + submit = async () => { + if (this.formGroup.invalid) { + this.formGroup.markAllAsTouched(); + return; + } + + await this.performImport(); + }; + + protected async performImport() { if (this.importBlockedByPolicy) { this.platformUtilsService.showToast( "error", @@ -83,8 +175,6 @@ export class ImportComponent implements OnInit, OnDestroy { return; } - this.loading = true; - const promptForPassword_callback = async () => { return await this.getFilePassword(); }; @@ -94,32 +184,28 @@ export class ImportComponent implements OnInit, OnDestroy { promptForPassword_callback, this.organizationId ); + if (importer === null) { this.platformUtilsService.showToast( "error", this.i18nService.t("errorOccurred"), this.i18nService.t("selectFormat") ); - this.loading = false; return; } const fileEl = document.getElementById("file") as HTMLInputElement; const files = fileEl.files; - if ( - (files == null || files.length === 0) && - (this.fileContents == null || this.fileContents === "") - ) { + let fileContents = this.formGroup.controls.fileContents.value; + if ((files == null || files.length === 0) && (fileContents == null || fileContents === "")) { this.platformUtilsService.showToast( "error", this.i18nService.t("errorOccurred"), this.i18nService.t("selectFile") ); - this.loading = false; return; } - let fileContents = this.fileContents; if (files != null && files.length > 0) { try { const content = await this.getFileContents(files[0]); @@ -137,12 +223,21 @@ export class ImportComponent implements OnInit, OnDestroy { this.i18nService.t("errorOccurred"), this.i18nService.t("selectFile") ); - this.loading = false; return; } + if (this.organizationId) { + await this.organizationService.get(this.organizationId)?.isAdmin; + } + try { - const result = await this.importService.import(importer, fileContents, this.organizationId); + const result = await this.importService.import( + importer, + fileContents, + this.organizationId, + this.formGroup.controls.targetSelector.value, + this.isUserAdmin(this.organizationId) + ); //No errors, display success message this.dialogService.open(ImportSuccessDialogComponent, { @@ -155,8 +250,13 @@ export class ImportComponent implements OnInit, OnDestroy { this.error(e); this.logService.error(e); } + } - this.loading = false; + private isUserAdmin(organizationId?: string): boolean { + if (!organizationId) { + return false; + } + return this.organizationService.get(this.organizationId)?.isAdmin; } getFormatInstructionTitle() { diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 90a5930881e..570c4b61588 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -1293,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, diff --git a/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts b/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts index 595b5caf8d1..71e08279476 100644 --- a/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts +++ b/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts @@ -57,6 +57,12 @@ export function canAccessAdmin(i18nService: I18nService) { ); } +export function canAccessImportExport(i18nService: I18nService) { + return map((orgs) => + orgs.filter((org) => org.canAccessImportExport).sort(Utils.getSortFunction(i18nService, "name")) + ); +} + /** * Returns `true` if a user is a member of an organization (rather than only being a ProviderUser) * @deprecated Use organizationService.memberOrganizations$ instead diff --git a/libs/importer/src/services/import.service.abstraction.ts b/libs/importer/src/services/import.service.abstraction.ts index b2f9a10cf37..1ef5df456fe 100644 --- a/libs/importer/src/services/import.service.abstraction.ts +++ b/libs/importer/src/services/import.service.abstraction.ts @@ -9,7 +9,9 @@ export abstract class ImportServiceAbstraction { import: ( importer: Importer, fileContents: string, - organizationId?: string + organizationId?: string, + selectedImportTarget?: string, + isUserAdmin?: boolean ) => Promise; getImporter: ( format: ImportType | "bitwardenpasswordprotected", diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index e748c118443..ef21f2aa0f0 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -6,9 +6,12 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; +import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { BitwardenPasswordProtectedImporter } from "../importers/bitwarden/bitwarden-password-protected-importer"; import { Importer } from "../importers/importer"; +import { ImportResult } from "../models/import-result"; import { ImportApiServiceAbstraction } from "./import-api.service.abstraction"; import { ImportService } from "./import.service"; @@ -72,4 +75,105 @@ describe("ImportService", () => { }); }); }); + + describe("setImportTarget", () => { + const organizationId = Utils.newGuid(); + + let importResult: ImportResult; + + beforeEach(() => { + importResult = new ImportResult(); + }); + + it("empty importTarget does nothing", async () => { + await importService["setImportTarget"](importResult, null, ""); + expect(importResult.folders.length).toBe(0); + }); + + const mockImportTargetFolder = new FolderView(); + mockImportTargetFolder.id = "myImportTarget"; + mockImportTargetFolder.name = "myImportTarget"; + + it("passing importTarget adds it to folders", async () => { + folderService.getAllDecryptedFromState.mockReturnValue( + Promise.resolve([mockImportTargetFolder]) + ); + + await importService["setImportTarget"](importResult, null, "myImportTarget"); + expect(importResult.folders.length).toBe(1); + expect(importResult.folders[0].name).toBe("myImportTarget"); + }); + + const mockFolder1 = new FolderView(); + mockFolder1.id = "folder1"; + mockFolder1.name = "folder1"; + + const mockFolder2 = new FolderView(); + mockFolder2.id = "folder2"; + mockFolder2.name = "folder2"; + + it("passing importTarget sets it as new root for all existing folders", async () => { + folderService.getAllDecryptedFromState.mockResolvedValue([ + mockImportTargetFolder, + mockFolder1, + mockFolder2, + ]); + + const myImportTarget = "myImportTarget"; + + importResult.folders.push(mockFolder1); + importResult.folders.push(mockFolder2); + + await importService["setImportTarget"](importResult, null, myImportTarget); + expect(importResult.folders.length).toBe(3); + expect(importResult.folders[0].name).toBe(myImportTarget); + expect(importResult.folders[1].name).toBe(`${myImportTarget}/${mockFolder1.name}`); + expect(importResult.folders[2].name).toBe(`${myImportTarget}/${mockFolder2.name}`); + }); + + const mockImportTargetCollection = new CollectionView(); + mockImportTargetCollection.id = "myImportTarget"; + mockImportTargetCollection.name = "myImportTarget"; + mockImportTargetCollection.organizationId = organizationId; + + const mockCollection1 = new CollectionView(); + mockCollection1.id = "collection1"; + mockCollection1.name = "collection1"; + mockCollection1.organizationId = organizationId; + + const mockCollection2 = new CollectionView(); + mockCollection1.id = "collection2"; + mockCollection1.name = "collection2"; + mockCollection1.organizationId = organizationId; + + it("passing importTarget adds it to collections", async () => { + collectionService.getAllDecrypted.mockResolvedValue([ + mockImportTargetCollection, + mockCollection1, + ]); + + await importService["setImportTarget"](importResult, organizationId, "myImportTarget"); + expect(importResult.collections.length).toBe(1); + expect(importResult.collections[0].name).toBe("myImportTarget"); + }); + + it("passing importTarget sets it as new root for all existing collections", async () => { + collectionService.getAllDecrypted.mockResolvedValue([ + mockImportTargetCollection, + mockCollection1, + mockCollection2, + ]); + + const myImportTarget = "myImportTarget"; + + importResult.collections.push(mockCollection1); + importResult.collections.push(mockCollection2); + + await importService["setImportTarget"](importResult, organizationId, myImportTarget); + expect(importResult.collections.length).toBe(3); + expect(importResult.collections[0].name).toBe(myImportTarget); + expect(importResult.collections[1].name).toBe(`${myImportTarget}/${mockCollection1.name}`); + expect(importResult.collections[2].name).toBe(`${myImportTarget}/${mockCollection2.name}`); + }); + }); }); diff --git a/libs/importer/src/services/import.service.ts b/libs/importer/src/services/import.service.ts index 07e9b998a43..5920ec200d4 100644 --- a/libs/importer/src/services/import.service.ts +++ b/libs/importer/src/services/import.service.ts @@ -13,6 +13,8 @@ import { CipherRequest } from "@bitwarden/common/vault/models/request/cipher.req import { CollectionWithIdRequest } from "@bitwarden/common/vault/models/request/collection-with-id.request"; import { FolderWithIdRequest } from "@bitwarden/common/vault/models/request/folder-with-id.request"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { AscendoCsvImporter, @@ -106,7 +108,9 @@ export class ImportService implements ImportServiceAbstraction { async import( importer: Importer, fileContents: string, - organizationId: string = null + organizationId: string = null, + selectedImportTarget: string = null, + isUserAdmin: boolean ): Promise { let importResult: ImportResult; try { @@ -142,7 +146,17 @@ export class ImportService implements ImportServiceAbstraction { } } + if (organizationId && Utils.isNullOrWhitespace(selectedImportTarget) && !isUserAdmin) { + const hasUnassignedCollections = importResult.ciphers.some( + (c) => !Array.isArray(c.collectionIds) || c.collectionIds.length == 0 + ); + if (hasUnassignedCollections) { + throw new Error(this.i18nService.t("importUnassignedItemsError")); + } + } + try { + await this.setImportTarget(importResult, organizationId, selectedImportTarget); if (organizationId != null) { await this.handleOrganizationalImport(importResult, organizationId); } else { @@ -403,4 +417,69 @@ export class ImportService implements ImportServiceAbstraction { return new Error(errorMessage); } + + private async setImportTarget( + importResult: ImportResult, + organizationId: string, + importTarget: string + ) { + if (Utils.isNullOrWhitespace(importTarget)) { + return; + } + + if (organizationId) { + const collectionViews: CollectionView[] = await this.collectionService.getAllDecrypted(); + const targetCollection = collectionViews.find((c) => c.id === importTarget); + + const noCollectionRelationShips: [number, number][] = []; + importResult.ciphers.forEach((c, index) => { + if (!Array.isArray(c.collectionIds) || c.collectionIds.length == 0) { + c.collectionIds = [targetCollection.id]; + noCollectionRelationShips.push([index, 0]); + } + }); + + const collections: CollectionView[] = [...importResult.collections]; + importResult.collections = [targetCollection]; + collections.map((x) => { + const f = new CollectionView(); + f.name = `${targetCollection.name}/${x.name}`; + importResult.collections.push(f); + }); + + const relationships: [number, number][] = [...importResult.collectionRelationships]; + importResult.collectionRelationships = [...noCollectionRelationShips]; + relationships.map((x) => { + importResult.collectionRelationships.push([x[0], x[1] + 1]); + }); + + return; + } + + const folderViews = await this.folderService.getAllDecryptedFromState(); + const targetFolder = folderViews.find((f) => f.id === importTarget); + + const noFolderRelationShips: [number, number][] = []; + importResult.ciphers.forEach((c, index) => { + if (Utils.isNullOrEmpty(c.folderId)) { + c.folderId = targetFolder.id; + noFolderRelationShips.push([index, 0]); + } + }); + + const folders: FolderView[] = [...importResult.folders]; + importResult.folders = [targetFolder]; + folders.map((x) => { + const newFolderName = `${targetFolder.name}/${x.name}`; + const f = new FolderView(); + f.name = newFolderName; + importResult.folders.push(f); + }); + + const relationships: [number, number][] = [...importResult.folderRelationships]; + importResult.folderRelationships = [...noFolderRelationShips]; + relationships.map((x) => { + importResult.folderRelationships.push([x[0], x[1] + 1]); + }); + } } From a05b4fd094a46b302feafd99548ef79d3212232b Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Mon, 7 Aug 2023 10:20:59 -0700 Subject: [PATCH 252/299] [AC-1361] Update organization vault export scope call out copy (#5944) --- apps/web/src/locales/en/messages.json | 4 ++-- .../tools/export/components/export-scope-callout.component.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 570c4b61588..e15b3f1b17e 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5463,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", diff --git a/libs/angular/src/tools/export/components/export-scope-callout.component.ts b/libs/angular/src/tools/export/components/export-scope-callout.component.ts index 301d427c296..3095cd5e835 100644 --- a/libs/angular/src/tools/export/components/export-scope-callout.component.ts +++ b/libs/angular/src/tools/export/components/export-scope-callout.component.ts @@ -30,7 +30,7 @@ export class ExportScopeCalloutComponent implements OnInit { this.organizationId != null ? { title: "exportingOrganizationVaultTitle", - description: "exportingOrganizationVaultDescription", + description: "exportingOrganizationVaultDesc", scopeIdentifier: this.organizationService.get(this.organizationId).name, } : { From 50b3e40a0573f18064f666812434e122c5d66c40 Mon Sep 17 00:00:00 2001 From: Cesar Gonzalez Date: Mon, 7 Aug 2023 16:06:25 -0500 Subject: [PATCH 253/299] [PM-2147] [BEEEP] Open login form used to unlock extension in a separate window instead of a tab (#5384) * [PM-1796] The autofill keyboard shortcut does not prompt a user to unlock a locked extension within an incongito browsing session * [PM-1796] Implementing fixes for how we handle focus redirection when logging a user in and attempting to autofill within the Firefox Workspaces addon * [PM-1796] Removing the `openerTab` value from the createNewTab method within brwoserApi.ts * [PM-1796] Removing async declaration from createNewTab * [PM-1796] Removing unnecessary param from the call to openBitwardenExtrensionTab * [PM-2147] [BEEEP] Open login form used to unlock extension in a separate window instead of a tab * [PM-2147] [BEEEP] Open login form used to unlock extension in a separate window instead of a tab * [PM-2147] [BEEEP] Modifying the position where the window opens and starting cleanup of comments within implementation * [PM-2147] [BEEEP] Cleaning up comments within implementation * [PM-2147] [BEEEP] Removing unnecessary method * [PM-2147] [BEEEP] Removing package-lock changes * [PM-2147] [BEEEP] Cleaning up implementation * [PM-2147] [BEEEP] Reverting addition to the whitelist-capital-letters filter and updating named file * [PM-2147] [BEEEP] Reverting addition to the whitelist-capital-letters filter and updating named file * [PM-2147] [BEEEP] Adjusting implementation of notifications bar to trigger presentation on lock only when not adding a new vault item * [PM-2147] [BEEEP] Adjusting implementation of how we open a login prompt window to ensure we are showing the address bar to the user * [PM-2147] [BEEEP] Modifying the method closeBitwardenLoginPromptWindow to not check for a popup type window * [PM-2147] [BEEEP] Fixing bug where notification bar does not close when unlocking vault * [PM-2147] [BEEEP] Adjusting placement of method BrowserApi.getWindow to have it present closer to getTab * [PM-2147] [BEEEP] Implementing a sepearate service BrowserPopoutService that will maintain the most recently created popouts and selectively remove those when re-opening the login prompt * [PM-2147] [BEEEP] Modifying position of BrowserPopoutWindowService * [PM-2147] [BEEEP] Modifying position of BrowserPopoutWindowService * [PM-2147] [BEEEP] Modifying how we handle identifying a single use popout --- apps/browser/src/_locales/en/messages.json | 6 ++ .../background/context-menus.background.ts | 1 + .../background/notification.background.ts | 73 +++++++++++++++++-- .../src/autofill/notification/bar.html | 9 +++ apps/browser/src/autofill/notification/bar.ts | 22 ++++++ .../browser/src/background/main.background.ts | 6 +- .../models/add-unlock-vault-queue-message.ts | 6 ++ .../lockedVaultPendingNotificationsItem.ts | 5 +- .../models/notificationQueueMessageType.ts | 1 + .../src/background/runtime.background.ts | 9 ++- .../src/platform/browser/browser-api.ts | 24 +++++- .../browser-popout-window.service.ts | 6 ++ .../popup/browser-popout-window.service.ts | 64 ++++++++++++++++ 13 files changed, 220 insertions(+), 12 deletions(-) create mode 100644 apps/browser/src/background/models/add-unlock-vault-queue-message.ts create mode 100644 apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts create mode 100644 apps/browser/src/platform/popup/browser-popout-window.service.ts diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index b5d5afb27c4..63dd227e52b 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, diff --git a/apps/browser/src/autofill/background/context-menus.background.ts b/apps/browser/src/autofill/background/context-menus.background.ts index 681f86cdf67..bc26353cbd9 100644 --- a/apps/browser/src/autofill/background/context-menus.background.ts +++ b/apps/browser/src/autofill/background/context-menus.background.ts @@ -30,6 +30,7 @@ export default class ContextMenusBackground { msg.data.commandToRetry.msg.data, msg.data.commandToRetry.sender.tab ); + await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); } } ); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 07b565e2608..1cb006fa3a2 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -12,6 +12,7 @@ import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folde import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import AddUnlockVaultQueueMessage from "../../background/models/add-unlock-vault-queue-message"; import AddChangePasswordQueueMessage from "../../background/models/addChangePasswordQueueMessage"; import AddLoginQueueMessage from "../../background/models/addLoginQueueMessage"; import AddLoginRuntimeMessage from "../../background/models/addLoginRuntimeMessage"; @@ -23,7 +24,11 @@ import { BrowserStateService } from "../../platform/services/abstractions/browse import { AutofillService } from "../services/abstractions/autofill.service"; export default class NotificationBackground { - private notificationQueue: (AddLoginQueueMessage | AddChangePasswordQueueMessage)[] = []; + private notificationQueue: ( + | AddLoginQueueMessage + | AddChangePasswordQueueMessage + | AddUnlockVaultQueueMessage + )[] = []; constructor( private autofillService: AutofillService, @@ -53,10 +58,7 @@ export default class NotificationBackground { async processMessage(msg: any, sender: chrome.runtime.MessageSender) { switch (msg.command) { case "unlockCompleted": - if (msg.data.target !== "notification.background") { - return; - } - await this.processMessage(msg.data.commandToRetry.msg, msg.data.commandToRetry.sender); + await this.handleUnlockCompleted(msg.data, sender); break; case "bgGetDataForTab": await this.getDataForTab(sender.tab, msg.responseCommand); @@ -82,7 +84,9 @@ export default class NotificationBackground { if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { const retryMessage: LockedVaultPendingNotificationsItem = { commandToRetry: { - msg: msg, + msg: { + command: msg, + }, sender: sender, }, target: "notification.background", @@ -114,6 +118,9 @@ export default class NotificationBackground { break; } break; + case "promptForLogin": + await this.unlockVault(sender.tab); + break; default: break; } @@ -181,6 +188,14 @@ export default class NotificationBackground { webVaultURL: await this.environmentService.getWebVaultUrl(), }, }); + } else if (this.notificationQueue[i].type === NotificationQueueMessageType.UnlockVault) { + BrowserApi.tabSendMessageData(tab, "openNotificationBar", { + type: "unlock", + typeData: { + isVaultLocked: this.notificationQueue[i].wasVaultLocked, + theme: await this.getCurrentTheme(), + }, + }); } break; } @@ -305,6 +320,20 @@ export default class NotificationBackground { } } + private async unlockVault(tab: chrome.tabs.Tab) { + const currentAuthStatus = await this.authService.getAuthStatus(); + if (currentAuthStatus !== AuthenticationStatus.Locked || this.notificationQueue.length) { + return; + } + + const loginDomain = Utils.getDomain(tab.url); + if (!loginDomain) { + return; + } + + this.pushUnlockVaultToQueue(loginDomain, tab); + } + private async pushChangePasswordToQueue( cipherId: string, loginDomain: string, @@ -327,6 +356,20 @@ export default class NotificationBackground { await this.checkNotificationQueue(tab); } + private async pushUnlockVaultToQueue(loginDomain: string, tab: chrome.tabs.Tab) { + this.removeTabFromNotificationQueue(tab); + const message: AddUnlockVaultQueueMessage = { + type: NotificationQueueMessageType.UnlockVault, + domain: loginDomain, + tabId: tab.id, + expires: new Date(new Date().getTime() + 0.5 * 60000), // 30 seconds + wasVaultLocked: true, + }; + this.notificationQueue.push(message); + await this.checkNotificationQueue(tab); + this.removeTabFromNotificationQueue(tab); + } + private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, edit: boolean, folderId?: string) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; @@ -463,4 +506,22 @@ export default class NotificationBackground { this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership) ); } + + private async handleUnlockCompleted( + messageData: LockedVaultPendingNotificationsItem, + sender: chrome.runtime.MessageSender + ): Promise { + if (messageData.commandToRetry.msg.command === "autofill_login") { + await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); + } + + if (messageData.target !== "notification.background") { + return; + } + + await this.processMessage( + messageData.commandToRetry.msg.command, + messageData.commandToRetry.sender + ); + } } diff --git a/apps/browser/src/autofill/notification/bar.html b/apps/browser/src/autofill/notification/bar.html index deec7fd512c..a6be58de70a 100644 --- a/apps/browser/src/autofill/notification/bar.html +++ b/apps/browser/src/autofill/notification/bar.html @@ -51,4 +51,13 @@
+ + diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 728ae4e1287..dcc4ce010f6 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -28,6 +28,8 @@ function load() { notificationEdit: chrome.i18n.getMessage("edit"), notificationChangeSave: chrome.i18n.getMessage("notificationChangeSave"), notificationChangeDesc: chrome.i18n.getMessage("notificationChangeDesc"), + notificationUnlock: chrome.i18n.getMessage("notificationUnlock"), + notificationUnlockDesc: chrome.i18n.getMessage("notificationUnlockDesc"), }; const logoLink = document.getElementById("logo-link") as HTMLAnchorElement; @@ -72,6 +74,13 @@ function load() { changeTemplate.content.getElementById("change-text").textContent = i18n.notificationChangeDesc; + const unlockTemplate = document.getElementById("template-unlock") as HTMLTemplateElement; + + const unlockButton = unlockTemplate.content.getElementById("unlock-vault"); + unlockButton.textContent = i18n.notificationUnlock; + + unlockTemplate.content.getElementById("unlock-text").textContent = i18n.notificationUnlockDesc; + // i18n for body content const closeButton = document.getElementById("close-button"); closeButton.title = i18n.close; @@ -80,6 +89,8 @@ function load() { handleTypeAdd(); } else if (getQueryVariable("type") === "change") { handleTypeChange(); + } else if (getQueryVariable("type") === "unlock") { + handleTypeUnlock(); } closeButton.addEventListener("click", (e) => { @@ -172,6 +183,17 @@ function handleTypeChange() { }); } +function handleTypeUnlock() { + setContent(document.getElementById("template-unlock") as HTMLTemplateElement); + + const unlockButton = document.getElementById("unlock-vault"); + unlockButton.addEventListener("click", (e) => { + sendPlatformMessage({ + command: "bgReopenPromptForLogin", + }); + }); +} + function setContent(template: HTMLTemplateElement) { const content = document.getElementById("content"); while (content.firstChild) { diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 4e310354699..59a1b444e09 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -114,6 +114,7 @@ import { Account } from "../models/account"; import { BrowserApi } from "../platform/browser/browser-api"; import { flagEnabled } from "../platform/flags"; import { UpdateBadge } from "../platform/listeners/update-badge"; +import BrowserPopoutWindowService from "../platform/popup/browser-popout-window.service"; import { BrowserStateService as StateServiceAbstraction } from "../platform/services/abstractions/browser-state.service"; import { BrowserCryptoService } from "../platform/services/browser-crypto.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; @@ -195,6 +196,7 @@ export default class MainBackground { cipherContextMenuHandler: CipherContextMenuHandler; configService: ConfigServiceAbstraction; configApiService: ConfigApiServiceAbstraction; + browserPopoutWindowService: BrowserPopoutWindowService; // Passed to the popup for Safari to workaround issues with theming, downloading, etc. backgroundWindow = window; @@ -512,6 +514,7 @@ export default class MainBackground { this.authService, this.environmentService ); + this.browserPopoutWindowService = new BrowserPopoutWindowService(); const systemUtilsServiceReloadCallback = () => { const forceWindowReload = @@ -543,7 +546,8 @@ export default class MainBackground { this.environmentService, this.messagingService, this.logService, - this.configService + this.configService, + this.browserPopoutWindowService ); this.nativeMessagingBackground = new NativeMessagingBackground( this.cryptoService, diff --git a/apps/browser/src/background/models/add-unlock-vault-queue-message.ts b/apps/browser/src/background/models/add-unlock-vault-queue-message.ts new file mode 100644 index 00000000000..9ddde271008 --- /dev/null +++ b/apps/browser/src/background/models/add-unlock-vault-queue-message.ts @@ -0,0 +1,6 @@ +import NotificationQueueMessage from "./notificationQueueMessage"; +import { NotificationQueueMessageType } from "./notificationQueueMessageType"; + +export default class AddUnlockVaultQueueMessage extends NotificationQueueMessage { + type: NotificationQueueMessageType.UnlockVault; +} diff --git a/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts b/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts index ec697b16994..53f8405cd50 100644 --- a/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts +++ b/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts @@ -1,6 +1,9 @@ export default class LockedVaultPendingNotificationsItem { commandToRetry: { - msg: any; + msg: { + command: string; + data?: any; + }; sender: chrome.runtime.MessageSender; }; target: string; diff --git a/apps/browser/src/background/models/notificationQueueMessageType.ts b/apps/browser/src/background/models/notificationQueueMessageType.ts index f5e4115c4f5..2ce1a1840d8 100644 --- a/apps/browser/src/background/models/notificationQueueMessageType.ts +++ b/apps/browser/src/background/models/notificationQueueMessageType.ts @@ -1,4 +1,5 @@ export enum NotificationQueueMessageType { AddLogin = 0, ChangePassword = 1, + UnlockVault = 2, } diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 81f7376a94d..2e9fc934882 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -8,6 +8,7 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { AutofillService } from "../autofill/services/abstractions/autofill.service"; import { BrowserApi } from "../platform/browser/browser-api"; +import { BrowserPopoutWindowService } from "../platform/popup/abstractions/browser-popout-window.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; import BrowserPlatformUtilsService from "../platform/services/browser-platform-utils.service"; @@ -30,7 +31,8 @@ export default class RuntimeBackground { private environmentService: BrowserEnvironmentService, private messagingService: MessagingService, private logService: LogService, - private configService: ConfigServiceAbstraction + private configService: ConfigServiceAbstraction, + private browserPopoutWindowService: BrowserPopoutWindowService ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -66,7 +68,7 @@ export default class RuntimeBackground { if (this.lockedVaultPendingNotifications?.length > 0) { item = this.lockedVaultPendingNotifications.pop(); - BrowserApi.closeBitwardenExtensionTab(); + await this.browserPopoutWindowService.closeLoginPrompt(); } await this.main.refreshBadge(); @@ -105,7 +107,8 @@ export default class RuntimeBackground { await this.main.openPopup(); break; case "promptForLogin": - BrowserApi.openBitwardenExtensionTab("popup/index.html", true); + case "bgReopenPromptForLogin": + await this.browserPopoutWindowService.openLoginPrompt(sender.tab?.windowId); break; case "openAddEditCipher": { const addEditCipherUrl = diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 7c646e5c7e6..243971dbfc0 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -17,6 +17,24 @@ export class BrowserApi { return chrome.runtime.getManifest().manifest_version; } + static getWindow(windowId?: number): Promise | void { + if (!windowId) { + return; + } + + return new Promise((resolve) => + chrome.windows.get(windowId, { populate: true }, (window) => resolve(window)) + ); + } + + static async createWindow(options: chrome.windows.CreateData): Promise { + return new Promise((resolve) => + chrome.windows.create(options, (window) => { + resolve(window); + }) + ); + } + static async getTabFromCurrentWindowId(): Promise | null { return await BrowserApi.tabsQueryFirst({ active: true, @@ -105,6 +123,10 @@ export class BrowserApi { chrome.tabs.sendMessage(tabId, message, options, responseCallback); } + static async removeTab(tabId: number) { + await chrome.tabs.remove(tabId); + } + static async getPrivateModeWindows(): Promise { return (await browser.windows.getAll()).filter((win) => win.incognito); } @@ -165,7 +187,7 @@ export class BrowserApi { } const tabToClose = tabs[tabs.length - 1]; - chrome.tabs.remove(tabToClose.id); + BrowserApi.removeTab(tabToClose.id); } private static registeredMessageListeners: any[] = []; diff --git a/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts b/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts new file mode 100644 index 00000000000..ca22e369d80 --- /dev/null +++ b/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts @@ -0,0 +1,6 @@ +interface BrowserPopoutWindowService { + openLoginPrompt(senderWindowId: number): Promise; + closeLoginPrompt(): Promise; +} + +export { BrowserPopoutWindowService }; diff --git a/apps/browser/src/platform/popup/browser-popout-window.service.ts b/apps/browser/src/platform/popup/browser-popout-window.service.ts new file mode 100644 index 00000000000..bfec3e690ba --- /dev/null +++ b/apps/browser/src/platform/popup/browser-popout-window.service.ts @@ -0,0 +1,64 @@ +import { BrowserApi } from "../browser/browser-api"; + +import { BrowserPopoutWindowService as BrowserPopupWindowServiceInterface } from "./abstractions/browser-popout-window.service"; + +class BrowserPopoutWindowService implements BrowserPopupWindowServiceInterface { + private singleActionPopoutTabIds: Record = {}; + private defaultPopoutWindowOptions: chrome.windows.CreateData = { + type: "normal", + focused: true, + width: 500, + height: 800, + }; + + async openLoginPrompt(senderWindowId: number) { + await this.closeLoginPrompt(); + await this.openPopoutWindow( + senderWindowId, + "popup/index.html?uilocation=popout", + "loginPrompt" + ); + } + + async closeLoginPrompt() { + await this.closeSingleActionPopout("loginPrompt"); + } + + private async openPopoutWindow( + senderWindowId: number, + popupWindowURL: string, + singleActionPopoutKey: string + ) { + const senderWindow = senderWindowId && (await BrowserApi.getWindow(senderWindowId)); + const url = chrome.extension.getURL(popupWindowURL); + const offsetRight = 15; + const offsetTop = 90; + const popupWidth = this.defaultPopoutWindowOptions.width; + const windowOptions = senderWindow + ? { + ...this.defaultPopoutWindowOptions, + url, + left: senderWindow.left + senderWindow.width - popupWidth - offsetRight, + top: senderWindow.top + offsetTop, + } + : { ...this.defaultPopoutWindowOptions, url }; + + const popupWindow = await BrowserApi.createWindow(windowOptions); + + if (!singleActionPopoutKey) { + return; + } + this.singleActionPopoutTabIds[singleActionPopoutKey] = popupWindow?.tabs[0].id; + } + + private async closeSingleActionPopout(popoutKey: string) { + const tabId = this.singleActionPopoutTabIds[popoutKey]; + if (!tabId) { + return; + } + await BrowserApi.removeTab(tabId); + this.singleActionPopoutTabIds[popoutKey] = null; + } +} + +export default BrowserPopoutWindowService; From f43272f243d9f969d6957db7e3a91a9ce75e2e5b Mon Sep 17 00:00:00 2001 From: Will Martin Date: Tue, 8 Aug 2023 09:37:25 -0400 Subject: [PATCH 254/299] [PM-3172] create @bitwarden/auth lib (#5906) * scaffold new lib * update jest config * update tsconfig * add readme * update tailwind config * update package-lock * update tsconfigs * update jest displayName * update tsconfig.libs.json * fix alias glob * update package lock * add readme to whitelist-capital-letters * update CODEOWNERS * remove test utils * update eslint rules * alphabetize eslint and tsconfig * sort jest config --------- Co-authored-by: Oscar Hinton --- .eslintrc.json | 26 ++++++++++++++--------- .github/CODEOWNERS | 1 + .github/whitelist-capital-letters.txt | 1 + apps/browser/tsconfig.json | 1 + apps/desktop/tsconfig.json | 1 + apps/web/tsconfig.json | 7 ++++--- bitwarden_license/bit-web/tsconfig.json | 7 ++++--- jest.config.js | 3 ++- libs/auth/README.md | 3 +++ libs/auth/jest.config.js | 16 ++++++++++++++ libs/auth/package.json | 20 ++++++++++++++++++ libs/auth/src/index.ts | 0 libs/auth/test.setup.ts | 28 +++++++++++++++++++++++++ libs/auth/tsconfig.json | 5 +++++ libs/auth/tsconfig.spec.json | 4 ++++ libs/shared/tsconfig.libs.json | 7 ++++--- package-lock.json | 9 ++++++++ tailwind.config.js | 1 + tsconfig.eslint.json | 7 ++++--- tsconfig.json | 7 ++++--- 20 files changed, 128 insertions(+), 26 deletions(-) create mode 100644 libs/auth/README.md create mode 100644 libs/auth/jest.config.js create mode 100644 libs/auth/package.json create mode 100644 libs/auth/src/index.ts create mode 100644 libs/auth/test.setup.ts create mode 100644 libs/auth/tsconfig.json create mode 100644 libs/auth/tsconfig.spec.json diff --git a/.eslintrc.json b/.eslintrc.json index 45a9d063a98..afa134a65ed 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -134,6 +134,18 @@ "tailwindcss/no-contradicting-classname": "error" } }, + { + "files": ["libs/angular/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/angular/*", "src/**/*"] }] + } + }, + { + "files": ["libs/auth/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/auth/*", "src/**/*"] }] + } + }, { "files": ["libs/common/src/**/*.ts"], "rules": { @@ -147,15 +159,9 @@ } }, { - "files": ["libs/angular/src/**/*.ts"], + "files": ["libs/exporter/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/angular/*", "src/**/*"] }] - } - }, - { - "files": ["libs/node/src/**/*.ts"], - "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/node/*", "src/**/*"] }] + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/exporter/*", "src/**/*"] }] } }, { @@ -165,9 +171,9 @@ } }, { - "files": ["libs/exporter/src/**/*.ts"], + "files": ["libs/node/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/exporter/*", "src/**/*"] }] + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/node/*", "src/**/*"] }] } } ] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 832a874607d..1aed9c1be8c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -14,6 +14,7 @@ apps/browser/src/auth @bitwarden/team-auth-dev apps/cli/src/auth @bitwarden/team-auth-dev apps/desktop/src/auth @bitwarden/team-auth-dev apps/web/src/app/auth @bitwarden/team-auth-dev +libs/auth @bitwarden/team-auth-dev # web connectors used for auth apps/web/src/connectors @bitwarden/team-auth-dev bitwarden_license/bit-web/src/app/auth @bitwarden/team-auth-dev diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index fd03af5f08a..17047f4333d 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -31,6 +31,7 @@ ./libs/common/src/services/vaultTimeout/vaultTimeoutSettings.service.ts ./libs/common/src/services/vaultTimeout/vaultTimeout.service.ts ./libs/common/src/services/anonymousHub.service.ts +./libs/auth/README.md ./README.md ./LICENSE_BITWARDEN.txt ./CONTRIBUTING.md diff --git a/apps/browser/tsconfig.json b/apps/browser/tsconfig.json index 6c5e4330b73..9220b89c424 100644 --- a/apps/browser/tsconfig.json +++ b/apps/browser/tsconfig.json @@ -11,6 +11,7 @@ "baseUrl": ".", "paths": { "@bitwarden/angular/*": ["../../libs/angular/src/*"], + "@bitwarden/auth": ["../../libs/auth/src"], "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/components": ["../../libs/components/src"], "@bitwarden/exporter/*": ["../../libs/exporter/src/*"] diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json index bf55862559a..f34ba7cfae4 100644 --- a/apps/desktop/tsconfig.json +++ b/apps/desktop/tsconfig.json @@ -11,6 +11,7 @@ "baseUrl": ".", "paths": { "@bitwarden/angular/*": ["../../libs/angular/src/*"], + "@bitwarden/auth": ["../../libs/auth/src"], "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/components": ["../../libs/components/src"], "@bitwarden/exporter/*": ["../../libs/exporter/src/*"] diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index f5d6f72d96c..9048efd39b7 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -5,12 +5,13 @@ "module": "ES2020", "resolveJsonModule": true, "paths": { - "@bitwarden/web-vault/*": ["src/*"], - "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/angular/*": ["../../libs/angular/src/*"], + "@bitwarden/auth": ["../../libs/auth/src"], + "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/components": ["../../libs/components/src"], + "@bitwarden/exporter/*": ["../../libs/exporter/src/*"], "@bitwarden/importer": ["../../libs/importer/src"], - "@bitwarden/exporter/*": ["../../libs/exporter/src/*"] + "@bitwarden/web-vault/*": ["src/*"] } }, "angularCompilerOptions": { diff --git a/bitwarden_license/bit-web/tsconfig.json b/bitwarden_license/bit-web/tsconfig.json index 9f3a8224889..a712fae9025 100644 --- a/bitwarden_license/bit-web/tsconfig.json +++ b/bitwarden_license/bit-web/tsconfig.json @@ -2,11 +2,12 @@ "extends": "../../apps/web/tsconfig", "compilerOptions": { "paths": { - "@bitwarden/web-vault/*": ["../../apps/web/src/*"], - "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/angular/*": ["../../libs/angular/src/*"], + "@bitwarden/auth": ["../../libs/auth/src"], + "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/components": ["../../libs/components/src"], - "@bitwarden/exporter/*": ["../../libs/exporter/src/*"] + "@bitwarden/exporter/*": ["../../libs/exporter/src/*"], + "@bitwarden/web-vault/*": ["../../apps/web/src/*"] } }, "include": ["src/**/*.stories.ts"] diff --git a/jest.config.js b/jest.config.js index 8b54a826583..c4213fa143c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -21,10 +21,11 @@ module.exports = { "/bitwarden_license/bit-web/jest.config.js", "/libs/angular/jest.config.js", + "/libs/auth/jest.config.js", "/libs/common/jest.config.js", "/libs/components/jest.config.js", - "/libs/importer/jest.config.js", "/libs/exporter/jest.config.js", + "/libs/importer/jest.config.js", "/libs/node/jest.config.js", ], diff --git a/libs/auth/README.md b/libs/auth/README.md new file mode 100644 index 00000000000..59e6384fae4 --- /dev/null +++ b/libs/auth/README.md @@ -0,0 +1,3 @@ +# Auth + +This lib represents the public API of the Auth team at Bitwarden. Modules are imported using `@bitwarden/auth`. diff --git a/libs/auth/jest.config.js b/libs/auth/jest.config.js new file mode 100644 index 00000000000..3db83db07a4 --- /dev/null +++ b/libs/auth/jest.config.js @@ -0,0 +1,16 @@ +const { pathsToModuleNameMapper } = require("ts-jest"); + +const { compilerOptions } = require("../shared/tsconfig.libs"); + +const sharedConfig = require("../../libs/shared/jest.config.angular"); + +/** @type {import('jest').Config} */ +module.exports = { + ...sharedConfig, + displayName: "libs/auth tests", + preset: "jest-preset-angular", + setupFilesAfterEnv: ["/test.setup.ts"], + moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, { + prefix: "/", + }), +}; diff --git a/libs/auth/package.json b/libs/auth/package.json new file mode 100644 index 00000000000..52c1be63f81 --- /dev/null +++ b/libs/auth/package.json @@ -0,0 +1,20 @@ +{ + "name": "@bitwarden/auth", + "version": "0.0.0", + "description": "Common code used across Bitwarden JavaScript projects.", + "keywords": [ + "bitwarden" + ], + "author": "Bitwarden Inc.", + "homepage": "https://bitwarden.com", + "repository": { + "type": "git", + "url": "https://github.com/bitwarden/clients" + }, + "license": "GPL-3.0", + "scripts": { + "clean": "rimraf dist", + "build": "npm run clean && tsc", + "build:watch": "npm run clean && tsc -watch" + } +} diff --git a/libs/auth/src/index.ts b/libs/auth/src/index.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libs/auth/test.setup.ts b/libs/auth/test.setup.ts new file mode 100644 index 00000000000..6be6e7b8dd1 --- /dev/null +++ b/libs/auth/test.setup.ts @@ -0,0 +1,28 @@ +import { webcrypto } from "crypto"; +import "jest-preset-angular/setup-jest"; + +Object.defineProperty(window, "CSS", { value: null }); +Object.defineProperty(window, "getComputedStyle", { + value: () => { + return { + display: "none", + appearance: ["-webkit-appearance"], + }; + }, +}); + +Object.defineProperty(document, "doctype", { + value: "", +}); +Object.defineProperty(document.body.style, "transform", { + value: () => { + return { + enumerable: true, + configurable: true, + }; + }, +}); + +Object.defineProperty(window, "crypto", { + value: webcrypto, +}); diff --git a/libs/auth/tsconfig.json b/libs/auth/tsconfig.json new file mode 100644 index 00000000000..6004a56fb55 --- /dev/null +++ b/libs/auth/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../shared/tsconfig.libs", + "include": ["src", "spec"], + "exclude": ["node_modules", "dist"] +} diff --git a/libs/auth/tsconfig.spec.json b/libs/auth/tsconfig.spec.json new file mode 100644 index 00000000000..de184bd7608 --- /dev/null +++ b/libs/auth/tsconfig.spec.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "files": ["./test.setup.ts"] +} diff --git a/libs/shared/tsconfig.libs.json b/libs/shared/tsconfig.libs.json index 8eda1dc0d7c..28a1ccdfa4c 100644 --- a/libs/shared/tsconfig.libs.json +++ b/libs/shared/tsconfig.libs.json @@ -2,11 +2,12 @@ "extends": "./tsconfig", "compilerOptions": { "paths": { - "@bitwarden/common/*": ["../common/src/*"], "@bitwarden/angular/*": ["../angular/src/*"], - "@bitwarden/node/*": ["../node/src/*"], + "@bitwarden/auth": ["../auth/src/*"], + "@bitwarden/common/*": ["../common/src/*"], + "@bitwarden/exporter/*": ["../exporter/src/*"], "@bitwarden/importer": ["../importer/src"], - "@bitwarden/exporter/*": ["../exporter/src/*"] + "@bitwarden/node/*": ["../node/src/*"] } } } diff --git a/package-lock.json b/package-lock.json index bd51b35ce9f..df157a9cff3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -250,6 +250,11 @@ "version": "0.0.0", "license": "GPL-3.0" }, + "libs/auth": { + "name": "@bitwarden/auth", + "version": "0.0.0", + "license": "GPL-3.0" + }, "libs/common": { "name": "@bitwarden/common", "version": "0.0.0", @@ -4392,6 +4397,10 @@ "resolved": "libs/angular", "link": true }, + "node_modules/@bitwarden/auth": { + "resolved": "libs/auth", + "link": true + }, "node_modules/@bitwarden/browser": { "resolved": "apps/browser", "link": true diff --git a/tailwind.config.js b/tailwind.config.js index 21012889938..4011729cf5a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,6 +3,7 @@ const config = require("./libs/components/tailwind.config.base"); config.content = [ "./libs/components/src/**/*.{html,ts,mdx}", + "./libs/auth/src/**/*.{html,ts,mdx}", "./apps/web/src/**/*.{html,ts,mdx}", "./bitwarden_license/bit-web/src/**/*.{html,ts,mdx}", "./.storybook/preview.js", diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 3398efa9fdf..33037c385e2 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -15,11 +15,12 @@ "outDir": "dist", "baseUrl": ".", "paths": { - "@bitwarden/common/*": ["./libs/common/src/*"], "@bitwarden/angular/*": ["./libs/angular/src/*"], - "@bitwarden/node/*": ["./libs/node/src/*"], + "@bitwarden/auth": ["./libs/auth/src"], + "@bitwarden/common/*": ["./libs/common/src/*"], "@bitwarden/components": ["./libs/components/src"], - "@bitwarden/exporter/*": ["./libs/exporter/src/*"] + "@bitwarden/exporter/*": ["./libs/exporter/src/*"], + "@bitwarden/node/*": ["./libs/node/src/*"] }, "plugins": [ { diff --git a/tsconfig.json b/tsconfig.json index 649052c152b..41d92039705 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,12 +15,13 @@ "baseUrl": ".", "resolveJsonModule": true, "paths": { - "@bitwarden/common/*": ["./libs/common/src/*"], "@bitwarden/angular/*": ["./libs/angular/src/*"], - "@bitwarden/node/*": ["./libs/node/src/*"], + "@bitwarden/auth": ["./libs/auth/src"], + "@bitwarden/common/*": ["./libs/common/src/*"], "@bitwarden/components": ["./libs/components/src"], - "@bitwarden/importer": ["./libs/importer/src"], "@bitwarden/exporter/*": ["./libs/exporter/src/*"], + "@bitwarden/importer": ["./libs/importer/src"], + "@bitwarden/node/*": ["./libs/node/src/*"], "@bitwarden/web-vault/*": ["./apps/web/src/*"] }, "plugins": [ From eca060d7e6c18b6599bfce20b058a2cde8c514a7 Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Tue, 8 Aug 2023 12:08:39 -0500 Subject: [PATCH 255/299] [SM-240] Add max length limit on SM strings (#5823) * Add max length limit on SM strings * remove HTML attributes * remove from project --- .../projects/dialog/project-dialog.component.html | 2 +- .../projects/dialog/project-dialog.component.ts | 2 +- .../secrets/dialog/secret-dialog.component.html | 2 +- .../secrets/dialog/secret-dialog.component.ts | 8 ++++---- .../dialog/service-account-dialog.component.html | 2 +- .../dialog/service-account-dialog.component.ts | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.html index 34082cd4d60..b56f7d45121 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.html @@ -7,7 +7,7 @@ {{ "projectName" | i18n }} - + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts index 42ec8ef02f6..a6a3c958d09 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts @@ -27,7 +27,7 @@ export interface ProjectOperation { export class ProjectDialogComponent implements OnInit { protected formGroup = new FormGroup({ name: new FormControl("", { - validators: [Validators.required, BitValidators.trimValidator], + validators: [Validators.required, Validators.maxLength(500), BitValidators.trimValidator], updateOn: "submit", }), }); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html index d190a7f91be..62692511e23 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.html @@ -41,7 +41,7 @@ {{ "projectName" | i18n }} - + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts index 4bf9bd6f768..1c376739970 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts @@ -38,17 +38,17 @@ export interface SecretOperation { export class SecretDialogComponent implements OnInit { protected formGroup = new FormGroup({ name: new FormControl("", { - validators: [Validators.required, BitValidators.trimValidator], + validators: [Validators.required, Validators.maxLength(500), BitValidators.trimValidator], updateOn: "submit", }), - value: new FormControl("", [Validators.required]), + value: new FormControl("", [Validators.required, Validators.maxLength(3500)]), notes: new FormControl("", { - validators: [BitValidators.trimValidator], + validators: [Validators.maxLength(7000), BitValidators.trimValidator], updateOn: "submit", }), project: new FormControl("", [Validators.required]), newProjectName: new FormControl("", { - validators: [BitValidators.trimValidator], + validators: [Validators.maxLength(500), BitValidators.trimValidator], updateOn: "submit", }), }); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.html index dcd68aa6deb..5f7260025cf 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.html @@ -8,7 +8,7 @@
{{ "serviceAccountName" | i18n }} - +
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts index 68efb9e475d..1f42537f956 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts @@ -27,7 +27,7 @@ export class ServiceAccountDialogComponent { protected formGroup = new FormGroup( { name: new FormControl("", { - validators: [Validators.required, BitValidators.trimValidator], + validators: [Validators.required, Validators.maxLength(500), BitValidators.trimValidator], updateOn: "submit", }), }, From a7cce1a3ad89bfa1f12b08aa69358ae10a4e7b6b Mon Sep 17 00:00:00 2001 From: Cesar Gonzalez Date: Tue, 8 Aug 2023 15:56:42 -0500 Subject: [PATCH 256/299] [PM-669] Right Click Autofill List Contains Incorrect Entries (#5711) --- apps/browser/src/autofill/background/tabs.background.ts | 2 ++ .../src/autofill/browser/cipher-context-menu-handler.ts | 6 ++++++ apps/browser/src/platform/background.ts | 2 ++ apps/browser/src/platform/listeners/index.ts | 6 ++++++ apps/browser/src/platform/listeners/update-badge.ts | 7 +++++++ 5 files changed, 23 insertions(+) diff --git a/apps/browser/src/autofill/background/tabs.background.ts b/apps/browser/src/autofill/background/tabs.background.ts index 0f724c84dd5..0655fd23b62 100644 --- a/apps/browser/src/autofill/background/tabs.background.ts +++ b/apps/browser/src/autofill/background/tabs.background.ts @@ -21,6 +21,8 @@ export default class TabsBackground { } this.focusedWindowId = windowId; + await this.main.refreshBadge(); + await this.main.refreshMenu(); this.main.messagingService.send("windowChanged"); }); diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts index 2eccc03c12b..d4f72e56633 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -81,6 +81,12 @@ export class CipherContextMenuHandler { ); } + static async windowsOnFocusChangedListener(windowId: number, serviceCache: CachedServices) { + const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); + const tab = await BrowserApi.getTabFromCurrentWindow(); + await cipherContextMenuHandler.update(tab?.url); + } + static async tabsOnActivatedListener( activeInfo: chrome.tabs.TabActiveInfo, serviceCache: CachedServices diff --git a/apps/browser/src/platform/background.ts b/apps/browser/src/platform/background.ts index 949991df9f0..f7913dade9f 100644 --- a/apps/browser/src/platform/background.ts +++ b/apps/browser/src/platform/background.ts @@ -8,6 +8,7 @@ import { onCommandListener, onInstallListener, runtimeMessageListener, + windowsOnFocusChangedListener, tabsOnActivatedListener, tabsOnReplacedListener, tabsOnUpdatedListener, @@ -18,6 +19,7 @@ if (BrowserApi.manifestVersion === 3) { chrome.runtime.onInstalled.addListener(onInstallListener); chrome.alarms.onAlarm.addListener(onAlarmListener); registerAlarms(); + chrome.windows.onFocusChanged.addListener(windowsOnFocusChangedListener); chrome.tabs.onActivated.addListener(tabsOnActivatedListener); chrome.tabs.onReplaced.addListener(tabsOnReplacedListener); chrome.tabs.onUpdated.addListener(tabsOnUpdatedListener); diff --git a/apps/browser/src/platform/listeners/index.ts b/apps/browser/src/platform/listeners/index.ts index cf4950023f3..60e304402aa 100644 --- a/apps/browser/src/platform/listeners/index.ts +++ b/apps/browser/src/platform/listeners/index.ts @@ -6,6 +6,11 @@ import { onCommandListener } from "./on-command-listener"; import { onInstallListener } from "./on-install-listener"; import { UpdateBadge } from "./update-badge"; +const windowsOnFocusChangedListener = combine([ + UpdateBadge.windowsOnFocusChangedListener, + CipherContextMenuHandler.windowsOnFocusChangedListener, +]); + const tabsOnActivatedListener = combine([ UpdateBadge.tabsOnActivatedListener, CipherContextMenuHandler.tabsOnActivatedListener, @@ -33,6 +38,7 @@ const runtimeMessageListener = combine< ]); export { + windowsOnFocusChangedListener, tabsOnActivatedListener, tabsOnReplacedListener, tabsOnUpdatedListener, diff --git a/apps/browser/src/platform/listeners/update-badge.ts b/apps/browser/src/platform/listeners/update-badge.ts index 4623ff30f05..89b620ad6fe 100644 --- a/apps/browser/src/platform/listeners/update-badge.ts +++ b/apps/browser/src/platform/listeners/update-badge.ts @@ -42,6 +42,13 @@ export class UpdateBadge { "deletedCipher", ]; + static async windowsOnFocusChangedListener( + windowId: number, + serviceCache: Record + ) { + await new UpdateBadge(self).run({ windowId, existingServices: serviceCache }); + } + static async tabsOnActivatedListener( activeInfo: chrome.tabs.TabActiveInfo, serviceCache: Record From 96c6b870cb58a166d8b4a4f81bdb9015aa79efdd Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Wed, 9 Aug 2023 14:10:01 -0400 Subject: [PATCH 257/299] PM-2593 Update Premium Urls to target cloudWebVaultUrl (#5861) * updated urls in premium web component and premium libs to use the cloudwebvaulturl * moved premium.component in web from base settings to a new settings folder inside vault --- .../src/popup/settings/premium.component.ts | 14 ++++++++++++-- .../src/vault/app/accounts/premium.component.ts | 14 ++++++++++++-- .../settings/subscription-routing.module.ts | 2 +- apps/web/src/app/shared/loose-components.module.ts | 2 +- .../{ => vault}/settings/premium.component.html | 2 +- .../app/{ => vault}/settings/premium.component.ts | 10 +++++++--- .../src/vault/components/premium.component.ts | 13 +++++++++---- 7 files changed, 43 insertions(+), 14 deletions(-) rename apps/web/src/app/{ => vault}/settings/premium.component.html (98%) rename apps/web/src/app/{ => vault}/settings/premium.component.ts (91%) diff --git a/apps/browser/src/popup/settings/premium.component.ts b/apps/browser/src/popup/settings/premium.component.ts index 5c179a12d72..459cd2a6cb2 100644 --- a/apps/browser/src/popup/settings/premium.component.ts +++ b/apps/browser/src/popup/settings/premium.component.ts @@ -4,6 +4,7 @@ import { Component } from "@angular/core"; import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -24,9 +25,18 @@ export class PremiumComponent extends BasePremiumComponent { logService: LogService, private location: Location, private currencyPipe: CurrencyPipe, - dialogService: DialogServiceAbstraction + dialogService: DialogServiceAbstraction, + environmentService: EnvironmentService ) { - super(i18nService, platformUtilsService, apiService, logService, stateService, dialogService); + super( + i18nService, + platformUtilsService, + apiService, + logService, + stateService, + dialogService, + environmentService + ); // Support old price string. Can be removed in future once all translations are properly updated. const thePrice = this.currencyPipe.transform(this.price, "$"); diff --git a/apps/desktop/src/vault/app/accounts/premium.component.ts b/apps/desktop/src/vault/app/accounts/premium.component.ts index 13116fd3ed4..fd275d6ed7d 100644 --- a/apps/desktop/src/vault/app/accounts/premium.component.ts +++ b/apps/desktop/src/vault/app/accounts/premium.component.ts @@ -3,6 +3,7 @@ import { Component } from "@angular/core"; import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -19,8 +20,17 @@ export class PremiumComponent extends BasePremiumComponent { apiService: ApiService, logService: LogService, stateService: StateService, - dialogService: DialogServiceAbstraction + dialogService: DialogServiceAbstraction, + environmentService: EnvironmentService ) { - super(i18nService, platformUtilsService, apiService, logService, stateService, dialogService); + super( + i18nService, + platformUtilsService, + apiService, + logService, + stateService, + dialogService, + environmentService + ); } } diff --git a/apps/web/src/app/billing/settings/subscription-routing.module.ts b/apps/web/src/app/billing/settings/subscription-routing.module.ts index 35b98b75d6a..43c7a6d7222 100644 --- a/apps/web/src/app/billing/settings/subscription-routing.module.ts +++ b/apps/web/src/app/billing/settings/subscription-routing.module.ts @@ -4,7 +4,7 @@ import { RouterModule, Routes } from "@angular/router"; import { BillingHistoryViewComponent } from "../../billing/settings/billing-history-view.component"; import { PaymentMethodComponent } from "../../billing/settings/payment-method.component"; import { UserSubscriptionComponent } from "../../billing/settings/user-subscription.component"; -import { PremiumComponent } from "../../settings/premium.component"; +import { PremiumComponent } from "../../vault/settings/premium.component"; import { SubscriptionComponent } from "./subscription.component"; diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts index 74a422d3b21..0acb456a41e 100644 --- a/apps/web/src/app/shared/loose-components.module.ts +++ b/apps/web/src/app/shared/loose-components.module.ts @@ -81,7 +81,6 @@ import { DeleteAccountComponent } from "../settings/delete-account.component"; import { DomainRulesComponent } from "../settings/domain-rules.component"; import { LowKdfComponent } from "../settings/low-kdf.component"; import { PreferencesComponent } from "../settings/preferences.component"; -import { PremiumComponent } from "../settings/premium.component"; import { ProfileComponent } from "../settings/profile.component"; import { PurgeVaultComponent } from "../settings/purge-vault.component"; import { SecurityKeysComponent } from "../settings/security-keys.component"; @@ -107,6 +106,7 @@ import { ShareComponent } from "../vault/individual-vault/share.component"; import { AddEditComponent as OrgAddEditComponent } from "../vault/org-vault/add-edit.component"; import { AttachmentsComponent as OrgAttachmentsComponent } from "../vault/org-vault/attachments.component"; import { CollectionsComponent as OrgCollectionsComponent } from "../vault/org-vault/collections.component"; +import { PremiumComponent } from "../vault/settings/premium.component"; import { EnvironmentSelectorModule } from "./../components/environment-selector/environment-selector.module"; import { AccountFingerprintComponent } from "./components/account-fingerprint/account-fingerprint.component"; diff --git a/apps/web/src/app/settings/premium.component.html b/apps/web/src/app/vault/settings/premium.component.html similarity index 98% rename from apps/web/src/app/settings/premium.component.html rename to apps/web/src/app/vault/settings/premium.component.html index 3c7fadd86ff..b47bfc1be2b 100644 --- a/apps/web/src/app/settings/premium.component.html +++ b/apps/web/src/app/vault/settings/premium.component.html @@ -54,7 +54,7 @@

; @@ -39,9 +41,11 @@ export class PremiumComponent implements OnInit { private messagingService: MessagingService, private syncService: SyncService, private logService: LogService, - private stateService: StateService + private stateService: StateService, + private environmentService: EnvironmentService ) { this.selfHosted = platformUtilsService.isSelfHost(); + this.cloudWebVaultUrl = this.environmentService.getCloudWebVaultUrl(); } async ngOnInit() { diff --git a/libs/angular/src/vault/components/premium.component.ts b/libs/angular/src/vault/components/premium.component.ts index af66db7f4b6..b13cfa428d3 100644 --- a/libs/angular/src/vault/components/premium.component.ts +++ b/libs/angular/src/vault/components/premium.component.ts @@ -1,6 +1,7 @@ import { Directive, OnInit } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -13,6 +14,7 @@ export class PremiumComponent implements OnInit { isPremium = false; price = 10; refreshPromise: Promise; + cloudWebVaultUrl: string; constructor( protected i18nService: I18nService, @@ -20,8 +22,11 @@ export class PremiumComponent implements OnInit { protected apiService: ApiService, private logService: LogService, protected stateService: StateService, - protected dialogService: DialogServiceAbstraction - ) {} + protected dialogService: DialogServiceAbstraction, + private environmentService: EnvironmentService + ) { + this.cloudWebVaultUrl = this.environmentService.getCloudWebVaultUrl(); + } async ngOnInit() { this.isPremium = await this.stateService.getCanAccessPremium(); @@ -46,7 +51,7 @@ export class PremiumComponent implements OnInit { }); if (confirmed) { - this.platformUtilsService.launchUri("https://vault.bitwarden.com/#/?premium=purchase"); + this.platformUtilsService.launchUri(`${this.cloudWebVaultUrl}/#/?premium=purchase`); } } @@ -58,7 +63,7 @@ export class PremiumComponent implements OnInit { }); if (confirmed) { - this.platformUtilsService.launchUri("https://vault.bitwarden.com/#/?premium=manage"); + this.platformUtilsService.launchUri(`${this.cloudWebVaultUrl}/#/?premium=manage`); } } } From 3eab038a879f3855927bac10f223c795e751b025 Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Wed, 9 Aug 2023 16:18:58 -0400 Subject: [PATCH 258/299] PM-2286 Master Password Reprompt on Attachments Option (#5844) * if master password reprompt is enabled the passwordRepromptModal will appear on attachments option in both individual and organization --- .../vault/individual-vault/vault.component.ts | 17 ++++++++++++----- .../src/app/vault/org-vault/vault.component.ts | 13 ++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts index 00e26b305de..70149cc0026 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -498,6 +498,11 @@ export class VaultComponent implements OnInit, OnDestroy { } async editCipherAttachments(cipher: CipherView) { + if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + this.go({ cipherId: null, itemId: null }); + return; + } + const canAccessPremium = await this.stateService.getCanAccessPremium(); if (cipher.organizationId == null && !canAccessPremium) { this.messagingService.send("premiumRequired"); @@ -539,6 +544,10 @@ export class VaultComponent implements OnInit, OnDestroy { } async shareCipher(cipher: CipherView) { + if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + this.go({ cipherId: null, itemId: null }); + return; + } const [modal] = await this.modalService.openViewRef( ShareComponent, this.shareModalRef, @@ -595,11 +604,9 @@ export class VaultComponent implements OnInit, OnDestroy { async editCipherId(id: string) { const cipher = await this.cipherService.get(id); - if (cipher != null && cipher.reprompt != 0) { - if (!(await this.passwordRepromptService.showPasswordPrompt())) { - this.go({ cipherId: null, itemId: null }); - return; - } + if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + this.go({ cipherId: null, itemId: null }); + return; } const [modal, childComponent] = await this.modalService.openViewRef( diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index 63f92e64eae..8370b78cdc3 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -517,6 +517,11 @@ export class VaultComponent implements OnInit, OnDestroy { } async editCipherAttachments(cipher: CipherView) { + if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + this.go({ cipherId: null, itemId: null }); + return; + } + if (this.organization.maxStorageGb == null || this.organization.maxStorageGb === 0) { this.messagingService.send("upgradeOrganization", { organizationId: cipher.organizationId }); return; @@ -595,11 +600,9 @@ export class VaultComponent implements OnInit, OnDestroy { additionalComponentParameters?: (comp: AddEditComponent) => void ) { const cipher = await this.cipherService.get(cipherId); - if (cipher != null && cipher.reprompt != 0) { - if (!(await this.passwordRepromptService.showPasswordPrompt())) { - this.go({ cipherId: null, itemId: null }); - return; - } + if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + this.go({ cipherId: null, itemId: null }); + return; } const defaultComponentParameters = (comp: AddEditComponent) => { From 2187db2153ec7676dc7e1104ee10e0040782b807 Mon Sep 17 00:00:00 2001 From: Danielle Flinn <43477473+danielleflinn@users.noreply.github.com> Date: Thu, 10 Aug 2023 14:41:45 -0700 Subject: [PATCH 259/299] removed tw-uppercase from dialog title (#6008) --- libs/components/src/dialog/dialog/dialog.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/components/src/dialog/dialog/dialog.component.html b/libs/components/src/dialog/dialog/dialog.component.html index 773b764b22e..b052cc23b66 100644 --- a/libs/components/src/dialog/dialog/dialog.component.html +++ b/libs/components/src/dialog/dialog/dialog.component.html @@ -6,7 +6,7 @@
-

+

+ + - - - + + + + diff --git a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts index 6309a5a8c6a..d8824cd7dd4 100644 --- a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts +++ b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts @@ -1,5 +1,6 @@ import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; import { Component, Inject } from "@angular/core"; +import { FormGroup } from "@angular/forms"; import { SimpleDialogType, @@ -29,8 +30,8 @@ const DEFAULT_COLOR: Record = { templateUrl: "./simple-configurable-dialog.component.html", }) export class SimpleConfigurableDialogComponent { - SimpleDialogType = SimpleDialogType; - SimpleDialogCloseType = SimpleDialogCloseType; + protected SimpleDialogType = SimpleDialogType; + protected SimpleDialogCloseType = SimpleDialogCloseType; get iconClasses() { return [ @@ -39,12 +40,13 @@ export class SimpleConfigurableDialogComponent { ]; } - title: string; - content: string; - acceptButtonText: string; - cancelButtonText: string; + protected title: string; + protected content: string; + protected acceptButtonText: string; + protected cancelButtonText: string; + protected formGroup = new FormGroup({}); - showCancelButton = this.simpleDialogOpts.cancelButtonText !== null; + protected showCancelButton = this.simpleDialogOpts.cancelButtonText !== null; constructor( public dialogRef: DialogRef, @@ -54,6 +56,14 @@ export class SimpleConfigurableDialogComponent { this.localizeText(); } + protected accept = async () => { + if (this.simpleDialogOpts.acceptAction) { + await this.simpleDialogOpts.acceptAction(); + } + + this.dialogRef.close(SimpleDialogCloseType.ACCEPT); + }; + private localizeText() { this.title = this.translate(this.simpleDialogOpts.title); this.content = this.translate(this.simpleDialogOpts.content); diff --git a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts index 998749da84f..0982db1ca7a 100644 --- a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts +++ b/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts @@ -15,96 +15,17 @@ import { DialogModule } from "../dialog.module"; @Component({ template: ` -

Dialog Type Examples:

-
- - - - - - - - - -
- -

Custom Button Examples:

-
- - - - - -
- -

Custom Icon Example:

-
- -
- -

Additional Examples:

-
- +
+

{{ group.title }}

+
+ +
@@ -113,72 +34,93 @@ import { DialogModule } from "../dialog.module"; `, }) class StoryDialogComponent { - primaryLocalizedSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("primaryTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, - }; - - successLocalizedSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("successTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.SUCCESS, - }; - - infoLocalizedSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("infoTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.INFO, - }; - - warningLocalizedSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("warningTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.WARNING, - }; - - dangerLocalizedSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("dangerTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.DANGER, - }; - - primarySingleBtnSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("primaryTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, - acceptButtonText: "Ok", - cancelButtonText: null, - }; - - primaryCustomBtnsSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("primaryTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, - acceptButtonText: this.i18nService.t("accept"), - cancelButtonText: this.i18nService.t("decline"), - }; - - primaryAcceptBtnOverrideSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("primaryTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, - acceptButtonText: "Ok", - }; - - primaryCustomIconSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("primaryTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, - icon: "bwi-family", - }; - - primaryDisableCloseSimpleDialogOpts: SimpleDialogOptions = { - title: this.i18nService.t("primaryTypeSimpleDialog"), - content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, - disableClose: true, - }; + protected dialogs: { title: string; dialogs: SimpleDialogOptions[] }[] = [ + { + title: "Regular", + dialogs: [ + { + title: this.i18nService.t("primaryTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.PRIMARY, + }, + { + title: this.i18nService.t("successTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.SUCCESS, + }, + { + title: this.i18nService.t("infoTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.INFO, + }, + { + title: this.i18nService.t("warningTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.WARNING, + }, + { + title: this.i18nService.t("dangerTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.DANGER, + }, + ], + }, + { + title: "Custom", + dialogs: [ + { + title: this.i18nService.t("primaryTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.PRIMARY, + acceptButtonText: "Ok", + cancelButtonText: null, + }, + { + title: this.i18nService.t("primaryTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.PRIMARY, + acceptButtonText: this.i18nService.t("accept"), + cancelButtonText: this.i18nService.t("decline"), + }, + { + title: this.i18nService.t("primaryTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.PRIMARY, + acceptButtonText: "Ok", + }, + ], + }, + { + title: "Icon", + dialogs: [ + { + title: this.i18nService.t("primaryTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.PRIMARY, + icon: "bwi-family", + }, + ], + }, + { + title: "Additional", + dialogs: [ + { + title: this.i18nService.t("primaryTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + type: SimpleDialogType.PRIMARY, + disableClose: true, + }, + { + title: this.i18nService.t("asyncTypeSimpleDialog"), + content: this.i18nService.t("dialogContent"), + acceptAction: () => { + return new Promise((resolve) => setTimeout(resolve, 10000)); + }, + type: SimpleDialogType.PRIMARY, + }, + ], + }, + ]; showCallout = false; calloutType = "info"; @@ -216,6 +158,7 @@ export default { infoTypeSimpleDialog: "Info Type Simple Dialog", warningTypeSimpleDialog: "Warning Type Simple Dialog", dangerTypeSimpleDialog: "Danger Type Simple Dialog", + asyncTypeSimpleDialog: "Async", dialogContent: "Dialog content goes here", yes: "Yes", no: "No", From 3880aeed81944671e931a40b03e78f1fa689f9cf Mon Sep 17 00:00:00 2001 From: Justin Baur <19896123+justindbaur@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:04:44 -0400 Subject: [PATCH 261/299] Bump Firefox Min Version (#6025) * Bump Firefox Min Version * Remove Version Check for Biometrics Support --- apps/browser/src/manifest.json | 2 +- apps/browser/src/manifest.v3.json | 2 +- .../src/platform/services/browser-platform-utils.service.ts | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index a23032ae6a2..905c9abfbe9 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -105,7 +105,7 @@ "applications": { "gecko": { "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}", - "strict_min_version": "42.0" + "strict_min_version": "91.0" } }, "sidebar_action": { diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 9a742e64e48..145b9516b89 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -113,7 +113,7 @@ "applications": { "gecko": { "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}", - "strict_min_version": "42.0" + "strict_min_version": "91.0" } }, "sidebar_action": { diff --git a/apps/browser/src/platform/services/browser-platform-utils.service.ts b/apps/browser/src/platform/services/browser-platform-utils.service.ts index 79c52d615fb..018b1c623dc 100644 --- a/apps/browser/src/platform/services/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/browser-platform-utils.service.ts @@ -314,10 +314,6 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService return false; } - if (this.isFirefox()) { - return parseInt((await browser.runtime.getBrowserInfo()).version.split(".")[0], 10) >= 87; - } - return true; } From d16e588d61d3d20298d12e2a6b02a8b708bfb4e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 16:44:47 +0000 Subject: [PATCH 262/299] Autosync the updated translations (#6012) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/af/messages.json | 14 ++++++-------- apps/desktop/src/locales/ar/messages.json | 16 +++++++--------- apps/desktop/src/locales/az/messages.json | 14 ++++++-------- apps/desktop/src/locales/be/messages.json | 14 ++++++-------- apps/desktop/src/locales/bg/messages.json | 14 ++++++-------- apps/desktop/src/locales/bn/messages.json | 14 ++++++-------- apps/desktop/src/locales/bs/messages.json | 14 ++++++-------- apps/desktop/src/locales/ca/messages.json | 14 ++++++-------- apps/desktop/src/locales/cs/messages.json | 14 ++++++-------- apps/desktop/src/locales/cy/messages.json | 14 ++++++-------- apps/desktop/src/locales/da/messages.json | 14 ++++++-------- apps/desktop/src/locales/de/messages.json | 20 +++++++++----------- apps/desktop/src/locales/el/messages.json | 14 ++++++-------- apps/desktop/src/locales/en_GB/messages.json | 14 ++++++-------- apps/desktop/src/locales/en_IN/messages.json | 14 ++++++-------- apps/desktop/src/locales/eo/messages.json | 14 ++++++-------- apps/desktop/src/locales/es/messages.json | 14 ++++++-------- apps/desktop/src/locales/et/messages.json | 14 ++++++-------- apps/desktop/src/locales/eu/messages.json | 14 ++++++-------- apps/desktop/src/locales/fa/messages.json | 14 ++++++-------- apps/desktop/src/locales/fi/messages.json | 14 ++++++-------- apps/desktop/src/locales/fil/messages.json | 14 ++++++-------- apps/desktop/src/locales/fr/messages.json | 14 ++++++-------- apps/desktop/src/locales/gl/messages.json | 14 ++++++-------- apps/desktop/src/locales/he/messages.json | 14 ++++++-------- apps/desktop/src/locales/hi/messages.json | 14 ++++++-------- apps/desktop/src/locales/hr/messages.json | 14 ++++++-------- apps/desktop/src/locales/hu/messages.json | 14 ++++++-------- apps/desktop/src/locales/id/messages.json | 14 ++++++-------- apps/desktop/src/locales/it/messages.json | 14 ++++++-------- apps/desktop/src/locales/ja/messages.json | 14 ++++++-------- apps/desktop/src/locales/ka/messages.json | 14 ++++++-------- apps/desktop/src/locales/km/messages.json | 14 ++++++-------- apps/desktop/src/locales/kn/messages.json | 14 ++++++-------- apps/desktop/src/locales/ko/messages.json | 14 ++++++-------- apps/desktop/src/locales/lv/messages.json | 14 ++++++-------- apps/desktop/src/locales/me/messages.json | 14 ++++++-------- apps/desktop/src/locales/ml/messages.json | 14 ++++++-------- apps/desktop/src/locales/mr/messages.json | 14 ++++++-------- apps/desktop/src/locales/my/messages.json | 14 ++++++-------- apps/desktop/src/locales/nb/messages.json | 14 ++++++-------- apps/desktop/src/locales/ne/messages.json | 14 ++++++-------- apps/desktop/src/locales/nl/messages.json | 14 ++++++-------- apps/desktop/src/locales/nn/messages.json | 14 ++++++-------- apps/desktop/src/locales/or/messages.json | 14 ++++++-------- apps/desktop/src/locales/pl/messages.json | 14 ++++++-------- apps/desktop/src/locales/pt_BR/messages.json | 14 ++++++-------- apps/desktop/src/locales/pt_PT/messages.json | 14 ++++++-------- apps/desktop/src/locales/ro/messages.json | 14 ++++++-------- apps/desktop/src/locales/ru/messages.json | 14 ++++++-------- apps/desktop/src/locales/si/messages.json | 14 ++++++-------- apps/desktop/src/locales/sk/messages.json | 14 ++++++-------- apps/desktop/src/locales/sl/messages.json | 14 ++++++-------- apps/desktop/src/locales/sr/messages.json | 14 ++++++-------- apps/desktop/src/locales/sv/messages.json | 14 ++++++-------- apps/desktop/src/locales/te/messages.json | 14 ++++++-------- apps/desktop/src/locales/th/messages.json | 14 ++++++-------- apps/desktop/src/locales/tr/messages.json | 14 ++++++-------- apps/desktop/src/locales/uk/messages.json | 14 ++++++-------- apps/desktop/src/locales/vi/messages.json | 14 ++++++-------- apps/desktop/src/locales/zh_CN/messages.json | 14 ++++++-------- apps/desktop/src/locales/zh_TW/messages.json | 14 ++++++-------- 62 files changed, 376 insertions(+), 500 deletions(-) diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 59d7ef9c25d..5913597ee88 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Aanbevole bywerking van instellings" }, - "region": { - "message": "Streek" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "VS", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Selghehuisves" diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index 9012f6ee1ff..a65781e73d4 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -2252,21 +2252,19 @@ "windowsBiometricUpdateWarningTitle": { "message": "تحديث الإعدادات الموصى بها" }, - "region": { - "message": "المنطقة" + "loggingInOn": { + "message": "جارٍ تسجيل الدخول" }, - "eu": { - "message": "الاتحاد الأوروبي", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "الولايات المتحدة", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "استضافة ذاتية" }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "غير مسموح بالدخول. ليس لديك الصلاحية لعرض هذه الصفحة." } } diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 965db4209db..3d1608a5490 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Tövsiyə edilən Tənzimləmələr Güncəlləməsi" }, - "region": { - "message": "Bölgə" + "loggingInOn": { + "message": "Giriş edilir" }, - "eu": { - "message": "AB", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ABŞ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Öz-özünə sahiblik edən" diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 1075fbe6da0..c8f182caeb0 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Рэкамендаваныя налады абнаўлення" }, - "region": { - "message": "Рэгіён" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "ЕС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ЗША", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Уласнае размяшчэнне" diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index 95231adb19a..27a7a85fc24 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Препоръчителна промяна на настройките" }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Вписване в" }, - "eu": { - "message": "ЕС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "САЩ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Собствен хостинг" diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 93d0c273940..1c33383916c 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index eabfc7f8067..61ea872f9aa 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index 5429a271a2a..e098741ff5d 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Actualització de configuració recomanada" }, - "region": { - "message": "Regió" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Autoallotjat" diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index d09e9809aad..8cef76fbe57 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Aktualizace doporučených nastavení" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Přihlašování na" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Vlastní hosting" diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index fda5cea1451..9c182c1aeeb 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Anbefalet indstillingsopdatering" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logger ind på" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Selv-hostet" diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index fb470cc11ed..bf9ce7fe4a8 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -491,7 +491,7 @@ "message": "Ordner gelöscht" }, "loginOrCreateNewAccount": { - "message": "Einloggen oder einen neuen Account erstellen, um auf den Tresor zuzugreifen." + "message": "Melde dich an oder erstelle ein neues Konto, um auf deinen Tresor zuzugreifen." }, "createAccount": { "message": "Konto erstellen" @@ -615,7 +615,7 @@ } }, "rememberMe": { - "message": "Eingeloggt bleiben" + "message": "Angemeldet bleiben" }, "sendVerificationCodeEmailAgain": { "message": "E-Mail mit Bestätigungscode erneut versenden" @@ -824,7 +824,7 @@ "message": "Entsperren" }, "loggedInAsOn": { - "message": "Eingeloggt als $EMAIL$ auf $HOSTNAME$.", + "message": "Angemeldet als $EMAIL$ auf $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Empfohlene Aktualisierung der Einstellungen" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Anmelden bei" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Selbst gehostet" diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index d6c8d1e50c3..43f20a5f21d 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Ενημέρωση Προτεινόμενων Ρυθμίσεων" }, - "region": { - "message": "Περιοχή" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "ΕΕ", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ΗΠΑ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 6a679b10417..428d6910662 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 637e752218d..d40c23fda48 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 1ece91c1e15..e72cd6515ea 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index c86bde31e87..9e31f09379a 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Actualización de ajustes recomendados" }, - "region": { - "message": "Región" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "Unión Europea", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EE.UU.", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Autoalojado" diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index c2757bab62c..2b74589df25 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index b308429cec1..b2f553bbf35 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 65af270448b..655d016c0f1 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "به‌روز رسانی تنظیمات توصیه شده" }, - "region": { - "message": "منطقه" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "اروپا", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "امریکا", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "خود میزبان" diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 6f28c0c9afd..ac4e0ad6c68 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Suositeltava asetusmuutos" }, - "region": { - "message": "Alue" + "loggingInOn": { + "message": "Kirjaudutaan sijaintiin" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Itse ylläpidetty" diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 590d96aeb8d..99719bd9c78 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 15c54705fa6..15c77a1a49b 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Une mise à jour des paramètres est recommandée" }, - "region": { - "message": "Région" + "loggingInOn": { + "message": "Connexion sur" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Auto-hébergé" diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 46f39122f14..e804caddc6f 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index 1b1a8a1b8e5..c8e4e16e954 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 23b4bebbabb..042af715e53 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index b1897f6e4b8..74745499079 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Ajánlott beállítások frissítése" }, - "region": { - "message": "Régió" + "loggingInOn": { + "message": "Bejelentkezés:" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Saját kiszolgáló" diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index c4a8b77566c..21bbdd12c36 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index fbbcb2f08c1..3e977e9f200 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Aggiornamento delle impostazioni consigliato" }, - "region": { - "message": "Regione" + "loggingInOn": { + "message": "Accedendo su" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index 6e89627a5e9..155af2e5259 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "設定の更新を推奨" }, - "region": { - "message": "リージョン" + "loggingInOn": { + "message": "ログイン先" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "米国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "自己ホスト型" diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 0d1ea3265af..24833fa4383 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 2699d1797d9..87dad22d31e 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index fe5d4dec7ff..961e3cf593c 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Ieteicamie iestatījumu atjauninājumi" }, - "region": { - "message": "Apgabals" + "loggingInOn": { + "message": "Piesakās" }, - "eu": { - "message": "ES", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ASV", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Pašizvietots" diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index 98bb03ef7d4..63e8c9bfa2e 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 18292129999..94d2c8f37c5 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index ceeb67d0f74..69b25d3e763 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index 9123788514f..85683848236 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 9e7834e88f1..257c86c4c34 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Aanbevolen instellingen" }, - "region": { - "message": "Regio" + "loggingInOn": { + "message": "Inloggen op" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Zelfgehost" diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index d0750b4d2c1..e80dc037e49 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index 02495ffc371..d0a30e5e327 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 2cd26384181..68c3bec739f 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Aktualizacja ustawień zalecanych" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logowanie do" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Samodzielnie hostowany" diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 6db0402ba44..6af040aa65a 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 820b3810635..523af403436 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Atualização de definições recomendadas" }, - "region": { - "message": "Região" + "loggingInOn": { + "message": "A iniciar sessão em" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Auto-hospedado" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index e0babc049c9..2ea79931dfd 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 0dfccf048be..4ee6c0146a2 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Рекомендуемое обновление настроек" }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Войти на" }, - "eu": { - "message": "Европа", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Собственный хостинг" diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 7fe72ca1226..dd521ed5e5d 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 30418ea8ca6..752ef8e44fb 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Odporúčaná aktualizácia nastavenia" }, - "region": { - "message": "Región" + "loggingInOn": { + "message": "Prihlásenie na" }, - "eu": { - "message": "EÚ", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Vlastný hosting" diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 5d4f40ed148..2dd3e77b911 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index cea5d01ff98..e77a89fe2c7 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Препоручено ажурирање поставки" }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Пријављено на" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Личан хостинг" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index 7eae768b776..01fe1731e00 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logga in på" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index ed828fa2255..ede96425e9c 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index 45c05455bae..7221191a142 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index 9e98dbee2c3..340dfd753ab 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Önerilen Ayarlar Güncellemesi" }, - "region": { - "message": "Bölge" + "loggingInOn": { + "message": "Giriş yapılan konum" }, - "eu": { - "message": "AB", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ABD", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Barındırılan" diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index ed4da8b553a..5b9afdc1000 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Оновлення рекомендованих налаштувань" }, - "region": { - "message": "Регіон" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "ЄС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Власне розміщення" diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index e8b951fd61a..6f69be27586 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "Self-hosted" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 22167a606d1..8e03d9521fe 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "推荐的设置更新" }, - "region": { - "message": "区域" + "loggingInOn": { + "message": "登录到" }, - "eu": { - "message": "欧盟", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "美国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "自托管" diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 104402b5d10..bf0ce480427 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -2252,16 +2252,14 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, - "region": { - "message": "區域" + "loggingInOn": { + "message": "Logging in on" }, - "eu": { - "message": "歐洲 (EU)", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "美國 (US)", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "selfHosted": { "message": "自建" From 419cd9b62bf0444aa430fc3c9438ab52dadfaa3f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 17:09:40 +0000 Subject: [PATCH 263/299] Autosync the updated translations (#6013) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 70 ++++++++++--------- apps/browser/src/_locales/az/messages.json | 24 ++++--- apps/browser/src/_locales/be/messages.json | 20 +++--- apps/browser/src/_locales/bg/messages.json | 20 +++--- apps/browser/src/_locales/bn/messages.json | 20 +++--- apps/browser/src/_locales/bs/messages.json | 20 +++--- apps/browser/src/_locales/ca/messages.json | 20 +++--- apps/browser/src/_locales/cs/messages.json | 20 +++--- apps/browser/src/_locales/cy/messages.json | 20 +++--- apps/browser/src/_locales/da/messages.json | 20 +++--- apps/browser/src/_locales/de/messages.json | 30 ++++---- apps/browser/src/_locales/el/messages.json | 20 +++--- apps/browser/src/_locales/en_GB/messages.json | 20 +++--- apps/browser/src/_locales/en_IN/messages.json | 20 +++--- apps/browser/src/_locales/es/messages.json | 20 +++--- apps/browser/src/_locales/et/messages.json | 20 +++--- apps/browser/src/_locales/eu/messages.json | 20 +++--- apps/browser/src/_locales/fa/messages.json | 20 +++--- apps/browser/src/_locales/fi/messages.json | 20 +++--- apps/browser/src/_locales/fil/messages.json | 20 +++--- apps/browser/src/_locales/fr/messages.json | 20 +++--- apps/browser/src/_locales/gl/messages.json | 20 +++--- apps/browser/src/_locales/he/messages.json | 20 +++--- apps/browser/src/_locales/hi/messages.json | 20 +++--- apps/browser/src/_locales/hr/messages.json | 20 +++--- apps/browser/src/_locales/hu/messages.json | 20 +++--- apps/browser/src/_locales/id/messages.json | 20 +++--- apps/browser/src/_locales/it/messages.json | 20 +++--- apps/browser/src/_locales/ja/messages.json | 20 +++--- apps/browser/src/_locales/ka/messages.json | 20 +++--- apps/browser/src/_locales/km/messages.json | 20 +++--- apps/browser/src/_locales/kn/messages.json | 20 +++--- apps/browser/src/_locales/ko/messages.json | 20 +++--- apps/browser/src/_locales/lt/messages.json | 28 ++++---- apps/browser/src/_locales/lv/messages.json | 20 +++--- apps/browser/src/_locales/ml/messages.json | 20 +++--- apps/browser/src/_locales/mr/messages.json | 20 +++--- apps/browser/src/_locales/my/messages.json | 20 +++--- apps/browser/src/_locales/nb/messages.json | 20 +++--- apps/browser/src/_locales/ne/messages.json | 20 +++--- apps/browser/src/_locales/nl/messages.json | 20 +++--- apps/browser/src/_locales/nn/messages.json | 20 +++--- apps/browser/src/_locales/or/messages.json | 20 +++--- apps/browser/src/_locales/pl/messages.json | 20 +++--- apps/browser/src/_locales/pt_BR/messages.json | 20 +++--- apps/browser/src/_locales/pt_PT/messages.json | 20 +++--- apps/browser/src/_locales/ro/messages.json | 20 +++--- apps/browser/src/_locales/ru/messages.json | 20 +++--- apps/browser/src/_locales/si/messages.json | 20 +++--- apps/browser/src/_locales/sk/messages.json | 20 +++--- apps/browser/src/_locales/sl/messages.json | 20 +++--- apps/browser/src/_locales/sr/messages.json | 20 +++--- apps/browser/src/_locales/sv/messages.json | 20 +++--- apps/browser/src/_locales/te/messages.json | 20 +++--- apps/browser/src/_locales/th/messages.json | 20 +++--- apps/browser/src/_locales/tr/messages.json | 20 +++--- apps/browser/src/_locales/uk/messages.json | 20 +++--- apps/browser/src/_locales/vi/messages.json | 20 +++--- apps/browser/src/_locales/zh_CN/messages.json | 20 +++--- apps/browser/src/_locales/zh_TW/messages.json | 20 +++--- apps/browser/store/locales/de/copy.resx | 2 +- apps/browser/store/locales/lt/copy.resx | 2 +- 62 files changed, 758 insertions(+), 518 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 0e42d032fbb..bf021b10513 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "تحديث" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "إظهار خيارات قائمة السياق" }, @@ -1444,34 +1450,34 @@ "message": "هل أنت متأكد من أنك تريد استعادة هذا العنصر؟" }, "restoredItem": { - "message": "Item restored" + "message": "تم استعادة العنصر" }, "vaultTimeoutLogOutConfirmation": { - "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" + "message": "سيؤدي تسجيل الخروج إلى إزالة جميع إمكانية الوصول إلى خزنتك ويتطلب المصادقة عبر الإنترنت بعد انتهاء المهلة. هل أنت متأكد من أنك تريد استخدام هذا الإعداد؟" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout action confirmation" + "message": "تأكيد إجراء المهلة" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "التعبئة التلقائية والحفظ" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "تم تعبئة العنصر تلقائياً وحفظ عنوان URI" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "ملء العنصر تلقائياً " }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "تحذير: هذه صفحة HTTP غير آمنة، وأي معلومات تقدمها يمكن رؤيتها وتغييرها من قبل الآخرين. تم حفظ تسجيل الدخول هذا في الأصل على صفحة آمنة (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "هل مازلت ترغب في ملء هذا الدخول؟" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "يتم استضافة النموذج من قبل نطاق مختلف عن عنوان URI الخاص بتسجيل الدخول المحفوظ. اختر موافق للملء التلقائي على أي حال، أو ألغ للتوقف." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "لمنع هذا التحذير في المستقبل، حفظ هذا الرابط، $HOSTNAME$ إلى عنصر تسجيل الدخول الخاص بك Bitwarden لهذا الموقع.", "placeholders": { "hostname": { "content": "$1", @@ -1480,22 +1486,22 @@ } }, "setMasterPassword": { - "message": "Set master password" + "message": "تعيين كلمة مرور رئيسية" }, "currentMasterPass": { - "message": "Current master password" + "message": "كلمة المرور الرئيسية الحالية" }, "newMasterPass": { - "message": "New master password" + "message": "كلمة مرور رئيسية جديدة" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "تأكيد كلمة المرور الرئيسية الجديدة" }, "masterPasswordPolicyInEffect": { - "message": "One or more organization policies require your master password to meet the following requirements:" + "message": "1 - تتطلب سياسة واحدة أو أكثر من سياسات المؤسسة كلمة مرورك الرئيسية لتلبية المتطلبات التالية:" }, "policyInEffectMinComplexity": { - "message": "Minimum complexity score of $SCORE$", + "message": "الحد الأدنى لدرجة التعقيد $SCORE$", "placeholders": { "score": { "content": "$1", @@ -1504,7 +1510,7 @@ } }, "policyInEffectMinLength": { - "message": "Minimum length of $LENGTH$", + "message": "الحد الأدنى لطول $LENGTH$", "placeholders": { "length": { "content": "$1", @@ -1513,16 +1519,16 @@ } }, "policyInEffectUppercase": { - "message": "Contain one or more uppercase characters" + "message": "يحتوي على حرف كبير واحد أو أكثر" }, "policyInEffectLowercase": { - "message": "Contain one or more lowercase characters" + "message": "يحتوي على واحد أو أكثر من الأحرف الصغيرة" }, "policyInEffectNumbers": { - "message": "Contain one or more numbers" + "message": "يحتوي على رقم واحد أو أكثر" }, "policyInEffectSpecial": { - "message": "Contain one or more of the following special characters $CHARS$", + "message": "يحتوي على واحد أو أكثر من الأحرف الخاصة التالية $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -1534,7 +1540,7 @@ "message": "كلمة المرور الرئيسية الجديدة لا تفي بمتطلبات السياسة العامة." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "من خلال تحديد هذا المربع فإنك توافق على ما يلي:" }, "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." @@ -1618,13 +1624,13 @@ "message": "An organization policy is affecting your ownership options." }, "excludedDomains": { - "message": "Excluded domains" + "message": "النطاقات المستبعدة" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "Bitwarden لن يطلب حفظ تفاصيل تسجيل الدخول لهذه النطاقات. يجب عليك تحديث الصفحة حتى تصبح التغييرات سارية المفعول." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ نطاق غير صالح", "placeholders": { "domain": { "content": "$1", @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index cbae4e49090..26d26ac38a2 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Güncəllə" }, + "notificationUnlockDesc": { + "message": "Avto-doldurma tələblərini tamamlamaq üçün Bitwarden anbarınızın kilidini açın." + }, + "notificationUnlock": { + "message": "Kilidi aç" + }, "enableContextMenuItem": { "message": "Konteks menyu seçimlərini göstər" }, @@ -2221,27 +2227,25 @@ } } }, - "region": { - "message": "Bölgə" + "loggingInOn": { + "message": "Giriş edilir" }, "opensInANewWindow": { "message": "Yeni bir pəncərədə açılır" }, - "eu": { - "message": "AB", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ABŞ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Müraciət rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." }, "general": { - "message": "General" + "message": "Ümumi" }, "display": { - "message": "Display" + "message": "Ekran" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 8080b7c8ded..946b2dc5d9d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Абнавіць" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Паказваць параметры кантэкстнага меню" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Рэгіён" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Адкрываць у новым акне" }, - "eu": { - "message": "ЕС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ЗША", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Доступ забаронены. У вас не дастаткова правоў для прагляду гэтай старонкі." diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index a5eda0555c0..04a9f08050d 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Да, нека се обнови сега" }, + "notificationUnlockDesc": { + "message": "Отключете трезора си в Битуорден, за да завършите заявката за автоматично попълване." + }, + "notificationUnlock": { + "message": "Отключване" + }, "enableContextMenuItem": { "message": "Показване на опции в контекстното меню" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Вписване в" }, "opensInANewWindow": { "message": "Отваря се в нов прозорец" }, - "eu": { - "message": "ЕС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "САЩ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Отказан достъп. Нямате право за преглед на страницата." diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index d5f735eae5a..aef8c25bfeb 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "হ্যাঁ, এখনই হালনাগাদ করুন" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index f96678dd6f1..4f85dde0c37 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 2ea5e072025..916eeea79f4 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Actualitza" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostra les opcions del menú contextual" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Regió" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "S'obri en una finestra nova" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Accés denegat. No teniu permís per veure aquesta pàgina." diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 859a8f49a1a..de48e4c237d 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aktualizovat" }, + "notificationUnlockDesc": { + "message": "Pro dokončení požadavku na automatické vyplnění odemkněte Váš trezor na Bitwardenu." + }, + "notificationUnlock": { + "message": "Odemknout" + }, "enableContextMenuItem": { "message": "Zobrazit volby v kontextovém menu" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Přihlašování na" }, "opensInANewWindow": { "message": "Otevře se v novém okně" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Přístup byl odepřen. Nemáte oprávnění k zobrazení této stránky." diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 6a651cad43c..2d0dc622f72 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Diweddaru" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "UDA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Mynediad wedi ei wrthod. Does gennych chi ddim caniatâd i weld y dudalen hon." diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 8c3a4c6856a..58dbe45aec2 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Opdatér" }, + "notificationUnlockDesc": { + "message": "Oplås din Bitwarden boks for at færdiggøre autoudfyldanmodningen." + }, + "notificationUnlock": { + "message": "Oplås" + }, "enableContextMenuItem": { "message": "Vis indstillinger i kontekstmenuen" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logger ind på" }, "opensInANewWindow": { "message": "Åbnes i et nyt vindue" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Adgang nægtet. Nødvendig tilladelse til at se siden mangler." diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 374130ffbc5..d48d1ec04c2 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Du musst dich anmelden oder einen neuen Account erstellen, um auf den Tresor zugreifen zu können." + "message": "Melde dich an oder erstelle ein neues Konto, um auf deinen Tresor zuzugreifen." }, "createAccount": { "message": "Konto erstellen" @@ -294,7 +294,7 @@ "message": "Eintragsinformationen" }, "username": { - "message": "Nutzername" + "message": "Benutzername" }, "password": { "message": "Passwort" @@ -357,7 +357,7 @@ "message": "Entsperren" }, "loggedInAsOn": { - "message": "Eingeloggt als $EMAIL$ auf $HOSTNAME$.", + "message": "Angemeldet als $EMAIL$ auf $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -409,7 +409,7 @@ "message": "1 Stunde" }, "fourHours": { - "message": "4 Stunde" + "message": "4 Stunden" }, "onLocked": { "message": "Wenn System gesperrt" @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aktualisieren" }, + "notificationUnlockDesc": { + "message": "Entsperre deinen Bitwarden Tresor, um die Auto-Ausfüllen-Anfrage abzuschließen." + }, + "notificationUnlock": { + "message": "Entsperren" + }, "enableContextMenuItem": { "message": "Kontextmenüoptionen anzeigen" }, @@ -1582,7 +1588,7 @@ "message": "Desktop-Kommunikation unterbrochen" }, "nativeMessagingWrongUserDesc": { - "message": "Die Desktop-Anwendung ist in ein anderes Konto eingeloggt. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind." + "message": "Die Desktop-Anwendung ist in einem anderen Konto angemeldet. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind." }, "nativeMessagingWrongUserTitle": { "message": "Konten stimmen nicht überein" @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Anmelden bei" }, "opensInANewWindow": { "message": "Wird in einem neuen Fenster geöffnet" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Zugriff verweigert. Du hast keine Berechtigung, diese Seite anzuzeigen." diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 3279937f18f..9a3ab302bce 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ναι, Ενημέρωση Τώρα" }, + "notificationUnlockDesc": { + "message": "Ξεκλειδώστε το θησαυ/κιο Bitwarden σας για να ολοκληρώσετε το αίτημα αυτόματης πλήρωσης." + }, + "notificationUnlock": { + "message": "Ξεκλείδωμα" + }, "enableContextMenuItem": { "message": "Εμφάνιση επιλογών μενού περιβάλλοντος" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Σύνδεση ως" }, "opensInANewWindow": { "message": "Ανοίγει σε νέο παράθυρο" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Δεν επιτρέπεται η πρόσβαση. Δεν έχετε άδεια για να δείτε αυτή τη σελίδα." diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 4efd5dafa50..9627efab01d 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 7b960102d9f..5903b01eb3b 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Yes, update now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 6adc180c988..e9dd0024495 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Actualizar" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostrar las opciones de menú contextuales" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Región" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Abre en una nueva ventana" }, - "eu": { - "message": "Unión Europea", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EE.UU.", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Acceso denegado. No tiene permiso para ver esta página." diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 254c1cefb76..7ae023a60f5 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Jah, uuenda" }, + "notificationUnlockDesc": { + "message": "Ava Bitwardeni hoidla, et automaattäide lõpuni viia." + }, + "notificationUnlock": { + "message": "Lukusta lahti" + }, "enableContextMenuItem": { "message": "Kuva parema kliki menüü valikud" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Piirkond" + "loggingInOn": { + "message": "Sisselogimas kui" }, "opensInANewWindow": { "message": "Avaneb uues aknas" }, - "eu": { - "message": "EL", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Ligipääs keelatud. Sul pole lubatud seda lehekülge vaadata." diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 4523b995642..eaab1c4b4b9 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Eguneratu" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Erakutsi laster-menuko aukerak" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index b938e52a98d..5ebfe79be2b 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "به‌روزرسانی" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "نمایش گزینه‌های منوی زمینه" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "منطقه" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "در پنجره جدید باز می‌شود" }, - "eu": { - "message": "اروپا", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "امریکا", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "دسترسی رد شد. شما اجازه مشاهده این صفحه را ندارید." diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 6fd0ffda2a9..e95aa2bc803 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Päivitä" }, + "notificationUnlockDesc": { + "message": "Viimeistele automaattitäytön pyyntö avaamalla Bitwarden-holvisi lukitus." + }, + "notificationUnlock": { + "message": "Avaa" + }, "enableContextMenuItem": { "message": "Näytä sisältövalikon valinnat" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Alue" + "loggingInOn": { + "message": "Kirjaudutaan sijaintiin" }, "opensInANewWindow": { "message": "Avautuu uudessa ikkunassa" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Pääsy estetty. Sinulla ei ole oikeutta avata sivua." diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 8a23901eb56..c6082c51669 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "I-update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Ipakita ang mga opsyon ng menu ng konteksto" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 37b6bbc0c26..d5216ae72d7 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Mettre à jour" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Déverrouiller" + }, "enableContextMenuItem": { "message": "Afficher les options du menu contextuel" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Région" + "loggingInOn": { + "message": "Connexion sur" }, "opensInANewWindow": { "message": "S'ouvre dans une nouvelle fenêtre" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Accès refusé. Vous n'avez pas l'autorisation de voir cette page." diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 439f3216097..64c8bf51176 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "כן, עדכן עכשיו" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index eb08d59c2af..c91afe71cf3 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Yes, Update Now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "संदर्भ मेनू विकल्प दिखाएं" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 3b01d015d10..65bbc664fdd 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ažuriraj" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Prikaži opcije kotekstualnog izbornika" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index e7b04d0b025..bd106eac48d 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Frissítés" }, + "notificationUnlockDesc": { + "message": "A Bitwarden széf feloldása az automatikus kitöltési kérés teljesítéséhez." + }, + "notificationUnlock": { + "message": "Feloldás" + }, "enableContextMenuItem": { "message": "Helyi menü opciók megjelenítése" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Régió" + "loggingInOn": { + "message": "Bejelentkezés:" }, "opensInANewWindow": { "message": "Megnyitás új ablakban" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "A hozzáférés megtagadásra került. Nincs jogosultság az oldal megtekintésére." diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 84c3938f097..724e8bc30d0 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Iya, Perbarui Sekarang" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 53552ae2ffc..20f338b39e1 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aggiorna" }, + "notificationUnlockDesc": { + "message": "Sblocca la tua cassaforte di Bitwarden per completare la richiesta di riempimento automatico." + }, + "notificationUnlock": { + "message": "Sblocca" + }, "enableContextMenuItem": { "message": "Mostra opzioni nel menu contestuale" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Regione" + "loggingInOn": { + "message": "Accedendo su" }, "opensInANewWindow": { "message": "Si apre in una nuova finestra" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Accesso negato. Non hai i permessi necessari per visualizzare questa pagina." diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 3bfcffd034c..e52752179b7 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "今すぐ更新する" }, + "notificationUnlockDesc": { + "message": "Bitwarden 保管庫をロック解除して自動入力リクエストを完了してください。" + }, + "notificationUnlock": { + "message": "ロック解除" + }, "enableContextMenuItem": { "message": "コンテキストメニューオプションを表示" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "リージョン" + "loggingInOn": { + "message": "ログイン先" }, "opensInANewWindow": { "message": "新しいウィンドウで開く" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "米国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "アクセスが拒否されました。このページを表示する権限がありません。" diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index e13a6c5e038..569277e8e34 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 9cbabce7942..3a9a33dda1a 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "ಹೌದು, ಈಗ ನವೀಕರಿಸಿ" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index c23673320d1..50cadc8a949 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "예, 지금 변경하겠습니다." }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 682cd40c52a..b1dc314612c 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Atnaujinti" }, + "notificationUnlockDesc": { + "message": "Atrakink savo Bitwarden saugyklą, kad užpildytum automatinio užpildymo užklausą." + }, + "notificationUnlock": { + "message": "Atrakinti" + }, "enableContextMenuItem": { "message": "Rodyti kontekstinio meniu pasririnkimus" }, @@ -1537,7 +1543,7 @@ "message": "By checking this box you agree to the following:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Paslaugų teikimo sąlygos ir privatumo politika nebuvo pripažinti." }, "termsOfService": { "message": "Paslaugų teikimo paslaugos" @@ -1552,13 +1558,13 @@ "message": "Gerai" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Darbalaukio sinchronizavimo verifikavimas" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Patikrink, ar darbalaukio programoje rodomas šis pirštų atspaudas: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not set up" + "message": "Naršyklės integracija nėra nustatyta" }, "desktopIntegrationDisabledDesc": { "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "ES", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "JAV", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Prieiga uždrausta. Neturi teisės peržiūrėti šį puslapį." diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 3a13d9872ad..bd42b3bcbbf 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Jā, atjaunināt" }, + "notificationUnlockDesc": { + "message": "Jāatslēdz Bitwarden glabātava, lai pabeigtu automātiskās aizpildīšanas pieprasījumu." + }, + "notificationUnlock": { + "message": "Atslēgt" + }, "enableContextMenuItem": { "message": "Rādīt konteksta izvēlnes iespējas" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Apgabals" + "loggingInOn": { + "message": "Piesakās" }, "opensInANewWindow": { "message": "Atver jaunā logā" }, - "eu": { - "message": "ES", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ASV", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Piekļuve liegta. Nav nepieciešamo atļauju, lai skatītu šo lapu." diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index fd59a7798cb..ad8f6083c22 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "ശരി, ഇപ്പോൾ അപ്ഡേറ്റ് ചെയ്യുക" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 33e843f3b4a..70b41cafbdb 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 596a717c203..0e4904dcd15 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ja, oppdater nå" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Vis alternativer for kontekstmeny" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 130524de47b..7ff5ec8b36b 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ja, nu bijwerken" }, + "notificationUnlockDesc": { + "message": "Ontgrendel je Bitwarden-kluis om het auto-invulverzoek te voltooien." + }, + "notificationUnlock": { + "message": "Ontgrendelen" + }, "enableContextMenuItem": { "message": "Contextmenu-opties weergeven" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Regio" + "loggingInOn": { + "message": "Inloggen op" }, "opensInANewWindow": { "message": "Opent in een nieuw venster" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Toegang geweigerd. Je hebt geen toestemming om deze pagina te bekijken." diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index e5ba19c2442..f010699118b 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Zaktualizuj" }, + "notificationUnlockDesc": { + "message": "Odblokuj swój sejf Bitwarden, aby ukończyć żądanie autouzupełniania." + }, + "notificationUnlock": { + "message": "Odblokuj" + }, "enableContextMenuItem": { "message": "Pokaż opcje menu kontekstowego" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logowanie do" }, "opensInANewWindow": { "message": "Otwiera w nowym oknie" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Odmowa dostępu. Nie masz uprawnień do przeglądania tej strony." diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index abcfbeb9e69..d0370af24e9 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Atualizar" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostrar opções de menu de contexto" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Região" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Abrir em uma nova janela" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Acesso negado. Você não tem permissão para ver esta página." diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index aa2f50b0e00..5254144a08b 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Atualizar" }, + "notificationUnlockDesc": { + "message": "Desbloqueie o seu cofre Bitwarden para completar o pedido de preenchimento automático." + }, + "notificationUnlock": { + "message": "Desbloquear" + }, "enableContextMenuItem": { "message": "Mostrar opções do menu de contexto" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Região" + "loggingInOn": { + "message": "A iniciar sessão em" }, "opensInANewWindow": { "message": "Abrir numa nova janela" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Acesso negado. Não tem permissão para visualizar esta página." diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 5a8879a4bcd..f4369278d64 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Actualizare" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Afișați opțiunile meniului contextual" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 938c35d1c27..f9c9b0141ab 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Обновить" }, + "notificationUnlockDesc": { + "message": "Разблокируйте свое хранилище Bitwarden для завершения запроса автозаполнения." + }, + "notificationUnlock": { + "message": "Разблокировать" + }, "enableContextMenuItem": { "message": "Показать опции контекстного меню" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Войти на" }, "opensInANewWindow": { "message": "Откроется в новом окне" }, - "eu": { - "message": "Европа", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Доступ запрещен. У вас нет разрешения на просмотр этой страницы." diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 5cac9ee12c8..0f209dd000b 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "යාවත්කාල" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 2fdd9c078d1..bccc8a74ce5 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aktualizovať" }, + "notificationUnlockDesc": { + "message": "Odomknite svoj Bitwarden trezor a dokončite žiadosť o automatické vyplnenie." + }, + "notificationUnlock": { + "message": "Odomknúť" + }, "enableContextMenuItem": { "message": "Zobraziť možnosti kontextovej ponuky" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Región" + "loggingInOn": { + "message": "Prihlásenie na" }, "opensInANewWindow": { "message": "Otvárať v novom okne" }, - "eu": { - "message": "EÚ", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Prístup zamietnutý. Nemáte oprávnenie na zobrazenie tejto stránky." diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index e7b9b7b8a71..64f3415ae27 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Da, posodobi zdaj" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Prikaži možnosti kontekstnega menuja" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Odpre se v novem oknu" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 12d1c66da81..38ba6e1a4b1 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ажурирај" }, + "notificationUnlockDesc": { + "message": "Откључати Bitwarden сеф да би извршили ауто-пуњење." + }, + "notificationUnlock": { + "message": "Откључај" + }, "enableContextMenuItem": { "message": "Прикажи контекстни мени" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Пријављено на" }, "opensInANewWindow": { "message": "Отвара се у новом прозору" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Одбијен приступ. Немате дозволу да видите ову страницу." diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 21291110b20..36ebb906412 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Uppdatera" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Visa alternativ för snabbmenyn" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logga in på" }, "opensInANewWindow": { "message": "Öppnas i ett nytt fönster" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 9e46b55f19e..63dd227e52b 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 2b93ace3a04..667c26a1e12 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Yes, Update Now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "แสดงตัวเลือกเมนูบริบท" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index f438c3baa91..23727c5af9a 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Güncelle" }, + "notificationUnlockDesc": { + "message": "Otomatik doldurma isteğini tamamlamak için Bitwarden kasanızın kilidini açın." + }, + "notificationUnlock": { + "message": "Kilidi aç" + }, "enableContextMenuItem": { "message": "Bağlam menüsü seçeneklerini göster" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Bölge" + "loggingInOn": { + "message": "Giriş yapılan konum" }, "opensInANewWindow": { "message": "Yeni pencerede açılır" }, - "eu": { - "message": "AB", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ABD", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Erişim engellendi. Bu sayfayı görüntüleme iznine sahip değilsiniz." diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index f9459c393a5..45177b5bdea 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Оновити" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Показувати в контекстному меню" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Регіон" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Відкривається у новому вікні" }, - "eu": { - "message": "ЄС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Доступ заборонено. У вас немає дозволу на перегляд цієї сторінки." diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 35234feeb38..0bb3aaefb85 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Cập nhật" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Hiển thị tuỳ chọn menu ngữ cảnh" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index e4a970a45d5..4f5d42ef1ad 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "更新" }, + "notificationUnlockDesc": { + "message": "解锁 Bitwarden 密码库以完成自动填充请求。" + }, + "notificationUnlock": { + "message": "解锁​​​​" + }, "enableContextMenuItem": { "message": "显示上下文菜单选项" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "区域" + "loggingInOn": { + "message": "登录到" }, "opensInANewWindow": { "message": "在新窗口中打开" }, - "eu": { - "message": "欧盟", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "美国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "访问被拒绝。您没有权限查看此页面。" diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index e2070bdd316..c7350529d77 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "更新" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "顯示內容選單選項" }, @@ -2221,19 +2227,17 @@ } } }, - "region": { - "message": "區域" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "在新視窗開啟" }, - "eu": { - "message": "歐洲 (EU)", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "美國 (US)", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "拒絕存取。您沒有檢視此頁面的權限。" diff --git a/apps/browser/store/locales/de/copy.resx b/apps/browser/store/locales/de/copy.resx index 026999c3107..139a6026fdf 100644 --- a/apps/browser/store/locales/de/copy.resx +++ b/apps/browser/store/locales/de/copy.resx @@ -139,7 +139,7 @@ Bitwarden bietet Teams und Enterprise Pläne für Unternehmen an, damit du Passw Warum Bitwarden: Weltklasse Verschlüsselung -Passwörter sind durch erweiterte Ende-zu-Ende-Verschlüsselung (AES-256 Bit, salted hashtag und PBKDF2 SHA-256) so bleiben deine Daten sicher und privat. +Passwörter sind durch erweiterte Ende-zu-Ende-Verschlüsselung (AES-256 Bit, salted hashing und PBKDF2 SHA-256) so bleiben deine Daten sicher und privat. Integrierter Passwortgenerator Generiere starke, einzigartige und zufällige Passwörter basierend auf Sicherheitsanforderungen für jede Website, die du häufig besuchst. diff --git a/apps/browser/store/locales/lt/copy.resx b/apps/browser/store/locales/lt/copy.resx index 730bb942e4f..01bd250546f 100644 --- a/apps/browser/store/locales/lt/copy.resx +++ b/apps/browser/store/locales/lt/copy.resx @@ -124,7 +124,7 @@ Saugi ir nemokama slaptažodžių tvarkyklė visiems įrenginiams - „Bitwarden, Inc.“ yra pagrindinė 8bit Solutions LLC įmonė. + Bitwarden, Inc. yra pagrindinė 8bit Solutions LLC įmonė. ĮVARDINTA GERIAUSIU SLAPTAŽODŽIŲ TVARKYTOJU. From 1046cac33c9967dda26e6e84954866faa0f15324 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 12:12:03 +0000 Subject: [PATCH 264/299] Autosync the updated translations (#6014) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 87 +++++++++++++--- apps/web/src/locales/ar/messages.json | 125 ++++++++++++++++------- apps/web/src/locales/az/messages.json | 103 ++++++++++++++----- apps/web/src/locales/be/messages.json | 87 +++++++++++++--- apps/web/src/locales/bg/messages.json | 89 ++++++++++++---- apps/web/src/locales/bn/messages.json | 87 +++++++++++++--- apps/web/src/locales/bs/messages.json | 87 +++++++++++++--- apps/web/src/locales/ca/messages.json | 91 +++++++++++++---- apps/web/src/locales/cs/messages.json | 85 ++++++++++++--- apps/web/src/locales/cy/messages.json | 87 +++++++++++++--- apps/web/src/locales/da/messages.json | 87 +++++++++++++--- apps/web/src/locales/de/messages.json | 97 ++++++++++++++---- apps/web/src/locales/el/messages.json | 87 +++++++++++++--- apps/web/src/locales/en_GB/messages.json | 87 +++++++++++++--- apps/web/src/locales/en_IN/messages.json | 87 +++++++++++++--- apps/web/src/locales/eo/messages.json | 87 +++++++++++++--- apps/web/src/locales/es/messages.json | 87 +++++++++++++--- apps/web/src/locales/et/messages.json | 87 +++++++++++++--- apps/web/src/locales/eu/messages.json | 87 +++++++++++++--- apps/web/src/locales/fa/messages.json | 87 +++++++++++++--- apps/web/src/locales/fi/messages.json | 93 +++++++++++++---- apps/web/src/locales/fil/messages.json | 87 +++++++++++++--- apps/web/src/locales/fr/messages.json | 87 +++++++++++++--- apps/web/src/locales/gl/messages.json | 87 +++++++++++++--- apps/web/src/locales/he/messages.json | 87 +++++++++++++--- apps/web/src/locales/hi/messages.json | 87 +++++++++++++--- apps/web/src/locales/hr/messages.json | 87 +++++++++++++--- apps/web/src/locales/hu/messages.json | 87 +++++++++++++--- apps/web/src/locales/id/messages.json | 87 +++++++++++++--- apps/web/src/locales/it/messages.json | 87 +++++++++++++--- apps/web/src/locales/ja/messages.json | 91 +++++++++++++---- apps/web/src/locales/ka/messages.json | 87 +++++++++++++--- apps/web/src/locales/km/messages.json | 87 +++++++++++++--- apps/web/src/locales/kn/messages.json | 87 +++++++++++++--- apps/web/src/locales/ko/messages.json | 87 +++++++++++++--- apps/web/src/locales/lv/messages.json | 91 +++++++++++++---- apps/web/src/locales/ml/messages.json | 87 +++++++++++++--- apps/web/src/locales/mr/messages.json | 87 +++++++++++++--- apps/web/src/locales/my/messages.json | 87 +++++++++++++--- apps/web/src/locales/nb/messages.json | 87 +++++++++++++--- apps/web/src/locales/ne/messages.json | 87 +++++++++++++--- apps/web/src/locales/nl/messages.json | 85 ++++++++++++--- apps/web/src/locales/nn/messages.json | 87 +++++++++++++--- apps/web/src/locales/or/messages.json | 87 +++++++++++++--- apps/web/src/locales/pl/messages.json | 87 +++++++++++++--- apps/web/src/locales/pt_BR/messages.json | 87 +++++++++++++--- apps/web/src/locales/pt_PT/messages.json | 87 +++++++++++++--- apps/web/src/locales/ro/messages.json | 87 +++++++++++++--- apps/web/src/locales/ru/messages.json | 91 +++++++++++++---- apps/web/src/locales/si/messages.json | 87 +++++++++++++--- apps/web/src/locales/sk/messages.json | 85 ++++++++++++--- apps/web/src/locales/sl/messages.json | 87 +++++++++++++--- apps/web/src/locales/sr/messages.json | 107 ++++++++++++++----- apps/web/src/locales/sr_CS/messages.json | 87 +++++++++++++--- apps/web/src/locales/sv/messages.json | 99 +++++++++++++----- apps/web/src/locales/te/messages.json | 87 +++++++++++++--- apps/web/src/locales/th/messages.json | 87 +++++++++++++--- apps/web/src/locales/tr/messages.json | 87 +++++++++++++--- apps/web/src/locales/uk/messages.json | 91 +++++++++++++---- apps/web/src/locales/vi/messages.json | 87 +++++++++++++--- apps/web/src/locales/zh_CN/messages.json | 109 +++++++++++++++----- apps/web/src/locales/zh_TW/messages.json | 87 +++++++++++++--- 62 files changed, 4410 insertions(+), 1124 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 2b11b7eab71..7b62d7e8932 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "'n Onverwagte fout het voorgekom." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-posadres" }, "yourVaultIsLocked": { "message": "U kluis is vergrendel. Verifieer u hoofwagwoord om voort te gaan." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Ontgrendel" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopieer bevestigingskode" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Waarskuwing" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Kies die invoerlêer se formaat" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Hierdie item het ou lêeraanhegsels wat herstel moet word." }, - "attachmentFixDesc": { - "message": "Dit is ’n ou lêeraanhegsel wat herstel moet word. Klik om meer uit te vind." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Herstel", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Slegs die organisasiekluisitems wat met $ORGANIZATION$ verbind word, word uitgestuur. Persoonlike kluisitems word nie ingesluit nie.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Streek" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "VS", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "U het nie toestemming om hierdie projek te skrap nie", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 2fa2138bd9f..ddcc0fa4765 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -216,17 +216,17 @@ "message": "إظهار / إخفاء" }, "toggleCollapse": { - "message": "Toggle collapse", + "message": "تبديل الطي", "description": "Toggling an expand/collapse state." }, "generatePassword": { "message": "توليد كلمة مرور" }, "checkPassword": { - "message": "Check if password has been exposed." + "message": "تحقق مما إذا تم الكشف عن كلمة المرور." }, "passwordExposed": { - "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "message": "تم الكشف عن كلمة المرور هذه $VALUE$ مرّة (ات) في خروقات البيانات. يجب عليك تغييرها.", "placeholders": { "value": { "content": "$1", @@ -271,29 +271,29 @@ "message": "بحث في المفضلة" }, "searchLogin": { - "message": "Search logins", + "message": "البحث عن تسجيلات الدخول", "description": "Search Login type" }, "searchCard": { - "message": "Search cards", + "message": "البحث عن بطاقات", "description": "Search Card type" }, "searchIdentity": { - "message": "Search identities", + "message": "البحث عن الهويات", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Search secure notes", + "message": "البحث عن ملاحظات آمنة", "description": "Search Secure Note type" }, "searchVault": { "message": "البحث في الخزنة" }, "searchMyVault": { - "message": "Search my vault" + "message": "البحث في خزنتي" }, "searchOrganization": { - "message": "Search organization" + "message": "البحث عن المؤسسة" }, "searchMembers": { "message": "البحث في الأعضاء" @@ -467,7 +467,7 @@ "message": "عناصر الخزنة" }, "filter": { - "message": "Filter" + "message": "تصفية" }, "moveSelectedToOrg": { "message": "نقل العناصر المختارة إلى منظمة" @@ -518,7 +518,7 @@ "message": "تم تعديل العنصر" }, "movedItemToOrg": { - "message": "$ITEMNAME$ moved to $ORGNAME$", + "message": "$ITEMNAME$ انتقل إلى $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -576,7 +576,7 @@ "message": "تم حذف المجلد" }, "editInfo": { - "message": "Edit info" + "message": "تعديل المعلومات" }, "access": { "message": "وصول" @@ -609,7 +609,7 @@ "message": "تسجيل الدخول باستخدام جهاز" }, "loginWithDeviceEnabledNote": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "تسجيل الدخول باستخدام الجهاز يجب أن يتم إعداده في إعدادات تطبيق Bitwarden. هل تحتاج إلى خيار آخر؟" }, "loginWithMasterPassword": { "message": "تسجيل الدخول باستخدام كلمة المرور الرئيسية" @@ -645,10 +645,10 @@ "message": "كلمة المرور الرئيسية" }, "masterPassDesc": { - "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." + "message": "كلمة المرور الرئيسية هي كلمة المرور التي تستخدمها للوصول إلى خزنتك. من المهم جدا ألا تنسى كلمة المرور الرئيسية. لا توجد طريقة لاسترداد كلمة المرور في حال نسيتها." }, "masterPassImportant": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "لا يمكن استعادة كلمة المرور الرئيسية إذا نسيتها!" }, "masterPassHintDesc": { "message": "يمكن أن يساعدك تلميح كلمة المرور الرئيسية في تذكر كلمة المرور الخاصة بك في حال نسيتها." @@ -669,7 +669,7 @@ "message": "تلميح كلمة المرور" }, "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." + "message": "أدخل عنوان البريد الإلكتروني لحسابك للحصول على تلميح كلمة المرور الرئيسية." }, "getMasterPasswordHint": { "message": "احصل على تلميح لكلمة المرور الرئيسية" @@ -687,7 +687,7 @@ "message": "مطلوب إعادة إدخال كلمة المرور الرئيسية." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "كلمة المرور الرئيسية يجب أن تكون على الأقل $VALUE$ حرفاً.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -706,17 +706,23 @@ "message": "تم إنشاء الحساب بنجاح." }, "masterPassSent": { - "message": "We've sent you an email with your master password hint." + "message": "لقد أرسلنا لك رسالة بريد إلكتروني تحتوي على تلميح كلمة المرور الرئيسية." }, "unexpectedError": { "message": "حدث خطأ غير متوقع." }, + "expirationDateError": { + "message": "الرجاء تحديد تاريخ انتهاء الصلاحية في المستقبل." + }, "emailAddress": { "message": "عنوان البريد الإلكتروني" }, "yourVaultIsLocked": { "message": "خزنتك مقفلة. تحقق من كلمة المرور الرئيسية للمتابعة." }, + "uuid": { + "message": "معرف المستخدم الحالي" + }, "unlock": { "message": "إلغاء القفل" }, @@ -737,7 +743,7 @@ "message": "كلمة المرور الرئيسية غير صالحة" }, "invalidFilePassword": { - "message": "Invalid file password, please use the password you entered when you created the export file." + "message": "كلمة مرور الملف غير صالحة، الرجاء استخدام كلمة المرور التي أدخلتها عند إنشاء ملف التصدير." }, "lockNow": { "message": "قفل الآن" @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "نسخ رمز التحقق" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "تحذير" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "حدد تنسيق ملف الاستيراد" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 1a3813eaaa2..baf9cc7de75 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Gözlənilməz bir səhv baş verdi." }, + "expirationDateError": { + "message": "Zəhmət olmasa gələcəkdə son istifadə tarixi seçin." + }, "emailAddress": { "message": "E-poçt ünvanı" }, "yourVaultIsLocked": { "message": "Anbarınız kilidlənib. Davam etmək üçün ana parolunuzu təsdiqləyin." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Kilidi aç" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Təsdiqləmə kodunu kopyala" }, + "copyUuid": { + "message": "UUID-ni kopyala" + }, "warning": { "message": "Xəbərdarlıq" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "İxrac edilən faylın parolu açılarkən xəta baş verdi. Şifrələmə açarınız, verilənlərin ixracında istifadə olunan şifrələmə açarı ilə uyğunlaşmır." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Bir qovluq seçin" + }, + "selectImportCollection": { + "message": "Bir kolleksiya seçin" + }, + "importTargetHint": { + "message": "Daxilə köçürülən fayl məzmununun $DESTINATION$ yerinə daşınmasını istəyirsinizsə bu variantı seçin", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Faylda təyin edilməmiş elementlər var." + }, "selectFormat": { "message": "İdxal faylının formatını seçin" }, @@ -2636,7 +2670,7 @@ "message": "Veb anbar" }, "bitWebVault": { - "message": "Bitwarden Web vault" + "message": "Bitwarden Web anbarı" }, "bitSecretsManager": { "message": "Bitwarden Secrets Manager" @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Bu element, düzəldilməli köhnə fayl qoşmalarını ehtiva edir." }, - "attachmentFixDesc": { - "message": "Bu, düzəldilməli köhnə bir fayl qoşmasıdır. Daha ətraflı öyrənmək üçün klikləyin." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Düzəlt", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Yalnız $ORGANIZATION$ ilə əlaqəli təşkilat anbar elementləri ixrac ediləcək. Şəxsi anbar elementləri və digər təşkilatlardan olan elementlər daxil edilmir.", + "exportingOrganizationVaultDesc": { + "message": "Yalnız $ORGANIZATION$ ilə əlaqələndirilmiş təşkilat anbarı ixrac ediləcək. Fərdi anbardakı və digər təşkilat elementlər daxil edilmir.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Mövcud üzvlərin öz parollarını dəyişdirməsini tələb et" }, - "region": { - "message": "Bölgə" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "AB", - "description": "European Union" - }, - "us": { - "message": "ABŞ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Bu layihəni silmək icazəniz yoxdur", @@ -6825,7 +6854,7 @@ "message": "KDF tənzimləmələrini güncəllə" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Güvənli cihazlar" }, "memberDecryptionTdeDescriptionPartOne": { "message": "Kimlik təsdiqləndikdən sonra üzvlər, cihazlarından saxlanılan açarı istifadə edərək anbar verilənlərinin şifrələrini aça biləcək", @@ -6935,7 +6964,7 @@ "message": "Ana parolu olmayan üzvləri onlar üçün parol tənzimləmədən silmək, tam hesablarına müraciəti məhdudlaşdıra bilər." }, "startYour7DayFreeTrialOfBitwardenFor": { - "message": "Start your 7-Day free trial of Bitwarden for $ORG$", + "message": "$ORG$ üçün Bitwarden 7 günlük ödənişsiz sınağı başladın", "placeholders": { "org": { "content": "$1", @@ -6944,16 +6973,16 @@ } }, "next": { - "message": "Next" + "message": "Növbəti" }, "usFlag": { - "message": "US flag" + "message": "US bayrağı" }, "euFlag": { - "message": "EU flag" + "message": "EU bayrağı" }, "selectedRegionFlag": { - "message": "Selected region flag" + "message": "Seçilmiş bölgə bayrağı" }, "sendsNoItemsTitle": { "message": "Aktiv \"Send\" yoxdur", @@ -6979,7 +7008,7 @@ "message": "For engineering and DevOps teams to manage secrets throughout the software development lifecycle." }, "free2PersonOrganization": { - "message": "Free 2-person Organizations" + "message": "Ödənişsiz 2 nəfərlik Təşkilatlar" }, "unlimitedSecrets": { "message": "Unlimited secrets" @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Əlavə xidmət hesabları" }, - "additionalServiceAccountsDesc": { - "message": "Planınız $COUNT$ xidmət hesabı ilə gəlir. Əlavə xidmət hesablarını ayda $COST$ qarşılığında əlavə edə bilərsiniz.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Aylıq $COST$ qiymətinə əlavə xidmət hesablarını əlavə edə bilərsiniz.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Maksimal mümkün xidmət hesabı qiyməti" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Sonu" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index de48c9cf035..965ca2a12ae 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Адбылася нечаканая памылка." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Адрас электроннай пошты" }, "yourVaultIsLocked": { "message": "Ваша сховішча заблакіравана. Увядзіце асноўны пароль для працягу." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Разблакіраваць" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Скапіяваць праверачны код" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Папярэджанне" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Памылка дэшыфроўкі экспартаванага файла. Ваш ключ шыфравання не супадае з ключом шыфравання, які выкарыстоўваецца для экспартавання даных." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Выберыце фармат файла імпартавання" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Гэты элемент мае старыя далучаныя файлы, якія неабходна выправіць." }, - "attachmentFixDesc": { - "message": "Гэта стары далучаны файл, які неабходна выправіць. Націсніце, каб даведацца больш." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Выправіць", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Будуць экспартаваны толькі запісы сховішча арганізацыі, якія звязаны з $ORGANIZATION$. Элементы асабістага сховішча і элементы з іншых арганізацый не будуць уключаны.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Патрабаваць ад існуючых удзельнікаў змены пароляў" }, - "region": { - "message": "Рэгіён" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "ЕС", - "description": "European Union" - }, - "us": { - "message": "ЗША", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "У вас няма правоў для выдалення гэтага праекта", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Дадатковыя сэрвісныя ўліковыя запісы" }, - "additionalServiceAccountsDesc": { - "message": "Ваш тарыфны план мае наступную колькасць сэрвісных уліковых запісаў: $COUNT$. Вы можаце дадаць дадатковую колькасць сэрвісных уліковых запісаў за $COST$ у месяц.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Максімальны патэнцыйны кошт сэрвісных уліковых запісаў" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index f513bc11aea..19010386404 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Възникна неочаквана грешка." }, + "expirationDateError": { + "message": "Моля, изберете дата на давност, която е в бъдещето." + }, "emailAddress": { "message": "Адрес на електронната поща" }, "yourVaultIsLocked": { "message": "Трезорът е заключен — въведете главната си парола, за да продължите." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Отключване" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Копиране на кода за потвърждаване" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Внимание" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Грешка при дешифрирането на изнесения файл. Ключът за шифриране не отговаря на този, който е използван за изнасянето на данните." }, + "importDestination": { + "message": "Място на внасяне" + }, + "learnAboutImportOptions": { + "message": "Научете повече относно възможностите за внасяне" + }, + "selectImportFolder": { + "message": "Изберете папка" + }, + "selectImportCollection": { + "message": "Изберете колекция" + }, + "importTargetHint": { + "message": "Изберете тази опция, ако искате съдържанието на внесения файл да бъде преместено в $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Файлът съдържа невъзложени елементи." + }, "selectFormat": { "message": "Избор на форма̀та на файла за внасяне" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Този запис съдържа стар, прикачен файл, който трябва да бъде поправен. Натиснете, за да научите повече." }, - "attachmentFixDesc": { - "message": "Този прикачен файл е стар и трябва да бъде поправен. Натиснете, за да научите повече." + "attachmentFixDescription": { + "message": "Този прикачен файл използва остарял метод на шифроване. Избирете „Поправяне“ за да го свалите, пре-шифровате и качите отново." }, "fix": { "message": "Поправяне", @@ -4705,7 +4739,7 @@ "message": "Грешка" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "Управлението на потребителите трябва да бъде дадено заедно с разрешението за Управление на възстановяването на регистрации" }, "setupProvider": { "message": "Настройка на доставчика" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Ще бъдат изнесени само записите от трезора свързан с $ORGANIZATION$. Записите в личния трезор и тези в други организации няма да бъдат включени.", + "exportingOrganizationVaultDesc": { + "message": "Ще бъдат изнесени само записите от трезора свързан с $ORGANIZATION$. Записите в отделните лични трезори и тези в други организации няма да бъдат включени.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Задължаване на текущите членове да сменят паролите си" }, - "region": { - "message": "Регион" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "ЕС", - "description": "European Union" - }, - "us": { - "message": "САЩ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Нямате право за изтриване на този проект", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Допълнителни сервизни акаунти" }, - "additionalServiceAccountsDesc": { - "message": "Планът Ви включва $COUNT$ сервизни акаунта. Можете да добавите още за $COST$ на месец.", + "includedServiceAccounts": { + "message": "В плана Ви са включени $COUNT$ сервизни акаунта.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Може да добавите още сервизни акаунти за $COST$ на месец.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Максимална възможна цена за сервизни акаунти" + }, + "smBetaEndedDesc": { + "message": "Бета-версията на Управлението на тайни приключи на $BETA_ENDING_DATE$. Остават $DAYS$ дни да добавите Управлението на тайни към своя платен абонамент, за да запазите достъпа си до създадените данни. Свържете се с поддръжката, ако искате да добавите Управлението на тайни към абонамента си.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Бета-версията приключва" + }, + "beta": { + "message": "Бета" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 26d1b51d9fc..be5de14b639 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "একটি অপ্রত্যাশিত ত্রুটি ঘটেছে।" }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "ইমেইল ঠিকানা" }, "yourVaultIsLocked": { "message": "আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার মূল পাসওয়ার্ডটি যাচাই করান।" }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "আনলক" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 8d8b073aae4..2780926fbe4 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email adresa" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Otključaj" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 1621adc8337..8f38e86ec2f 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "S'ha produït un error inesperat." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Adreça electrònica" }, "yourVaultIsLocked": { "message": "La caixa forta està bloquejada. Verifiqueu la contrasenya mestra per continuar." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Desbloqueja" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copia el codi de verificació" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Advertiment" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error en desxifrar el fitxer exportat. La vostra clau de xifratge no coincideix amb la clau de xifratge utilitzada per exportar les dades." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Seleccioneu el format del fitxer d'importació" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Aquest element té fitxers adjunts antics que s'han de corregir." }, - "attachmentFixDesc": { - "message": "Es tracta d'un arxiu adjunt antic que cal corregir. Feu clic per obtenir més informació." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Corregeix", @@ -4705,7 +4739,7 @@ "message": "Error" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "L'administració d'usuaris també ha d'estar habilitada amb el permís de recuperació del compte de gestió" }, "setupProvider": { "message": "Configuració del proveïdor" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Només s'exportaran els elements personals de la caixa forta associats a $ORGANIZATION$. Els elements de la caixa forta personal no s'inclouran.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Exigeix que els membres existents canvien les seues contrasenyes" }, - "region": { - "message": "Regió" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "UE", - "description": "European Union" - }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "No teniu permisos per suprimir aquest projecte", @@ -6825,7 +6854,7 @@ "message": "Actualitza la configuració de KDF" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Dispositius de confiança" }, "memberDecryptionTdeDescriptionPartOne": { "message": "Una vegada autenticats, els membres desxifraran les dades de la caixa forta mitjançant una clau emmagatzemada al seu dispositiu. La", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Comptes de serveis addicionals" }, - "additionalServiceAccountsDesc": { - "message": "El vostre pla inclou $COUNT$ comptes de servei. Podeu afegir comptes de servei addicionals per $COST$ al mes.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Cost potencial màxim del compte de servei" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 6a19df3f836..7c9c0968353 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Vyskytla se neočekávaná chyba." }, + "expirationDateError": { + "message": "Zvolte datum vypršení platnosti, které bude v budoucnu." + }, "emailAddress": { "message": "E-mailová adresa" }, "yourVaultIsLocked": { "message": "Váš trezor je uzamčen. Pro pokračování musíte zadat hlavní heslo." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Odemknout" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopírovat ověřovací kód" }, + "copyUuid": { + "message": "Kopírovat UUID" + }, "warning": { "message": "Varování" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Chyba při dešifrování exportovaného souboru. Váš šifrovací klíč se neshoduje s klíčem použitým během exportu dat." }, + "importDestination": { + "message": "Cíl importu" + }, + "learnAboutImportOptions": { + "message": "Více o volbách importu" + }, + "selectImportFolder": { + "message": "Zvolte složku" + }, + "selectImportCollection": { + "message": "Zvolte kolekci" + }, + "importTargetHint": { + "message": "Pokud chcete obsah importovaného souboru přesunout do složky $DESTINATION$, vyberte tuto volbu", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Soubor obsahuje nepřiřazené položky." + }, "selectFormat": { "message": "Vyberte formát importovaného souboru" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Tato položka obsahuje staré přílohy, které vyžadují opravu." }, - "attachmentFixDesc": { - "message": "Tato stará příloha vyžaduje opravu. Klepněte pro více informací." + "attachmentFixDescription": { + "message": "Tato příloha používá zastaralé šifrování. Zvolte \"Opravit\" pro stažení, přešifrování a opětovné nahrání přílohy." }, "fix": { "message": "Opravit", @@ -5429,7 +5463,7 @@ } } }, - "exportingOrganizationVaultDescription": { + "exportingOrganizationVaultDesc": { "message": "Exportován bude jen trezor organizace přidružený k položce $ORGANIZATION$. Osobní položky trezoru a položky z jiných organizací nebudou zahrnuty.", "placeholders": { "organization": { @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Bude vyžadovat od stávajících členů, aby změnili svá hesla" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Nemáte oprávnění tento projekt smazat", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Další účty služby" }, - "additionalServiceAccountsDesc": { - "message": "Vaše předplatné obsahuje $COUNT$ účtů služby. Další účty služby můžete přidat za $COST$ měsíčně.", + "includedServiceAccounts": { + "message": "Váš plán již obsahuje $COUNT$ účtů služeb.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Za $COST$ měsíčně můžete přidat další účty služeb.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max. potenciální náklady na účet služby" + }, + "smBetaEndedDesc": { + "message": "Správce klíčů beta skončil $BETA_ENDING_DATE$. Zbývá $DAYS$ dní na to, abyste si přidali aplikaci správce klíčů k placenému předplatnému a zachovali si přístup k datům správce klíčů. Kontaktujte oddělení Customer Success a přidejte si aplikaci správce klíčů do svého předplatného.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta končí" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index fd395c891b3..6e742e4ad8b 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "En uventet fejl opstod." }, + "expirationDateError": { + "message": "Udløbsdato skal være i fremtiden." + }, "emailAddress": { "message": "E-mailadresse" }, "yourVaultIsLocked": { "message": "Din boks er låst. Bekræft din hovedadgangskode for at fortsætte." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Oplås" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopiér bekræftelseskoden" }, + "copyUuid": { + "message": "Kopiér UUID" + }, "warning": { "message": "Advarsel" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Fejl under dekryptering af den eksporterede fil. Krypteringsnøglen matcher ikke den til dataeksporten anvendte krypteringsnøgle." }, + "importDestination": { + "message": "Importér destination" + }, + "learnAboutImportOptions": { + "message": "Læs om importmuligheder" + }, + "selectImportFolder": { + "message": "Vælg en mappe" + }, + "selectImportCollection": { + "message": "Vælg en samling" + }, + "importTargetHint": { + "message": "Vælg denne indstilling, hvis importeret filindhold skal flyttet til en $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Filen indeholder ikke-tildelte emner." + }, "selectFormat": { "message": "Vælg formatet for importfilen" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Dette element har gamle filvedhæftninger, der skal repareres." }, - "attachmentFixDesc": { - "message": "Dette er en gammel filvedhæftning, der skal repareres. Klik for at lære mere." + "attachmentFixDescription": { + "message": "Denne vedhæftning har forældet kryptering. Vælg 'Korrigér' for at downloade, gen-kryptere og gen-uploade vedhæftningen." }, "fix": { "message": "Reparér", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Kun organisationsboksen tilknyttet $ORGANIZATION$ eksporteres. Individuelle boksemner, samt emner fra andre organisationer, medtages ikke.", + "exportingOrganizationVaultDesc": { + "message": "Kun organisationsboksen tilknyttet $ORGANIZATION$ eksporteres. Emner i individuelle bokse eller andre organisationer medtages ikke.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Kræv, at eksisterende medlemmer ændrer deres adgangskoder" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Ingen tilladelse til at slette dette objekt", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Yderligere tjenestekonti" }, - "additionalServiceAccountsDesc": { - "message": "Abonnementstypen inkluderer $COUNT$ tjenestekonti. Yderligere tjenestekonti kan tilføjes for $COST$ pr. måned.", + "includedServiceAccounts": { + "message": "Abonnementstypen er inkl. $COUNT$ tjenestekonti.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Yderligere tjenestekonti kan tilføjes for $COST$ pr. måned.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Maks. potentiel tjenestekontomkostning" + }, + "smBetaEndedDesc": { + "message": "Secrets Manager Beta ophørte $BETA_ENDING_DATE$. Der er $DAYS$ dage tilbage til at føje Secrets Manager til dit betalte abonnement og bevare adgangen til Secrets Manager-data. Kontakt Customer Success for at føje Secrets Manager til abonnementet.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta ophører" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 81ca7797b86..8f04f01be41 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ein unerwarteter Fehler ist aufgetreten." }, + "expirationDateError": { + "message": "Bitte wähle ein Ablaufdatum aus, das in der Zukunft liegt." + }, "emailAddress": { "message": "E-Mail-Adresse" }, "yourVaultIsLocked": { "message": "Dein Tresor ist gesperrt. Überprüfe dein Master-Passwort, um fortzufahren." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Entsperren" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Verifizierungscode kopieren" }, + "copyUuid": { + "message": "UUID kopieren" + }, "warning": { "message": "Warnung" }, @@ -1155,7 +1164,7 @@ } }, "kdfIterationsWarning": { - "message": "Wenn du die Anzahl der KDF-Iterationen zu hoch setzt, kann es sein, dass das Einloggen in (und Entsperren von) Bitwarden auf langsameren Geräten länger dauert. Wir empfehlen, dass du den Wert wiederholt um $INCREMENT$ anhebst und auf all deinen Geräten testest.", + "message": "Wenn du die Anzahl der KDF-Iterationen zu hoch setzt, kann es sein, dass das Anmelden in (und Entsperren von) Bitwarden auf langsameren Geräten länger dauert. Wir empfehlen, dass du den Wert wiederholt um $INCREMENT$ anhebst und auf all deinen Geräten testest.", "placeholders": { "increment": { "content": "$1", @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Fehler beim Entschlüsseln der exportierten Datei. Dein Verschlüsselungsschlüssel stimmt nicht mit dem beim Export verwendeten Verschlüsselungsschlüssel überein." }, + "importDestination": { + "message": "Import-Ziel" + }, + "learnAboutImportOptions": { + "message": "Erfahre mehr über deine Importoptionen" + }, + "selectImportFolder": { + "message": "Ordner auswählen" + }, + "selectImportCollection": { + "message": "Sammlung auswählen" + }, + "importTargetHint": { + "message": "Wähle diese Option, wenn der importierte Dateiinhalt in eine(n) $DESTINATION$ verschoben werden soll", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Die Datei enthält nicht zugewiesene Einträge." + }, "selectFormat": { "message": "Wählen Sie das Format Ihrer Import-Datei" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Dieser Eintrag hat Anhänge, die repariert werden müssen." }, - "attachmentFixDesc": { - "message": "Dieser Dateianhang muss aufgrund ihres Alters aktualisiert werden. Klicke hier, um mehr zu erfahren." + "attachmentFixDescription": { + "message": "Dieser Anhang verwendet eine veraltete Verschlüsselung. Wähle \"Reparieren\", um den Anhang herunterzuladen, erneut zu verschlüsseln und erneut hochzuladen." }, "fix": { "message": "Reparieren", @@ -4157,7 +4191,7 @@ "message": "Benutzer eingeladen." }, "acceptEmergencyAccess": { - "message": "Du wurdest eingeladen, ein Notfallkontakt für den oben genannten Benutzer zu werden. Um die Einladung anzunehmen, musst du dich einloggen oder ein neues Bitwarden-Konto erstellen." + "message": "Du wurdest eingeladen, ein Notfallkontakt für den oben genannten Benutzer zu werden. Um die Einladung anzunehmen, musst du dich anmelden oder ein neues Bitwarden-Konto erstellen." }, "emergencyInviteAcceptFailed": { "message": "Die Einladung konnte nicht angenommen werden. Bitte den Benutzer, eine neue Einladung zu versenden." @@ -4570,7 +4604,7 @@ "message": "Passwort zurücksetzen" }, "resetPasswordLoggedOutWarning": { - "message": "Wenn du fortfährst, wird $NAME$ aus seiner aktuellen Sitzung ausgeloggt und muss sich erneut einloggen. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben.", + "message": "Wenn du fortfährst, wird $NAME$ aus seiner aktuellen Sitzung abgemeldet und muss sich erneut anmelden. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben.", "placeholders": { "name": { "content": "$1", @@ -5094,7 +5128,7 @@ "message": "Angebot für eine bestehende Organisation akzeptieren oder eine neue Families-Organisation erstellen." }, "setupSponsoredFamiliesLoginDesc": { - "message": "Dir wurde ein kostenloser Bitwarden Families-Organisationstarif angeboten. Um fortzufahren, musst du dich in das Konto einloggen, das das Angebot erhalten hat." + "message": "Dir wurde ein kostenloser Bitwarden Families-Organisationstarif angeboten. Um fortzufahren, musst du dich bei dem Konto anmelden, das das Angebot erhalten hat." }, "sponsoredFamiliesAcceptFailed": { "message": "Angebot kann nicht angenommen werden. Bitte sende die Angebotsmail von deinem Unternehmenskonto erneut und versuche es noch einmal." @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Nur der mit $ORGANIZATION$ verbundene Tresor der Organisation wird exportiert. Persönliche Tresoreinträge und Einträge anderer Organisationen werden nicht berücksichtigt.", + "exportingOrganizationVaultDesc": { + "message": "Nur der mit $ORGANIZATION$ verbundene Organisationstresor wird exportiert. Einträge in persönlichen Tresoren oder anderen Organisationen werden nicht berücksichtigt.", "placeholders": { "organization": { "content": "$1", @@ -5589,7 +5623,7 @@ "message": "Geräteverifizierung aktivieren" }, "deviceVerificationDesc": { - "message": "Verifizierungscodes werden an deine E-Mail-Adresse gesendet, wenn du dich von einem unbekannten Gerät einloggst" + "message": "Verifizierungscodes werden an deine E-Mail-Adresse gesendet, wenn du dich von einem unbekannten Gerät anmeldest" }, "updatedDeviceVerification": { "message": "Geräteverifizierung aktualisiert" @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Bestehende Mitglieder auffordern, ihre Passwörter zu ändern" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Dir fehlen die Berechtigungen, dieses Projekt zu löschen", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Zusätzliche Dienstkonten" }, - "additionalServiceAccountsDesc": { - "message": "Dein Abonnement enthält $COUNT$ Dienstkonten. Du kannst zusätzliche Dienstkonten für $COST$ pro Monat hinzufügen.", + "includedServiceAccounts": { + "message": "Dein Tarif enthält $COUNT$ Dienstkonten.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Du kannst zusätzliche Dienstkonten für $COST$ pro Monat hinzufügen.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Maximale potentielle Kosten für Dienstkonten" + }, + "smBetaEndedDesc": { + "message": "Die Secrets Manager Beta endete am $BETA_ENDING_DATE$. Du hast $DAYS$ Tage Zeit, um den Secrets Manager zu deinem kostenpflichtigen Abonnement hinzuzufügen und den Zugriff auf die Daten des Secrets Manager zu erhalten. Kontaktiere den Kundensupport, um den Secrets Manager zu deinem Abonnement hinzuzufügen.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta-Ende" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index f4ecd15a4fb..75f8d10f14c 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Παρουσιάστηκε ένα μη αναμενόμενο σφάλμα." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Διεύθυνση Email" }, "yourVaultIsLocked": { "message": "Το vault σας είναι κλειδωμένο. Επαληθεύστε τον κύριο κωδικό πρόσβασης για να συνεχίσετε." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Ξεκλείδωμα" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Αντιγραφή Κωδικού Επαλήθευσης" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Προειδοποίηση" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Σφάλμα αποκρυπτογράφησης του εξαγόμενου αρχείου. Το κλειδί κρυπτογράφησης δεν ταιριάζει με το κλειδί κρυπτογράφησης που χρησιμοποιήθηκε για την εξαγωγή των δεδομένων." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Επιλέξτε μορφή του αρχείου εισαγωγής" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Αυτό το στοιχείο έχει παλιά συνημμένα αρχεία που πρέπει να διορθωθούν." }, - "attachmentFixDesc": { - "message": "Αυτό είναι ένα παλιό συνημμένο αρχείο που πρέπει να διορθωθεί. Κάντε κλικ για να μάθετε περισσότερα." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Επιδιόρθωση", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Μόνο το vault οργανισμού που σχετίζεται με το $ORGANIZATION$ θα εξαχθεί. Προσωπικά αντικείμενα και αντικείμενα από άλλους οργανισμούς δεν θα συμπεριληφθούν.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index febe1163884..ca217f6ef77 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organisation vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organisations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index fcefb38e2ca..ac8fa6dd682 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 6e0ad0c4199..6f955af6b54 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Neatendita eraro okazis." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Retpoŝta Adreso" }, "yourVaultIsLocked": { "message": "Via trezorejo estas ŝlosita. Kontrolu vian ĉefan pasvorton por daŭrigi." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Malŝlosi" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopii Konfirman Kodon" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Averto" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Eraro de ĉifrado de la elporta dosiero. Via ŝlosilo de ĉifrado ne kongruas kun la ŝlosilo de ĉifrado uzita por elporti la datumojn." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Elektu la formaton de la importa dosiero" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Ĉi tiu ero havas malnovajn dosierajn aldonaĵojn, kiujn necesas ripari." }, - "attachmentFixDesc": { - "message": "Ĉi tio estas malnova riparenda dosiero, kiun necesas ripari. Alklaku por lerni pli." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Ripari", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index c4e6c9ec89b..b9cdefb5b89 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ha ocurrido un error inesperado." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Correo electrónico" }, "yourVaultIsLocked": { "message": "Tu caja fuerte está bloqueada. Verifica tu contraseña maestra para continuar." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Desbloquear" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copiar código de verificación" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Advertencia" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error al descifrar el archivo exportado. Su clave de cifrado no coincide con la clave de cifrado utilizada para exporta los datos." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Selecciona el formato del fichero a importar" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Este elemento tiene archivos adjuntos antiguos que deben ser corregidos." }, - "attachmentFixDesc": { - "message": "Este es un archivo adjunto antiguo que necesita ser corregido. Haga clic para obtener más información." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Arreglar", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Solo se exportará la caja fuerte de la organización asociada con $ORGANIZATION$. No se incluirán objetos y elementos personales de otras organizaciones.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Requiere que los miembros existentes cambien sus contraseñas" }, - "region": { - "message": "Región" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "EEUU", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "No tiene permisos para eliminar este proyecto", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 2dcc6e2927a..e6646326dcd 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Tekkis ootamatu viga." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-posti aadress" }, "yourVaultIsLocked": { "message": "Hoidla on lukus. Jätkamiseks sisesta ülemparool." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Lukusta lahti" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopeeri kinnituskood" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Hoiatus" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Eksporditud faili dekrüpteerimine nurjus. Sinu krüpteerimisvõti ei ühti selle võtmega, mida kasutati andmete eksportimisel." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Vali imporditava faili vorming" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Sellel kirjel on vanu manuseid, mille peab parandama." }, - "attachmentFixDesc": { - "message": "See on vana failimanus, mille peab parandama. Rohkema teabe saamiseks kliki siia." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Paranda", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Ainult organisatsiooniga $ORGANIZATION$ seotud kirjed eksportidakse. Personaalse hoidla ja teiste organisatsioonide kirjeid ei ekspordita.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 57997785d9d..75e378ecda6 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ustekabeko akatsa gertatu da." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Emaila" }, "yourVaultIsLocked": { "message": "Zure kutxa gotorra blokeatuta dago. Egiaztatu zure pasahitz nagusia jarraitzeko." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Desblokeatu" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopiatu egiaztatze-kodea" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Kontuz" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Errorea esportatutako fitxategia deszifratzean. Zifratze-gakoa ez dator bat datuak esportatzeko erabilitako zifratze-gakoarekin." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Hautatu inportazio fitxategiaren formatua" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Artikulu honek fitxategi erantsi zaharrak ditu, konpondu beharrekoak." }, - "attachmentFixDesc": { - "message": "Hau fitxategi erantsi zaharra da eta konpondu beharra dago. Klikatu gehiago jakiteko." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Konpondu", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "$ORGANIZATION$-rekin lotutako erakundearen kutxa gotorra bakarrik esportatuko da. Ez dira sartuko kutxa gotor pertsonaletako eta beste erakunde batzuetako elementuak.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index ff293244d5f..08246e95942 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "یک خطای غیر منتظره رخ داده است." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "نشانی ایمیل" }, "yourVaultIsLocked": { "message": "گاوصندوق شما قفل است. برای ادامه کلمه عبور اصلی خود را وارد کنید." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "باز کردن قفل" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "کپی کد تأیید" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "هشدار" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "خطا در رمزگشایی پرونده‌ی درون ریزی شده. کلید رمزگذاری شما با کلید رمزگذاری استفاده شده برای درون ریزی داده‌ها مطابقت ندارد." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "فرمت پرونده‌ی درون ریزی را انتخاب کنید" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "این مورد دارای پرونده های پیوست قدیمی است که باید اصلاح شوند." }, - "attachmentFixDesc": { - "message": "این یک پرونده پیوست قدیمی است که باید اصلاح شود. برای کسب اطلاعات بیشتر کلیک کنید." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "اصلاح", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "فقط گاوصندوق سازمانی مرتبط با $ORGANIZATION$ برون ریزی خواهد شد. اقلام شخصی گاوصندوق و اقلام سایر سازمان‌ها شامل نمی‌شود.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "از اعضای موجود بخواهید کلمه‌های عبور خود را تغییر دهند" }, - "region": { - "message": "منطقه" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "اروپا", - "description": "European Union" - }, - "us": { - "message": "امریکا", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "شما مجوز حذف این پروژه را ندارید", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "حساب‌های خدمات اضافی" }, - "additionalServiceAccountsDesc": { - "message": "طرح شما با حساب خدمات $COUNT$ همراه است. می‌توانید حساب‌های سرویس اضافی را با $COST$ در ماه اضافه کنید.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "حداکثر هزینه حساب خدمات بالقوه" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 51b2af3213b..f589399377b 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Tapahtui odottamaton virhe." }, + "expirationDateError": { + "message": "Valitse erääntymispäivä, joka on tulevaisuudessa." + }, "emailAddress": { "message": "Sähköpostiosoite" }, "yourVaultIsLocked": { "message": "Holvi on lukittu. Jatka vahvistamalla pääsalasanasi." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Avaa holvi" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopioi todennuskoodi" }, + "copyUuid": { + "message": "Kopioi UUID" + }, "warning": { "message": "Varoitus" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Virhe purettaessa viedyn tiedoston salausta. Salausavaimesi ei vastaa viennissä käytettyä salausavainta." }, + "importDestination": { + "message": "Tuontikohde" + }, + "learnAboutImportOptions": { + "message": "Lue lisää tuontivaihtoehdoista" + }, + "selectImportFolder": { + "message": "Valitse kansio" + }, + "selectImportCollection": { + "message": "Valitse kokoelma" + }, + "importTargetHint": { + "message": "Valitse tämä, jos haluat tuoda tiedoston sisällön kohteesee $DESTINATION$.", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Tiedosto sisältää määrittämättömiä kohteita." + }, "selectFormat": { "message": "Valitse tuotavan tiedoston muoto" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Kohteella on vanhoja tiedostoliitteitä, jotka on korjattava." }, - "attachmentFixDesc": { - "message": "Vanha tiedostoliite, joka on korjattava. Klikkaa lukeaksesi lisää." + "attachmentFixDescription": { + "message": "Liite käyttää vanhentunutta salausta. Lataa liite, salaa se uudelleen ja lisää se uudestaan valitsemalla \"Korjaa\"." }, "fix": { "message": "Korjaa", @@ -4705,7 +4739,7 @@ "message": "Virhe" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "\"Tilien palautusavun hallinta\" -oikeuden kanssa on myönnettävä myös \"Käyttäjien hallinta\" -oikeus." }, "setupProvider": { "message": "Toimittajan määritys" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Vain organisaatioon $ORGANIZATION$ liitetyt holvin kohteet viedään. Yksityisen holvin ja muiden organisaatioiden kohteita ei sisällytetä.", + "exportingOrganizationVaultDesc": { + "message": "Vain organisaatioon $ORGANIZATION$ liitetyn holvin kohteet viedään. Yksityisen holvin ja muiden organisaatioiden kohteita ei sisällytetä.", "placeholders": { "organization": { "content": "$1", @@ -6512,7 +6546,7 @@ "message": "Organisaation salaisten tietojen vienti" }, "exportingOrganizationSecretDataDescription": { - "message": "Vain organisaatioon $ORGANIZATION$ liitetyt Salaisuushallinnan tiedot viedään. Muiden tuotteiden ja organisaatioiden kohteet eivät sisälly tähän.", + "message": "Vain organisaatioon $ORGANIZATION$ liitetyt Salaisuushallinnan tiedot viedään. Muiden tuotteiden tai organisaatioiden kohteita ei sisällytetä.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Vaadi nykyisiä jäseniä vaihtamaan salasanansa" }, - "region": { - "message": "Alue" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Käyttöoikeutesi eivät salli tämän projektin poistamista", @@ -6825,7 +6854,7 @@ "message": "Päivitä KDF-asetukset" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Luotetut laitteet" }, "memberDecryptionTdeDescriptionPartOne": { "message": "Kun jäsenet on todennettu, he voivat purkaa holvin salauksen heidän laitteellaan säilytettävällä avaimella.", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Lisättävät palvelutilit" }, - "additionalServiceAccountsDesc": { - "message": "Tilaukseesi sisältyy $COUNT$ palvelutiliä ja voit hankkia lisää hintaan $COST$/palvelutili/kuukausi.", + "includedServiceAccounts": { + "message": "Tilaukseesi sisältyy $COUNT$ palvelutiliä.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Voit hankkia lisää palvelutilejä hintaan $COST$/tili/kuukausi.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Palvelutilin mahdollinen enimmäiskustannus" + }, + "smBetaEndedDesc": { + "message": "Salaisuushallinnan beta päättyi $BETA_ENDING_DATE$. Sinulla on $DAYS$ päivää aikaa lisätä Salaisuushallinta maksulliseen tilaukseesi säilyttääksesi Salaisuushallinnassa olevien tietojesi käyttöoikeuden. Lisää Salaisuushallinta tilaukseesi olemalla yhteydessä asiakaspalveluun.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta päättyy" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index a8e52862306..d7260c3d45b 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Nagkaroon ng hindi inaasahang problema." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Naka-lock ang vault mo. Beripikahin ang master password mo para tumuloy." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "I-unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopyahin ang code pamberipika" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Babala" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Nagkaproblema sa pagde-decrypt ng na-export na file. Hindi tumutugma ang encryption key mo sa ginamit pang-export sa data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Piliin ang format ng import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Ang item na ito ay may mga lumang file attachment na kailangang ayusin." }, - "attachmentFixDesc": { - "message": "Ito ay isang lumang file attachment ang mga pangangailangan upang ayusin. Mag-klik para malaman ang iba pa." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Ayusin ang", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Tanging ang vault ng organisasyon na nauugnay sa $ORGANIZATION$ ang i-export. Hindi isasama ang mga indibidwal na vault item at item mula sa ibang mga organisasyon.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 235180cc3c8..8796f4d9b45 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Une erreur inattendue est survenue." }, + "expirationDateError": { + "message": "Veuillez sélectionner une date d'expiration qui est dans le futur." + }, "emailAddress": { "message": "Adresse électronique" }, "yourVaultIsLocked": { "message": "Votre coffre est verrouillé. Vérifiez votre mot de passe principal pour continuer." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Déverrouiller" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copier le code de vérification" }, + "copyUuid": { + "message": "Copier l'UUID" + }, "warning": { "message": "Attention" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Erreur lors du déchiffrement du fichier exporté. Votre clé de chiffrement ne correspond pas à la clé de chiffrement utilisée pour exporter les données." }, + "importDestination": { + "message": "Destination de l'import" + }, + "learnAboutImportOptions": { + "message": "En savoir plus sur vos options d'importation" + }, + "selectImportFolder": { + "message": "Choisir un dossier" + }, + "selectImportCollection": { + "message": "Sélectionnez une collection" + }, + "importTargetHint": { + "message": "Sélectionnez cette option si vous voulez que le contenu du fichier importé soit déplacé vers un(e) $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Le fichier contient des éléments non assignés." + }, "selectFormat": { "message": "Sélectionnez le format du fichier à importer" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Cet élément a d'anciennes pièces jointes qui doivent être réparées." }, - "attachmentFixDesc": { - "message": "Il s'agit d'une ancienne pièce jointe qui doit être réparée. Cliquez pour en savoir plus." + "attachmentFixDescription": { + "message": "Cette pièce jointe utilise un chiffrement obsolète. Choisissez 'Réparer' pour télécharger, chiffrer à nouveau et téléverser à nouveau la pièce jointe." }, "fix": { "message": "Réparer", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Seul le coffre de l'organisation associé à $ORGANIZATION$ sera exporté. Les éléments du coffre personnel et les éléments d'autres organisations ne seront pas inclus.", + "exportingOrganizationVaultDesc": { + "message": "Seul le coffre d'organisation associé à $ORGANIZATION$ sera exporté. Les éléments dans les coffres individuels ou d'autres organisations ne seront pas inclus.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Exiger que les membres existants changent leurs mots de passe" }, - "region": { - "message": "Région" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Vous n'avez pas les droits pour supprimer ce projet", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Comptes de service supplémentaires" }, - "additionalServiceAccountsDesc": { - "message": "Votre plan inclut $COUNT$ comptes de service. Vous pouvez ajouter des comptes de service supplémentaires pour $COST$ par mois.", + "includedServiceAccounts": { + "message": "Votre forfait inclut $COUNT$ comptes de service.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Vous pouvez ajouter des comptes de service supplémentaires pour $COST$ par mois.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Coût potentiel maximum du compte de service" + }, + "smBetaEndedDesc": { + "message": "Le Secrets Manager Beta s'est terminé le $BETA_ENDING_DATE$. Il vous reste $DAYS$ jours pour ajouter Secrets Manager à votre forfait payant et conserver votre accès à vos données de Secrets Manager. Contactez Customer Success pour ajouter Secrets Manager à votre forfait.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Fin de la beta" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 2bf2db8832a..afb6d2214cc 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "אירעה שגיאה לא צפויה." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "כתובת אימייל" }, "yourVaultIsLocked": { "message": "הכספת שלך נעולה. הזן את הסיסמה הראשית שלך כדי להמשיך." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "שחרר נעילה" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "העתק קוד אימות" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "אזהרה" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "בחר את פורמט הקובץ לייבוא" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "לפריט זה יש קובץ מצורף שצריך תיקון." }, - "attachmentFixDesc": { - "message": "קובץ מצורף זה צריך לעבור תיקון. לחץ כאן כדי לגלות עוד פרטים." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "תקן", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 7a015596ca1..51e2caf5319 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 32bb069c0d1..dc852c9f4e6 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Došlo je do neočekivane pogreške." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Adresa e-pošte" }, "yourVaultIsLocked": { "message": "Tvoj trezor je zaključan. Potvrdi glavnu lozinku za nastavak." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Otključaj" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopiraj kôd za provjeru" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Upozorenje" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Greška u dešifriranju izvozne datoteke. Ovaj ključ za šifriranje ne odgovara ključu za šifriranje korištenom pri izvozu datoteke." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Odaberi format datoteke za uvoz" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Ova stavka ima stare privitke koje je potrebno popraviti." }, - "attachmentFixDesc": { - "message": "Ovo je stari privitak kojeg je potrebno popraviti. Klikni ovdje za više informacija." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Popravi", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Izvest će se samo organizacijski trezor povezan s $ORGANIZATION$. Pojedinačne stavke iz trezora i stavke iz drugih organizacija neće biti uključene.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 29b614cf641..cd764ebd422 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Váratlan hiba történt." }, + "expirationDateError": { + "message": "Válasszunk jövőbeni lejárati dátumot." + }, "emailAddress": { "message": "Email cím" }, "yourVaultIsLocked": { "message": "A széf zárolásra került. A folytatáshoz meg kell adni a mesterjelszót." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Feloldás" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy Verification Code" }, + "copyUuid": { + "message": "UUID másolása" + }, "warning": { "message": "Figyelmeztetés" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Hiba történt az exportált fájl visszafejtése során. A titkosítási kulcs nem egyezik meg az adatok exportálásához használt titkosítási kulccsal." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Válasszuk ki az import fájl formátumát." }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Ennek az elemnek régi fájl mellékletei vannak, amelyeket javítani kell." }, - "attachmentFixDesc": { - "message": "Ez egy régi melléklet, amelyet javítani kell. Kattintás több információért." + "attachmentFixDescription": { + "message": "Ez a melléklet elavult titkosítást használ. Válasszuk a 'Javítás' lehetőséget a melléklet letöltéséhez, ismételt titkosításához és újbóli feltöltéséhez." }, "fix": { "message": "Javítás", @@ -4705,7 +4739,7 @@ "message": "Hiba" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "A felhasználók kezelését engedélyezni kell a Jelszó visszaállításának kezelése jogosultsággal is." }, "setupProvider": { "message": "Szolgáltató beállítása" @@ -5429,7 +5463,7 @@ } } }, - "exportingOrganizationVaultDescription": { + "exportingOrganizationVaultDesc": { "message": "Csak$ORGANIZATION$ névvel társított szervezeti széf elemek kerülnek exportálásra. Ebbe nem kerülnek be a személyes és más szervezeti széf elemek.", "placeholders": { "organization": { @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "A meglévő tagoknak meg kell változtatniuk jelszavaikat." }, - "region": { - "message": "Régió" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Nincs jogosulltság ezen projekt törléséhez.", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Kiegészítő szolgáltatás fiókok" }, - "additionalServiceAccountsDesc": { - "message": "A csomag $COUNT$ szolgáltatás fiókot tartalmaz. További szolgáltatási fiókokat vehetünk fel havi $COST$ áron.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Maximális lehetséges szolgáltatás fiókköltség" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 1923fadea94..eabcdc841f2 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Terjadi kesalahan yang tak diduga." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Alamat Surel" }, "yourVaultIsLocked": { "message": "Brankas Anda terkunci. Verifikasi kata sandi utama Anda untuk melanjutkan." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Buka Kunci" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Salin Kode Verifikasi" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Peringatan" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Tidak dapat mendekripsi file yang diekspor. Kunci enkripsi Anda tidak cocok dengan kunci enkripsi yang digunakan untuk menekspor data terkait." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Pilih format file impor" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Item ini memiliki lampiran file lama yang perlu diperbaiki." }, - "attachmentFixDesc": { - "message": "Ini adalah lampiran file lama yang perlu diperbaiki. Klik untuk mempelajari lebih lanjut." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Perbaiki", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index d31a4788712..752ca51b8e6 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Si è verificato un errore imprevisto." }, + "expirationDateError": { + "message": "Seleziona una data di scadenza nel futuro." + }, "emailAddress": { "message": "Indirizzo email" }, "yourVaultIsLocked": { "message": "La tua cassaforte è bloccata. Verifica la tua password principale per continuare." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Sblocca" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copia codice di verifica" }, + "copyUuid": { + "message": "Copia UUID" + }, "warning": { "message": "Attenzione" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Errore durante la decriptografia del file esportato. La chiave di criptografia non corrisponde alla chiave di criptografia usata per esportare i dati." }, + "importDestination": { + "message": "Destinazione dell'importazione" + }, + "learnAboutImportOptions": { + "message": "Ulteriori informazioni sulle tue opzioni di importazione" + }, + "selectImportFolder": { + "message": "Seleziona una cartella" + }, + "selectImportCollection": { + "message": "Seleziona una raccolta" + }, + "importTargetHint": { + "message": "Seleziona questa opzione se vuoi che i contenuti del file di importazione siamo spostati in una $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Il file contiene elementi non assegnati." + }, "selectFormat": { "message": "Seleziona il formato del file da importare" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Questo elemento ha vecchi file allegati che devono essere corretti." }, - "attachmentFixDesc": { - "message": "Questo è un vecchio file allegato che deve essere corretto. Clicca per ulteriori informazioni." + "attachmentFixDescription": { + "message": "Questo allegato usa una criptografia obsoleta. Seleziona \"Correggi\" per scaricare, criptografare di nuovo, e caricare di nuovo l'allegato." }, "fix": { "message": "Correggi", @@ -4705,7 +4739,7 @@ "message": "Errore" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "Gestisci utenti deve essere abilitato con il permesso di gestire il ripristino delle password" }, "setupProvider": { "message": "Configurazione del fornitore" @@ -5429,7 +5463,7 @@ } } }, - "exportingOrganizationVaultDescription": { + "exportingOrganizationVaultDesc": { "message": "Solo la cassaforte dell'organizzazione associata a $ORGANIZATION$ sarà esportata. Elementi nelle casseforti individuali o in altre organizzazioni non saranno inclusi.", "placeholders": { "organization": { @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Obbliga i membri esistenti a cambiare le loro password" }, - "region": { - "message": "Regione" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "UE", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Non hai l'autorizzazione per eliminare questo progetto", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Account di servizio aggiuntivi" }, - "additionalServiceAccountsDesc": { - "message": "Il tuo piano include $COUNT$ account di servizio. Puoi aggiungere più account di servizio a $COST$ al mese.", + "includedServiceAccounts": { + "message": "Il tuo piano include $COUNT$ account di servizio.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Puoi aggiungere più account di servizio a $COST$ al mese.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Costo massimo potenziale dell'account di servizio" + }, + "smBetaEndedDesc": { + "message": "La beta del Gestore dei Segreti è terminata in $BETA_ENDING_DATE$. Ti rimangono $DAYS$ giorni per aggiungere il Gestore dei Segreti al tuo abbonamento a pagamento e mantenere l'accesso ai dati del Gestore dei Segreti. Contatta il Successo del Cliente per aggiungere il Gestore dei Segreti al tuo abbonamento.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Termine della beta" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index ac23ddd5ab4..44be0b070f9 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "予期せぬエラーが発生しました。" }, + "expirationDateError": { + "message": "有効期限は未来のものをお選びください。" + }, "emailAddress": { "message": "メールアドレス" }, "yourVaultIsLocked": { "message": "保管庫がロックされています。開くにはマスターパスワードを入力してください。" }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "ロック解除" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "認証コードのコピー" }, + "copyUuid": { + "message": "UUID をコピー" + }, "warning": { "message": "注意" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "エクスポートされたファイルの復号でエラーが発生しました。暗号化キーが、データをエクスポートするために使用された暗号化キーと一致しません。" }, + "importDestination": { + "message": "インポート先" + }, + "learnAboutImportOptions": { + "message": "インポートオプションについて学ぶ" + }, + "selectImportFolder": { + "message": "フォルダーを選択" + }, + "selectImportCollection": { + "message": "コレクションを選択" + }, + "importTargetHint": { + "message": "インポートしたファイルコンテンツを $DESTINATION$ に移動したい場合は、このオプションを選択してください。", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "割り当てられていないアイテムがファイルに含まれています。" + }, "selectFormat": { "message": "インポートするファイルの形式を選択" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "このアイテムは添付ファイルが古いため修正する必要があります。" }, - "attachmentFixDesc": { - "message": "これは古い添付ファイルのため修正する必要があります。詳しくはこちら。" + "attachmentFixDescription": { + "message": "この添付ファイルは古い暗号化を使用しています。添付ファイルをダウンロード、再暗号化、再アップロードするには「修正」を選択してください。" }, "fix": { "message": "修正", @@ -4705,7 +4739,7 @@ "message": "エラー" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "ユーザーを管理するには、アカウントのリカバリ管理権限を付与する必要があります。" }, "setupProvider": { "message": "プロバイダーのセットアップ" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "$ORGANIZATION$ に関連付けられた組織保管庫のアイテムのみがエクスポートされます。他の組織や個人保管庫のアイテムは含まれません。", + "exportingOrganizationVaultDesc": { + "message": "$ORGANIZATION$ に関連付けられた組織保管庫のみがエクスポートされます。個々の保管庫または他の組織にあるアイテムは含まれません。", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "パスワードを変更するには、メンバーが存在しないといけません" }, - "region": { - "message": "リージョン" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "米国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "このプロジェクトを削除する権限がありません", @@ -6825,7 +6854,7 @@ "message": "KDF の設定を更新する" }, "trustedDevices": { - "message": "Trusted devices" + "message": "信頼できるデバイス" }, "memberDecryptionTdeDescriptionPartOne": { "message": "認証が完了したあとメンバーはデバイスに保存されているキーを使用して保管庫のデータを復号します。このオプションを使用すると、", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "追加のサービスアカウント" }, - "additionalServiceAccountsDesc": { - "message": "あなたのプランには、 $COUNT$ 個のサービスアカウントが付属しています。月額 $COST$ でサービスアカウントを追加できます。", + "includedServiceAccounts": { + "message": "お客様のプランには$COUNT$のサービスアカウントが付属しています。", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "月々$COST$でサービスアカウントを追加できます。", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "潜在的なサービスアカウントのコストの最大値" + }, + "smBetaEndedDesc": { + "message": "シークレットマネージャーベータは$BETA_ENDING_DATE$で終了しました。シークレットマネージャーを有料サブスクリプションに追加し、シークレットマネージャーのデータへのアクセスを維持するには、$DAYS$日間の猶予があります。シークレットマネージャーをサブスクリプションに追加するには、カスタマーサクセスまでお問い合わせください。", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "ベータ終了" + }, + "beta": { + "message": "ベータ" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 56488567c87..7929c24f01d 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "წარმოიშვა გაუთვალისწინებელი ხარვეზი." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "ელ-ფოსტის მისამართი" }, "yourVaultIsLocked": { "message": "თქვენი საცავი ჩაკეტილია. დაადასტურეთ თქვენი მთავარი პაროლი გასაგრძელებლად." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "გახსნა" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "დააკოპირე ერთჯერადი კოდი" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "გაფრთხილება" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 2ec0b9f2e40..49616196430 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "ಅನಿರೀಕ್ಷಿತ ದೋಷ ಸಂಭವಿಸಿದೆ." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "ಇಮೇಲ್ ವಿಳಾಸ" }, "yourVaultIsLocked": { "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಲಾಕ್ ಆಗಿದೆ. ಮುಂದುವರೆಯಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "ಅನ್‌ಲಾಕ್ ಮಾಡಿ" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ನಕಲಿಸಿ" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "ಎಚ್ಚರಿಕೆ" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "ರಫ್ತು ಮಾಡಿದ ಫೈಲ್ ಅನ್ನು ಡೀಕ್ರಿಪ್ಟ್ ಮಾಡುವಲ್ಲಿ ದೋಷ. ಡೇಟಾವನ್ನು ರಫ್ತು ಮಾಡಲು ಬಳಸಿದ ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಕೀಗೆ ನಿಮ್ಮ ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಕೀ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "ಆಮದು ಫೈಲ್‌ನ ಸ್ವರೂಪವನ್ನು ಆಯ್ಕೆಮಾಡಿ" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "ಈ ಐಟಂ ಹಳೆಯ ಫೈಲ್ ಲಗತ್ತುಗಳನ್ನು ಹೊಂದಿದ್ದು ಅದನ್ನು ಸರಿಪಡಿಸಬೇಕಾಗಿದೆ." }, - "attachmentFixDesc": { - "message": "ಇದು ಸರಿಪಡಿಸಬೇಕಾದ ಹಳೆಯ ಫೈಲ್ ಲಗತ್ತು. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಕ್ಲಿಕ್ ಮಾಡಿ." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "ಹೊಂದಿಸು", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 14f68e767e8..a98c4a4d414 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "예기치 못한 오류가 발생했습니다." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "이메일 주소" }, "yourVaultIsLocked": { "message": "보관함이 잠겨 있습니다. 마스터 비밀번호를 입력하여 계속하세요." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "잠금 해제" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "인증 코드 복사" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "경고" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "내보내려는 파일을 복호화하던 중 오류가 발생했습니다. 암호화 키가 내보내려는 데이터를 암호화한 키와 일치하지 않습니다." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "불러올 파일의 포맷" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "이 항목은 수정이 필요한 오래된 파일을 갖고 있습니다." }, - "attachmentFixDesc": { - "message": "이것은 수정이 필요한 오래된 파일입니다. 자세한 내용을 보려면 클릭하십시오." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "수정", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index c6975de668c..89954567910 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ir radusies neparedzēta kļūda." }, + "expirationDateError": { + "message": "Lūgums atlasīt beigu datumu, kas ir nākotnē." + }, "emailAddress": { "message": "E-pasta adrese" }, "yourVaultIsLocked": { "message": "Tava glabātuve ir bloķēta. Lai turpinātu, pārbaudi savu galveno paroli." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Atslēgt" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Ievietot apstiprinājuma kodu starpliktuvē" }, + "copyUuid": { + "message": "Ievietot UUID starpliktuvē" + }, "warning": { "message": "Brīdinājums" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Atšifrējot eksportēto failu, radās kļūda. Jūsu šifrēšanas atslēga neatbilst datu eksportēšanai izmantotajai šifrēšanas atslēgai." }, + "importDestination": { + "message": "Ievietošanas galamērķis" + }, + "learnAboutImportOptions": { + "message": "Uzzināt par ievietošanas iespējām" + }, + "selectImportFolder": { + "message": "Atlasīt mapi" + }, + "selectImportCollection": { + "message": "Atlasīt krājumu" + }, + "importTargetHint": { + "message": "Šī iespēja jāatlasa, ja ir vēlēšanās ievietotās datnes saturu pārvietot uz $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Datne satur nepiešķirtus vienumus." + }, "selectFormat": { "message": "Atlasīt ievietošanas datnes veidolu" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Šim vienumam ir veci datņu pielikumi, kas ir jāsalabo." }, - "attachmentFixDesc": { - "message": "Šis ir vecs datnes pielikums, kas ir jāsalabo. Klikšķināt, lai uzzinātu vairāk." + "attachmentFixDescription": { + "message": "Šis pielikumam ir novecojusi šifrēšana. Jāatlasa 'Salabot', lai lejupielādētu, atkārtoti šifrētu un augšupielādētu pielikumu." }, "fix": { "message": "Salabot", @@ -4705,7 +4739,7 @@ "message": "Kļūda" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "Lietotāju pārvaldīšanai ir jābūt iespējotai arī ar konta atkopšanas pārvaldīšanas atļauju" }, "setupProvider": { "message": "Sniedzēja iestatīšana" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Tiks izdota tikai apvienības glabātava, kas ir saistīta ar $ORGANIZATION$. Personīgie glabātavas vienumi un vienumi no citām apvienībām netiks iekļauti.", + "exportingOrganizationVaultDesc": { + "message": "Tiks izdota tikai apvienības glabātava, kas ir saistīta ar $ORGANIZATION$. Atsevišķu glabātavu vai citu apvienību vienumi netiks iekļauti.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Pieprasīt esošajiem dalībniekiem nomainīt to paroles" }, - "region": { - "message": "Apgabals" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "ES", - "description": "European Union" - }, - "us": { - "message": "ASV", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Nav nepieciešamo atļauju, lai izdzēstu šo projektu", @@ -6825,7 +6854,7 @@ "message": "Atjaunināt KDF iestatījumus" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Uzticamās ierīces" }, "memberDecryptionTdeDescriptionPartOne": { "message": "Pēc pieteikšanās dalībnieki atšifrēs glabātavas saturu ar ierīcē glabātu atslēgu. ", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Papildu pakalpojumu konti" }, - "additionalServiceAccountsDesc": { - "message": "Plānā ir iekļauti $COUNT$ pakalpojumu konti. Papildu pakalpojumu kontus var pievienot par $COST$ mēnesī.", + "includedServiceAccounts": { + "message": "Plānā ir iekļauti $COUNT$ pakalpojumu konti.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Papildu pakalpojumu kontus var pievienot par $COST$ mēnesī.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Lielākās iespējamās pakalpojumu kontu izmaksas" + }, + "smBetaEndedDesc": { + "message": "Noslēpumu pārvaldnieka beta beidzās $BETA_ENDING_DATE$. Ir atlikušas $DAYS$ dienas, lai pievienotu Noslēpumu pārvaldnieku apmaksātajam abonementam un saglabātu piekļuvu Noslēpumu pārvaldnieka datiem. Jāsazināš ar klientu atbalstu, lai abonementam pievienotu Noslēpumu pārvaldnieku.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta ir beidzies" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 7896fe2b503..01def969c7d 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "ഒരു അപ്രതീക്ഷിത പിശക് സംഭവിച്ചു." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "ഇ-മെയിൽ വിലാസം" }, "yourVaultIsLocked": { "message": "നിങ്ങളുടെ വാൾട് പൂട്ടിയിരിക്കുന്നു. തുടരുന്നതിന് നിങ്ങളുടെ പ്രാഥമിക പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "അൺലോക്ക്" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "സ്ഥിരീകരണ കോഡ് പകർത്തുക " }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "മുന്നറിയിപ്പ്" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "പരിഹരിക്കേണ്ട അറ്റാച്മെന്റുകൾ ഈ ഇനത്തിൽ ഉണ്ട്." }, - "attachmentFixDesc": { - "message": "പരിഹരിക്കേണ്ട അറ്റാച്മെന്റുകൾ ഈ ഇനത്തിൽ ഉണ്ട്. കൂടുതലറിയാൻ ക്ലിക്കുചെയ്യുക." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "പരിഹരിക്കുക", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 1d707362bfc..580fdbd0d41 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "En uventet feil har oppstått." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-postadresse" }, "yourVaultIsLocked": { "message": "Hvelvet ditt er låst. Kontroller hovedpassordet ditt for å fortsette." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Lås opp" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopier verifiseringskoden" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Advarsel" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Feil under dekryptering av den eksporterte filen. Krypteringsnøkkelen samsvarte ikke med krypteringsnøkkelen som ble brukt eksport av data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Velg formatet til importfilen" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Denne oppføringen har gamle fil-vedlegg som må repareres." }, - "attachmentFixDesc": { - "message": "Dette er et gammelt fil-vedlegg som må repareres. Klikk for å se mer." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Reparer", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Bare organisasjonens hvelv knyttet til $ORGANIZATION$ vil bli eksportert. Personlige hvelvelementer og elementer fra andre organisasjoner vil ikke bli inkludert.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 69df4fe5647..8e7502dbcf0 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index faccc73593f..cb39f72a3b8 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Er is een onverwachte fout opgetreden." }, + "expirationDateError": { + "message": "Kies een vervaldatum in de toekomst." + }, "emailAddress": { "message": "E-mailadres" }, "yourVaultIsLocked": { "message": "Je kluis is vergrendeld. Voer je hoofdwachtwoord in om door te gaan." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Ontgrendelen" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Verificatiecode kopiëren" }, + "copyUuid": { + "message": "UUID kopiëren" + }, "warning": { "message": "Waarschuwing" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Fout bij het decoderen van het geëxporteerde bestand. Je encryptiesleutel komt niet overeen met de gebruikte sleutel waarmee de gegevens zijn geëxporteerd." }, + "importDestination": { + "message": "Importbestemming" + }, + "learnAboutImportOptions": { + "message": "Leer meer over je importopties" + }, + "selectImportFolder": { + "message": "Map selecteren" + }, + "selectImportCollection": { + "message": "Collectie selecteren" + }, + "importTargetHint": { + "message": "Kies deze optie als je de geïmporteerde bestandsinhoud wilt verplaatsen naar een $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Bestand bevat niet-toegewezen items." + }, "selectFormat": { "message": "Selecteer het formaat van het importbestand" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Dit item heeft oude bestandsbijlagen die aangepast moeten worden." }, - "attachmentFixDesc": { - "message": "Dit is een oude bestandsbijlage die moet worden aangepast. Klik voor meer informatie." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Oplossen", @@ -5429,7 +5463,7 @@ } } }, - "exportingOrganizationVaultDescription": { + "exportingOrganizationVaultDesc": { "message": "Exporteert alleen de organisatiekluis van $ORGANIZATION$. Geen persoonlijke kluis-items of items van andere organisaties.", "placeholders": { "organization": { @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Verplicht bestaande leden hun wachtwoord te wijzigen" }, - "region": { - "message": "Regio" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "VS", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Je hebt geen rechten om dit project te verwijderen", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Extra service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Bij je abonnement zijn $COUNT$ service accounts ingegrepen. Je kunt meer service accounts toevoegen voor $COST$ per maand.", + "includedServiceAccounts": { + "message": "Bij je abonnement horen $COUNT$ serviceaccounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Je kunt extra serviceaccounts toevoegen voor $COST$ per maand.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "De Secrets Manager Beta eindigde $BETA_ENDING_DATE$. Je hebt nog $DAYS$ dagen over voor het toevoegen van Secrets Manager aan je betaalde abonnement en toegang te houden tot de gegevens in Secrets Manager. Neem contact op met Customer Success voor het toevoegen van Secrets Manager aan je abonnement.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta beëindigd" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 3f5494a68cf..9023e2ddc77 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Eit uventa problem oppstod." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-postadresse" }, "yourVaultIsLocked": { "message": "Kvelvet ditt er låst. Stadfesta hovudpassordet ditt for å halda fram." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Lås opp" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Åtvaring" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 950467daf4a..56242ae7891 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Wystąpił nieoczekiwany błąd." }, + "expirationDateError": { + "message": "Wybierz datę wygaśnięcia, która przypada w przyszłości." + }, "emailAddress": { "message": "Adres e-mail" }, "yourVaultIsLocked": { "message": "Sejf jest zablokowany. Wpisz hasło główne, aby kontynuować." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Odblokuj" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopiuj kod weryfikacyjny" }, + "copyUuid": { + "message": "Skopiuj UUID" + }, "warning": { "message": "Ostrzeżenie" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Wystąpił błąd podczas odszyfrowywania pliku. Klucz szyfrowania nie pasuje do klucza użytego podczas eksportowania danych." }, + "importDestination": { + "message": "Miejsce docelowe importu" + }, + "learnAboutImportOptions": { + "message": "Dowiedz się o opcjach importu" + }, + "selectImportFolder": { + "message": "Wybierz folder" + }, + "selectImportCollection": { + "message": "Wybierz kolekcję" + }, + "importTargetHint": { + "message": "Wybierz tę opcję, jeśli chcesz, aby zawartość zaimportowanego pliku została przeniesiona do $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Plik zawiera nieprzypisane elementy." + }, "selectFormat": { "message": "Wybierz format importowanego pliku" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Ten element posiada stare załączniki, które muszą zostać naprawione." }, - "attachmentFixDesc": { - "message": "To jest stary załącznik, który musi zostać naprawiony. Kliknij, aby dowiedzieć się więcej." + "attachmentFixDescription": { + "message": "Ten załącznik używa przestarzałego szyfrowania. Wybierz 'Napraw', aby pobrać, ponownie zaszyfrować i ponownie przesłać załącznik." }, "fix": { "message": "Napraw", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Tylko sejf organizacji powiązany z organizacją $ORGANIZATION$ zostanie wyeksportowany. Osobiste elementy sejfu i elementy innych organizacji nie będą uwzględnione.", + "exportingOrganizationVaultDesc": { + "message": "Tylko sejf organizacji powiązany z $ORGANIZATION$ zostanie wyeksportowany. Pozycje w poszczególnych sejfach lub innych organizacji nie będą uwzględnione.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Wymagaj od istniejących członków zmiany haseł" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "UE", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Nie masz uprawnień do usunięcia tego projektu", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Dodatkowe konto serwisowe" }, - "additionalServiceAccountsDesc": { - "message": "W twoim planie możesz mieć $COUNT$ kont(a) serwisowe. Możesz dodać dodatkowe konta serwisowe za $COST$ miesięcznie.", + "includedServiceAccounts": { + "message": "Twój plan obejmuje $COUNT$ kont serwisowych.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Możesz dodać dodatkowe konta serwisowe za $COST$ miesięcznie.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Maksymalny potencjalny koszt kont serwisowych" + }, + "smBetaEndedDesc": { + "message": "Wersja beta menedżera sekretów zakończyła się dnia $BETA_ENDING_DATE$. Pozostało Ci $DAYS$ dni, aby dodać menedżera sekretów do swojej płatnej subskrypcji i zachować dostęp do danych menedżera sekretów. Skontaktuj się z obsługą klienta, aby dodać menedżera sekretów do swojej subskrypcji.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Zakończenie testowania bety" + }, + "beta": { + "message": "Wersja beta" } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 30e8021e3b1..a8f0cef6c19 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ocorreu um erro inesperado." }, + "expirationDateError": { + "message": "Por favor, selecione uma data de expiração que seja no futuro." + }, "emailAddress": { "message": "Endereço de e-mail" }, "yourVaultIsLocked": { "message": "O seu cofre está bloqueado. Verifique a sua senha mestra para continuar." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Desbloquear" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copiar Código de Verificação" }, + "copyUuid": { + "message": "Copiar URL" + }, "warning": { "message": "Aviso" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Erro ao descriptografar o arquivo exportado. Sua chave de criptografia não corresponde à chave de criptografia usada para exportar os dados." }, + "importDestination": { + "message": "Destino da Importação" + }, + "learnAboutImportOptions": { + "message": "Saiba mais sobre suas opções de importação" + }, + "selectImportFolder": { + "message": "Selecione uma pasta" + }, + "selectImportCollection": { + "message": "Selecione uma coleção" + }, + "importTargetHint": { + "message": "Selecione esta opção se você quer o conteúdo do arquivo importado movido para $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Arquivo contém itens não atribuídos." + }, "selectFormat": { "message": "Selecione o formato do arquivo de importação" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Este item tem anexos de arquivos antigos que precisam ser corrigidos." }, - "attachmentFixDesc": { - "message": "Este é um anexo de arquivo antigo que precisa ser corrigido. Clique para saber mais." + "attachmentFixDescription": { + "message": "Este anexo utiliza criptografia desatualizada. Selecione 'Corrigir' para baixar, re-criptografar e recarregar o anexo." }, "fix": { "message": "Corrigir", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre pessoal e itens de outras organizações não serão incluídos.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Região" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "O seu plano vem com $COUNT$ contas de serviço.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Você pode adicionar contas de serviço adicionais por $COST$ mensais.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "O Gerenciador de Segredos Beta terminou em $BETA_ENDING_DATE$. Você tem $DAYS$ dias para adicionar o Gerenciador de Segredos à sua assinatura paga e manter o acesso aos dados do Gerenciador Secretos. Contate o setor de Sucesso do Cliente para adicionar o Gerenciador de Segredos à sua assinatura.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Final da versão Beta" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 8a866881720..1e9e80a7de3 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ocorreu um erro inesperado." }, + "expirationDateError": { + "message": "Por favor, selecione uma data de expiração futura." + }, "emailAddress": { "message": "Endereço de e-mail" }, "yourVaultIsLocked": { "message": "O seu cofre está bloqueado. Verifique a sua palavra-passe mestra para continuar." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Desbloquear" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copiar código de verificação" }, + "copyUuid": { + "message": "Copiar UUID" + }, "warning": { "message": "Aviso" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Erro ao desencriptar o ficheiro exportado. A sua chave de encriptação não corresponde à chave de encriptação utilizada para exportar os dados." }, + "importDestination": { + "message": "Destino da importação" + }, + "learnAboutImportOptions": { + "message": "Saiba mais sobre as suas opções de importação" + }, + "selectImportFolder": { + "message": "Selecionar uma pasta" + }, + "selectImportCollection": { + "message": "Selecionar uma coleção" + }, + "importTargetHint": { + "message": "Selecione esta opção se pretender que o conteúdo do ficheiro importado seja transferido para $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "O ficheiro contém itens não atribuídos." + }, "selectFormat": { "message": "Selecione o formato do ficheiro a importar" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Este item tem anexos de ficheiros antigos que precisam de ser corrigidos." }, - "attachmentFixDesc": { - "message": "Trata-se de um anexo de ficheiro antigos que precisa de ser corrigido. Clique para saber mais." + "attachmentFixDescription": { + "message": "Este anexo utiliza uma encriptação desatualizada. Selecione \"Corrigir\" para transferir, voltar a encriptar e voltar a carregar o anexo." }, "fix": { "message": "Corrigir", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Apenas o cofre da organização associado a $ORGANIZATION$ serão exportados. Os itens do cofre pessoal e os de outras organizações não serão incluídos.", + "exportingOrganizationVaultDesc": { + "message": "Apenas o cofre da organização associado a $ORGANIZATION$ será exportado. Os itens em cofres individuais ou noutras organizações não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Exigir que os membros existentes alterem as suas palavras-passe" }, - "region": { - "message": "Região" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "UE", - "description": "European Union" - }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Não tem permissões para eliminar este projeto", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Contas de serviço adicionais" }, - "additionalServiceAccountsDesc": { - "message": "O seu plano é fornecido com $COUNT$ contas de serviço. Pode adicionar contas de serviço adicionais por $COST$ por mês.", + "includedServiceAccounts": { + "message": "O seu plano inclui $COUNT$ contas de serviço.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Pode adicionar contas de serviço adicionais por $COST$ por mês.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Custo máximo potencial da conta de serviço" + }, + "smBetaEndedDesc": { + "message": "O Gestor de Segredos Beta terminou a $BETA_ENDING_DATE$. Restam-lhe $DAYS$ dias para adicionar o Gestor de Segredos à sua subscrição paga e manter o acesso aos dados do Gestor de Segredos. Contacte o Serviço de Apoio ao Cliente para adicionar o Gestor de Segredos à sua subscrição.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Fim da versão Beta" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 4c78e940f5e..ab162e68fcb 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "A survenit o eroare neașteptată." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Adresă de e-mail" }, "yourVaultIsLocked": { "message": "Seiful dvs. este blocat. Verificați parola principală pentru a continua." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Deblocare" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copiere cod de verificare" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Avertisment" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Eroare la decriptarea fișierului exportat. Cheia dvs. de criptare nu corespunde cu cheia de criptare folosită pentru a exporta datele." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Alegeți din listă formatul fișierului de import" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Acest element are atașamente vechi care trebuie fixate." }, - "attachmentFixDesc": { - "message": "Acesta este un atașament de fișier vechi care trebuie reparat. Clicați pentru a afla mai multe." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Repară", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Numai seiful organizației asociat cu $ORGANIZATION$ va fi exportat. Articolele de seif individuale și articolele din alte organizații nu vor fi incluse.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 43cf40c373d..ac6590b76dc 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Произошла непредвиденная ошибка." }, + "expirationDateError": { + "message": "Выберите дату истечения срока действия в будущем." + }, "emailAddress": { "message": "Адрес email" }, "yourVaultIsLocked": { "message": "Ваше хранилище заблокировано. Для продолжения введите мастер-пароль." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Разблокировать" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Скопировать код подтверждения" }, + "copyUuid": { + "message": "Скопировать UUID" + }, "warning": { "message": "Предупреждение" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Ошибка при расшифровке экспортированного файла. Ваш ключ шифрования не совпадает с ключом шифрования, используемым для экспорта данных." }, + "importDestination": { + "message": "Направление импорта" + }, + "learnAboutImportOptions": { + "message": "Узнайте о возможностях импорта" + }, + "selectImportFolder": { + "message": "Выбрать папку" + }, + "selectImportCollection": { + "message": "Выбрать коллекцию" + }, + "importTargetHint": { + "message": "Выберите эту опцию, если хотите, чтобы содержимое импортированного файла было перемещено в папку $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Выберите формат файла импорта" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "К этому элементу прикреплены старые вложения, которые необходимо исправить." }, - "attachmentFixDesc": { - "message": "Это старое вложение необходимо исправить. Нажмите, чтобы узнать больше." + "attachmentFixDescription": { + "message": "Вложение использует устаревшее шифрование. Выберите 'Исправить' дня загрузки, повторного шифрования и выгрузки вложения." }, "fix": { "message": "Исправить", @@ -4705,7 +4739,7 @@ "message": "Ошибка" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "Для управления пользователями также необходимо предоставить разрешение на управление восстановлением аккаунта" }, "setupProvider": { "message": "Настройка поставщика" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Будет экспортировано только хранилище организации, связанное с $ORGANIZATION$. Личные элементы хранилища и элементы из других организаций включены не будут.", + "exportingOrganizationVaultDesc": { + "message": "Будет экспортировано только хранилище организации, связанное с $ORGANIZATION$. Элементы из личных хранилищ и из других организаций включены не будут.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Требовать от существующих пользователей смены паролей" }, - "region": { - "message": "Регион" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "Европа", - "description": "European Union" - }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "У вас недостаточно прав для удаления этого проекта", @@ -6825,7 +6854,7 @@ "message": "Обновить параметры KDF" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Доверенные устройства" }, "memberDecryptionTdeDescriptionPartOne": { "message": "После аутентификации участники расшифровывают данные хранилища с помощью ключа, хранящегося на их устройстве.", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Дополнительные сервисные аккаунты" }, - "additionalServiceAccountsDesc": { - "message": "Ваш тарифный план включает в себя $COUNT$ сервисных аккаунтов. Вы можете добавить дополнительные сервисные аккаунты за $COST$ в месяц.", + "includedServiceAccounts": { + "message": "Ваш план включает в себя $COUNT$ сервисных аккаунтов.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Вы можете добавить дополнительные сервисные аккаунты за $COST$ в месяц.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Максимальная потенциальная стоимость сервисного аккаунта" + }, + "smBetaEndedDesc": { + "message": "Бета-версия Менеджера секретов завершилась $BETA_ENDING_DATE$. У вас осталось $DAYS$ дней, чтобы добавить его к своей платной подписке и сохранить доступ к данным. Чтобы добавить Менеджер секретов к подписке, обратитесь в службу поддержки клиентов.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Окончание бета-версии" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 740f98921a8..e70b94f4d6e 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "වි-තැපැල් ලිපිනය" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "අනවහිර" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "අවවාදයයි" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index d05808c109b..15ab9567eb9 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Vyskytla sa neočakávaná chyba." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Emailová adresa" }, "yourVaultIsLocked": { "message": "Váš trezor je uzamknutý. Overte sa hlavným heslom ak chcete pokračovať." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Odomknúť" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopírovať overovací kód" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Upozornenie" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Chyba pri dešifrovaní exportovaného súboru. Váš šifrovací kľúč sa nezhoduje so šifrovacím kľúčom použitým pri exporte údajov." }, + "importDestination": { + "message": "Cieľ importu" + }, + "learnAboutImportOptions": { + "message": "Zistiť viac o možnostiach importu" + }, + "selectImportFolder": { + "message": "Vyberte priečinok" + }, + "selectImportCollection": { + "message": "Vyberte zbierku" + }, + "importTargetHint": { + "message": "Zvoľte túto možnosť ak chcete obsah importovaného súboru presunúť do $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Súbor obsahuje nepridelené položky." + }, "selectFormat": { "message": "Vyberte formát súboru importu" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Táto položka má staré prílohy, ktoré je potrebné opraviť." }, - "attachmentFixDesc": { - "message": "Táto stará príloha musí byť opravená. Kliknite ak sa chcete dozvedieť viac." + "attachmentFixDescription": { + "message": "Táto príloha používa zastaralý systém šifrovania. Zvoľte „Opraviť“ pre stiahnutie, opätovné zašifrovanie a nahranie prílohy." }, "fix": { "message": "Opraviť", @@ -5429,7 +5463,7 @@ } } }, - "exportingOrganizationVaultDescription": { + "exportingOrganizationVaultDesc": { "message": "Exportované budú iba položky trezora organizácie spojené s $ORGANIZATION$. Položky osobného trezora a položky z iných organizácií nebudú zahrnuté.", "placeholders": { "organization": { @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Požadovať po súčasných členoch, aby si zmenili heslo" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Na odstránenie tohto projektu nemáte oprávnenia", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Dodatočné služobné kontá" }, - "additionalServiceAccountsDesc": { - "message": "Váš plán zahŕňa $COUNT$ služobných kont. Ďalšie služobné kontá môžete pridať za $COST$ mesačne.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Maximálna možná cena služobných kont" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 2fcb958d0fd..2d12a70086f 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Prišlo je do nepričakovane napake." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-poštni naslov" }, "yourVaultIsLocked": { "message": "Vaš trezor je zaklenjen. Potrdite vaše glavno geslo za nadaljevanje." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Odkleni" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopiraj verifikacijsko kodo" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Opozorilo" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Dešifriranje izvožene datoteke je spodletelo. Ključ za dešifriranje se ne ujema s ključem, ki je bil uporabljen pri izvozu." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Izberite format datoteke za uvoz" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Regija" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index bab17c39a82..b7ecce559ab 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Дошло је до неочекиване грешке." }, + "expirationDateError": { + "message": "Изаберите датум истека који је у будућности." + }, "emailAddress": { "message": "Имејл" }, "yourVaultIsLocked": { "message": "Сеф је блокиран. Унесите главну лозинку за наставак." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Откључај" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Копирај верификациони код" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Упозорење" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Грешка у дешифрирању извозне датотеке. Ваш кључ за шифровање не одговара кључу који се користио за извоз података." }, + "importDestination": { + "message": "Смештај увоза" + }, + "learnAboutImportOptions": { + "message": "Сазнајте више о опцијама увоза" + }, + "selectImportFolder": { + "message": "Изабери фасциклу" + }, + "selectImportCollection": { + "message": "Изабери колекцију" + }, + "importTargetHint": { + "message": "Изаберите ову опцију ако желите да се садржај увезене датотеке премести у $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Датотека садржи недодељене ставке." + }, "selectFormat": { "message": "Одабрати формат датотеке за увоз" }, @@ -2636,10 +2670,10 @@ "message": "Интернет Сеф" }, "bitWebVault": { - "message": "Bitwarden Web vault" + "message": "Bitwarden Интернет Сеф" }, "bitSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "Bitwarden Менаџер Тајности" }, "loggedIn": { "message": "Пријављено." @@ -3320,7 +3354,7 @@ "message": "Поставите ограничење лиценце за своју претплату. Једном када се достигне ова граница, нећете моћи да позовете нове кориснике." }, "limitSmSubscriptionDesc": { - "message": "Set a seat limit for your Secrets Manger subscription. Once this limit is reached, you will not be able to invite new members." + "message": "Поставите ограничење лиценце за своју претплату менаџера тајни. Једном када се достигне ова граница, нећете моћи да позовете нове чланове." }, "maxSeatLimit": { "message": "Максимална граница лиценце (опционо)", @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Ова ставка има старе прилоге које треба поправити." }, - "attachmentFixDesc": { - "message": "Ово је стари прилог који треба поправити. Кликните да бисте сазнали више." + "attachmentFixDescription": { + "message": "Овај прилог користи застарело шифровање. Изаберите „Поправи“ да бисте преузели, поново шифровали и поново отпремили прилог." }, "fix": { "message": "Фиксирај", @@ -4375,7 +4409,7 @@ "message": "Управљај корисницима" }, "manageAccountRecovery": { - "message": "Manage account recovery" + "message": "Управљајте опоравком налога" }, "disableRequiredError": { "message": "Морате ручно да онемогућите $POLICYNAME$ пријаву пре него што ова политика може да се онемогући.", @@ -4705,7 +4739,7 @@ "message": "Грешка" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "Корисницима за управљање такође мора бити додељена дозвола за опоравак налога за управљање" }, "setupProvider": { "message": "Подешавање првајдера" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Биће извезен само сеф организације повезан са $ORGANIZATION$. Ставке у појединачним сефовима или другим организацијама неће бити укључене.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Захтевајте од постојећих чланова да промене њихове лозинке" }, - "region": { - "message": "Регион" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Немате дозволе да избришете овај пројекат", @@ -6825,7 +6854,7 @@ "message": "Ажурирати KDF подешавања" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Поуздани уређаји" }, "memberDecryptionTdeDescriptionPartOne": { "message": "Када се аутентификују, чланови ће дешифровати податке из сефљ користећи кључ сачуван на њиховом уређају", @@ -6956,15 +6985,15 @@ "message": "Одабрана застава" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "Нема активних Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", + "message": "Употребите Send да безбедно делите шифроване информације са било ким.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inviteUsers": { - "message": "Invite Users" + "message": "Позови кориснике" }, "secretsManagerForPlan": { "message": "Secrets Manager for $PLAN$", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Ваш план долази са $COUNT$ налога сервиса.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "Можете додати још сервисних налога за $COST$ месечно.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7043,7 +7077,7 @@ "message": "Secrets Manager plan price" }, "passwordManager": { - "message": "Password Manager" + "message": "Менаџер лозинки" }, "freeOrganization": { "message": "Free Organization" @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "Бета менаџера тајни се завршио $BETA_ENDING_DATE$. Остало вам је $DAYS$ дана да додате Менаџер тајни у вашу претплату и да задржите приступ подацима Манагера тајни. Контактирајте подршку да додате Менаџер тајни у своју претплату.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Крај бета" + }, + "beta": { + "message": "Бета" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 83ec7eaa952..5d393e10ef8 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Imejl Adresa" }, "yourVaultIsLocked": { "message": "Vaš trezor je zaključan. Unesite glavnu lozinku da biste nastavili." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Otključaj" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Upozorenje" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Izaberite format datoteke za uvoz" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 736bd83e0ca..65c4890363e 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Ett oväntat fel har inträffat." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-postadress" }, "yourVaultIsLocked": { "message": "Valvet är låst. Bekräfta ditt huvudlösenord för att fortsätta." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Lås upp" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Kopiera verifieringskod" }, + "copyUuid": { + "message": "Kopiera UUID" + }, "warning": { "message": "Varning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Ett fel uppstod vid dekryptering av den exporterade filen. Din krypteringsnyckel matchar inte krypteringsnyckeln som användes för att exportera datan." }, + "importDestination": { + "message": "Importdestination" + }, + "learnAboutImportOptions": { + "message": "Läs mer om dina importalternativ" + }, + "selectImportFolder": { + "message": "Välj en mapp" + }, + "selectImportCollection": { + "message": "Välj en samling" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "Filen innehåller otilldelade objekt." + }, "selectFormat": { "message": "Välj importfilens format" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Detta objekt har gamla bilagor som behöver åtgärdas." }, - "attachmentFixDesc": { - "message": "Detta är en gammal bilaga som behöver åtgärdas. Klicka för att läsa mer." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Åtgärda", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -5491,7 +5525,7 @@ "message": "Generera användarnamn" }, "usernameType": { - "message": "Username type" + "message": "Användarnamnstyp" }, "plusAddressedEmail": { "message": "Plus addressed email", @@ -5805,7 +5839,7 @@ "message": "Inga objekt hittades" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "Rensa alla" }, "toggleCharacterCount": { "message": "Toggle character count", @@ -5999,11 +6033,11 @@ "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited", + "message": "Projekt har redigerats", "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved", + "message": "Projekt har sparats", "description": "Notification for the successful saving of a project." }, "projectCreated": { @@ -6545,7 +6579,7 @@ "message": "If you do not want to opt into billing sync, manually upload your license here." }, "syncLicense": { - "message": "Sync license" + "message": "Synkronisera licens" }, "licenseSyncSuccess": { "message": "Successfully synced license" @@ -6605,7 +6639,7 @@ "message": "Can read, write" }, "groupSlashUser": { - "message": "Group/User" + "message": "Grupp/Användare" }, "lowKdfIterations": { "message": "Low KDF Iterations" @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 6c9b0111a67..cc3bc7427a2 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Unlock" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Warning" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 23e6b3fd1c2..9d2df6b8709 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "ข้อผิดพลาดที่ไม่คาดคิดเกิดขึ้น" }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "ที่อยู่อีเมล์" }, "yourVaultIsLocked": { "message": "ตู้เซฟของคุณถูกล็อค ใส่รหัสผ่านหลักของคุณเพื่อดำเนินการต่อ" }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "ปลดล็อค" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Copy verification code" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "คำเตือน" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Select the format of the import file" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 208083843be..be77f99ed4d 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Beklenmedik bir hata oluştu." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "E-posta adresi" }, "yourVaultIsLocked": { "message": "Kasanız kilitli. Devam etmek için ana parolanızı doğrulayın." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Kilidi aç" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Doğrulama kodunu kopyala" }, + "copyUuid": { + "message": "UUID'yi kopyala" + }, "warning": { "message": "Uyarı" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Dışa aktarılmış dosya çözülemedi. Şifreleme anahtarınız, veri dışa aktarılırken kullanılanla uyuşmuyor." }, + "importDestination": { + "message": "İçe aktarma hedefi" + }, + "learnAboutImportOptions": { + "message": "İçe aktarma seçeneklerinizi öğrenin" + }, + "selectImportFolder": { + "message": "Bir klasör seçin" + }, + "selectImportCollection": { + "message": "Bir koleksiyon seçin" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "İçe aktarma dosyasının biçimini seçin" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Bu kayıtta düzeltilmesi gereken eski dosya ekleri bulunuyor." }, - "attachmentFixDesc": { - "message": "Bu eski dosya ekinin düzeltmesi gerekiyor. Daha fazla bilgi için tıklayın." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Düzelt", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Yalnızca $ORGANIZATION$ ile ilişkili kuruluş kasası dışarı aktarılacak. Kişisel kasadaki ögeler ve diğer kuruluşlardaki ögeler dahil edilmeyecek.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Mevcut üyelerin parolalarını değiştirmelerini zorunlu tut" }, - "region": { - "message": "Bölge" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "AB", - "description": "European Union" - }, - "us": { - "message": "ABD", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "Bu projeyi silme izniniz yok", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta sona ediyor" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 4479545ab91..36702e5bd24 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Сталася неочікувана помилка." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Адреса е-пошти" }, "yourVaultIsLocked": { "message": "Сховище заблоковано. Введіть головний пароль для продовження." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Розблокувати" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Копіювати код підтвердження" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Попередження" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Помилка розшифрування експортованого файлу. Ваш ключ шифрування відрізняється від ключа, використаного для експортування даних." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Оберіть формат імпортованого файлу" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "Цей елемент має старі вкладені файли, які необхідно виправити." }, - "attachmentFixDesc": { - "message": "Цей старий вкладений файл необхідно виправити. Натисніть, щоб дізнатися більше." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Виправити", @@ -4705,7 +4739,7 @@ "message": "Помилка" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "Разом із дозволом на керування відновленням облікового запису також необхідно надати дозвіл на керування користувачами" }, "setupProvider": { "message": "Налаштування постачальника" @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Будуть експортовані лише записи сховища організації, пов'язані з $ORGANIZATION$. Записи особистого сховища та записи з інших організацій не буде включено.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Вимагати від наявних учасників змінювати паролі" }, - "region": { - "message": "Регіон" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "ЄС", - "description": "European Union" - }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "У вас немає дозволу на видалення цього проєкту", @@ -6825,7 +6854,7 @@ "message": "Оновити налаштування KDF" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Довірені пристрої" }, "memberDecryptionTdeDescriptionPartOne": { "message": "Після авторизації учасники розшифровуватимуть дані сховища з використанням ключа, збереженого на їхньому пристрої.", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Додаткові службові облікові записи" }, - "additionalServiceAccountsDesc": { - "message": "Ваш план включає $COUNT$ службових облікових записів. Ви можете додати більше службових облікових записів за $COST$ на місяць.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Потенційна максимальна вартість службового облікового запису" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 6bd4716281f..c4c78182bef 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "Một lỗi bất ngờ đã xảy ra." }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "Địa chỉ email" }, "yourVaultIsLocked": { "message": "Kho của bạn đã bị khóa. Xác minh mật khẩu chính của bạn để tiếp tục." }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "Mở khóa" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "Sao chép mã xác thực" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "Cảnh báo" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "Chọn định dạng cho file xuất" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "This item has old file attachments that need to be fixed." }, - "attachmentFixDesc": { - "message": "This is an old file attachment the needs to be fixed. Click to learn more." + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "Fix", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "Region" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "EU", - "description": "European Union" - }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "Additional service accounts" }, - "additionalServiceAccountsDesc": { - "message": "Your plan comes with $COUNT$ service accounts. You can add additional service accounts for $COST$ per month.", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "Max potential service account cost" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 104f7439c33..76a0af2bc0c 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "发生意外错误。" }, + "expirationDateError": { + "message": "请选择一个过期日期(必须是将来的某个日期)。" + }, "emailAddress": { "message": "电子邮件地址" }, "yourVaultIsLocked": { "message": "您的密码库已锁定,请验证您的主密码以继续。" }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "解锁​​​​" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "复制验证码" }, + "copyUuid": { + "message": "复制 UUID" + }, "warning": { "message": "警告" }, @@ -1000,7 +1009,7 @@ "message": "确认文件密码" }, "accountRestrictedOptionDescription": { - "message": "使用衍生自您账户的用户名和主密码的加密密钥,以加密此导出并限制只能导入到当前的 Bitwarden 帐户。" + "message": "使用衍生自您账户的用户名和主密码的加密密钥,以加密此导出并限制只能导入到当前的 Bitwarden 账户。" }, "passwordProtectedOptionDescription": { "message": "设置一个密码用来加密导出的数据,并使用此密码解密以导入到任意 Bitwarden 账户。" @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "解密导出的文件时出错。您的加密密钥与导出数据时使用的加密密钥不匹配。" }, + "importDestination": { + "message": "导入目的地" + }, + "learnAboutImportOptions": { + "message": "了解您的导入选项" + }, + "selectImportFolder": { + "message": "选择一个文件夹" + }, + "selectImportCollection": { + "message": "选择一个集合" + }, + "importTargetHint": { + "message": "如果您希望将导入的文件内容移至 $DESTINATION$,请选中此选项", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "文件包含未分配项目。" + }, "selectFormat": { "message": "选择导入文件的格式" }, @@ -1959,7 +1993,7 @@ "message": "# GB 附加存储" }, "additionalStorageIntervalDesc": { - "message": "您的计划附带 $SIZE$ 的加密存储空间。您也可以以 $PRICE$ 每 GB 每 $INTERVAL$ 购买附加存储。", + "message": "您的计划包含 $SIZE$ 的加密存储空间。您也可以以 $PRICE$ 每 GB 每 $INTERVAL$ 购买附加存储。", "placeholders": { "size": { "content": "$1", @@ -3590,15 +3624,15 @@ "attachmentsNeedFix": { "message": "此项目有需要修复的旧文件附件。" }, - "attachmentFixDesc": { - "message": "这是一个需要修复的旧文件附件。点击了解更多。" + "attachmentFixDescription": { + "message": "此附件使用了过时的加密方式。选择「修复」以下载、重新加密,然后重新上传此附件。" }, "fix": { "message": "修复", "description": "This is a verb. ex. 'Fix The Car'" }, "oldAttachmentsNeedFixDesc": { - "message": "需要先修复密码库中的旧文件附件,然后才能轮换账户的加密密钥。" + "message": "需要先修复您的密码库中的旧文件附件,然后才能轮换您账户的加密密钥。" }, "yourAccountsFingerprint": { "message": "您的账户的指纹短语", @@ -4705,7 +4739,7 @@ "message": "错误" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "管理用户也必须被授予管理账户恢复的权限" }, "setupProvider": { "message": "提供商设置" @@ -5238,7 +5272,7 @@ "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "连接 SSO 登录到您的自托管解密密钥服务器。使用此选项后,成员将不再需要使用主密码解密密码库数据。", + "message": "连接 SSO 登录到您的自托管解密密钥服务器。使用此选项后,成员将不再需要使用主密码解密密码库数据。需要", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { @@ -5246,7 +5280,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "被用于设置 Key Connector 解密。请联系 Bitwarden 支持获取协助。", + "message": "以用于设置 Key Connector 解密。请联系 Bitwarden 支持获取协助。", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { @@ -5325,7 +5359,7 @@ "message": "轮换令牌" }, "rotateBillingSyncTokenWarning": { - "message": "要继续,您需要重新设置您的自托管服务器上的计费同步功能。" + "message": "继续的话,您需要重新设置您的自托管服务器上的计费同步功能。" }, "rotateBillingSyncTokenTitle": { "message": "轮换计费同步令牌将使之前的令牌失效。" @@ -5421,7 +5455,7 @@ "message": "正在导出组织密码库" }, "exportingPersonalVaultDescription": { - "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目,不包括组织密码库的项目。仅会导出密码库项目信息,不包括关联的密码历史记录或附件。", + "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目,不包括组织密码库的项目。仅会导出密码库项目信息,不包括关联的密码历史记录和附件。", "placeholders": { "email": { "content": "$1", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "仅会导出与 $ORGANIZATION$ 关联的组织密码库。个人或其他组织的密码库项目不会导出。", + "exportingOrganizationVaultDesc": { + "message": "仅会导出与 $ORGANIZATION$ 关联的组织密码库数据。不包括个人密码库和其他组织中的项目。", "placeholders": { "organization": { "content": "$1", @@ -6512,7 +6546,7 @@ "message": "正在导出组织机密数据" }, "exportingOrganizationSecretDataDescription": { - "message": "仅会导出与 $ORGANIZATION$ 关联的机密管理器数据。不包括其他产品中的项目或来自其他组织的项目。", + "message": "仅会导出与 $ORGANIZATION$ 关联的机密管理器数据。不包括其他产品中的项目和来自其他组织的项目。", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "要求现有成员更改他们的密码" }, - "region": { - "message": "区域" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "欧盟", - "description": "European Union" - }, - "us": { - "message": "美国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "您无权删除此工程", @@ -6828,7 +6857,7 @@ "message": "受信任的设备" }, "memberDecryptionTdeDescriptionPartOne": { - "message": "验证后,成员将使用存储在他们的设备上的密钥解密密码库数据。使用此选项后,", + "message": "验证后,成员将使用存储在他们设备上的密钥解密密码库数据。使用此选项后,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Once authenticated, members will decrypt vault data using a key stored on their device. The single organization policy and account recovery administration policy with automatic enrollment will turn on when this option is used.'" }, "memberDecryptionTdeDescriptionLinkOne": { @@ -6967,7 +6996,7 @@ "message": "邀请用户" }, "secretsManagerForPlan": { - "message": "用于 $PLAN$ 的机密管理器", + "message": "适用于 $PLAN$ 的机密管理器", "placeholders": { "plan": { "content": "$1", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "附加服务账户" }, - "additionalServiceAccountsDesc": { - "message": "您的计划包含 $COUNT$ 个服务账户。您也可以以 $COST$ 每月购买附加服务账户。", + "includedServiceAccounts": { + "message": "您的计划包含 $COUNT$ 个服务账户。", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "您可以以 $COST$ 每月购买附加服务账户。", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "最大潜在服务账户费用" + }, + "smBetaEndedDesc": { + "message": "机密管理器 Beta 版已于 $BETA_ENDING_DATE$ 结束。您还剩余 $DAYS$ 天时间将机密管理器添加到您的付费订阅中,以保持对其数据的访问权限。联系客户成功团队将机密管理器添加到您的订阅中。", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta 版即将结束" + }, + "beta": { + "message": "Beta" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 783b1c8fca4..fff4ae12c6e 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -711,12 +711,18 @@ "unexpectedError": { "message": "發生了未預期的錯誤。" }, + "expirationDateError": { + "message": "Please select an expiration date that is in the future." + }, "emailAddress": { "message": "電子郵件地址" }, "yourVaultIsLocked": { "message": "密碼庫已鎖定。請驗證主密碼以繼續。" }, + "uuid": { + "message": "UUID" + }, "unlock": { "message": "解鎖" }, @@ -948,6 +954,9 @@ "copyVerificationCode": { "message": "複製驗證碼" }, + "copyUuid": { + "message": "Copy UUID" + }, "warning": { "message": "警告" }, @@ -1284,6 +1293,31 @@ "importEncKeyError": { "message": "解密匯出的檔案時發生錯誤,您的加密金鑰與匯出資料時使用的金鑰不同。" }, + "importDestination": { + "message": "Import destination" + }, + "learnAboutImportOptions": { + "message": "Learn about your import options" + }, + "selectImportFolder": { + "message": "Select a folder" + }, + "selectImportCollection": { + "message": "Select a collection" + }, + "importTargetHint": { + "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", + "placeholders": { + "destination": { + "content": "$1", + "example": "folder or collection" + } + } + }, + "importUnassignedItemsError": { + "message": "File contains unassigned items." + }, "selectFormat": { "message": "選擇匯入檔案的格式" }, @@ -3590,8 +3624,8 @@ "attachmentsNeedFix": { "message": "此項目包含需要修正的舊檔案附件。" }, - "attachmentFixDesc": { - "message": "這是一個需要修正的舊檔案附件。點選此處以深入了解。" + "attachmentFixDescription": { + "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." }, "fix": { "message": "修正", @@ -5429,8 +5463,8 @@ } } }, - "exportingOrganizationVaultDescription": { - "message": "只會匯出與 $ORGANIZATION$ 關聯的組織密碼庫。個人密碼庫和其他組織的項目不包含在內。", + "exportingOrganizationVaultDesc": { + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -6802,16 +6836,11 @@ "enforceOnLoginDesc": { "message": "Require existing members to change their passwords" }, - "region": { - "message": "區域" + "usDomain": { + "message": "bitwarden.com" }, - "eu": { - "message": "歐盟", - "description": "European Union" - }, - "us": { - "message": "美國", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "smProjectDeleteAccessRestricted": { "message": "You don't have permissions to delete this project", @@ -7023,15 +7052,20 @@ "additionalServiceAccounts": { "message": "新增服務帳號" }, - "additionalServiceAccountsDesc": { - "message": "您的方案內含 $COUNT$ 組服務帳號,可再以每月 $COST$ 費用新增更多服務帳號。", + "includedServiceAccounts": { + "message": "Your plan comes with $COUNT$ service accounts.", "placeholders": { "count": { "content": "$1", "example": "50" - }, + } + } + }, + "addAdditionalServiceAccounts": { + "message": "You can add additional service accounts for $COST$ per month.", + "placeholders": { "cost": { - "content": "$2", + "content": "$1", "example": "$0.50" } } @@ -7059,5 +7093,24 @@ }, "maxServiceAccountCost": { "message": "可能的最大服務帳號成本" + }, + "smBetaEndedDesc": { + "message": "The Secrets Manager Beta ended $BETA_ENDING_DATE$. You have $DAYS$ days left to add Secrets Manager to your paid subscription and maintain access to Secrets Manager data. Contact Customer Success to add Secrets Manager to your subscription.", + "placeholders": { + "beta_ending_date": { + "content": "$1", + "example": "August 1, 2023" + }, + "days": { + "content": "$2", + "example": "11" + } + } + }, + "betaEnding": { + "message": "Beta Ending" + }, + "beta": { + "message": "Beta" } } From 3a2d89c9488976a2f07f97c2dbdb21e8837efe27 Mon Sep 17 00:00:00 2001 From: Jonathan Prusik Date: Tue, 15 Aug 2023 09:28:05 -0400 Subject: [PATCH 265/299] [PM-2597] Do not show the notification banner on the configured bitwarden vault domain (#5863) * ignore TLD when checking for no banner display on a vault page * do not show the notification banner on the configured bitwarden vault domain * add types --- .../src/autofill/content/notification-bar.ts | 110 ++++++++++-------- apps/browser/src/autofill/types/index.ts | 41 +++++++ 2 files changed, 100 insertions(+), 51 deletions(-) create mode 100644 apps/browser/src/autofill/types/index.ts diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 41d8f145600..5bccd1d2a22 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -3,6 +3,7 @@ import ChangePasswordRuntimeMessage from "../../background/models/changePassword import AutofillField from "../models/autofill-field"; import { WatchedForm } from "../models/watched-form"; import { FormData } from "../services/abstractions/autofill.service"; +import { UserSettings } from "../types"; interface HTMLElementWithFormOpId extends HTMLElement { formOpId: string; @@ -26,10 +27,64 @@ interface HTMLElementWithFormOpId extends HTMLElement { * and async scripts to finish loading. * https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event */ -document.addEventListener("DOMContentLoaded", (event) => { - // Do not show the notification bar on the Bitwarden vault - // because they can add logins and change passwords there - if (window.location.hostname.endsWith("vault.bitwarden.com")) { +document.addEventListener("DOMContentLoaded", async (event) => { + // These are preferences for whether to show the notification bar based on the user's settings + // and they are set in the Settings > Options page in the browser extension. + let disabledAddLoginNotification = false; + let disabledChangedPasswordNotification = false; + let showNotificationBar = true; + + // Look up the active user id from storage + const activeUserIdKey = "activeUserId"; + let activeUserId: string; + await chrome.storage.local.get(activeUserIdKey, (obj: any) => { + if (obj == null || obj[activeUserIdKey] == null) { + return; + } + activeUserId = obj[activeUserIdKey]; + }); + + // Look up the user's settings from storage + await chrome.storage.local.get(activeUserId, (obj: any) => { + if (obj?.[activeUserId] == null) { + return; + } + + const userSettings: UserSettings = obj[activeUserId].settings; + + // Do not show the notification bar on the Bitwarden vault + // because they can add logins and change passwords there + if (window.location.origin === userSettings.serverConfig.environment.vault) { + showNotificationBar = false; + + return; + } + + // NeverDomains is a dictionary of domains that the user has chosen to never + // show the notification bar on (for login detail collection or password change). + // It is managed in the Settings > Excluded Domains page in the browser extension. + // Example: '{"bitwarden.com":null}' + const excludedDomainsDict = userSettings.neverDomains; + + if ( + excludedDomainsDict != null && + // eslint-disable-next-line + excludedDomainsDict.hasOwnProperty(window.location.hostname) + ) { + return; + } + + // Set local disabled preferences + disabledAddLoginNotification = userSettings.disableAddLoginNotification; + disabledChangedPasswordNotification = userSettings.disableChangedPasswordNotification; + + if (!disabledAddLoginNotification || !disabledChangedPasswordNotification) { + // If the user has not disabled both notifications, then handle the initial page change (null -> actual page) + handlePageChange(); + } + }); + + if (!showNotificationBar) { return; } @@ -77,53 +132,6 @@ document.addEventListener("DOMContentLoaded", (event) => { ]); const changePasswordButtonContainsNames = new Set(["pass", "change", "contras", "senha"]); - // These are preferences for whether to show the notification bar based on the user's settings - // and they are set in the Settings > Options page in the browser extension. - let disabledAddLoginNotification = false; - let disabledChangedPasswordNotification = false; - - // Look up the active user id from storage - const activeUserIdKey = "activeUserId"; - let activeUserId: string; - chrome.storage.local.get(activeUserIdKey, (obj: any) => { - if (obj == null || obj[activeUserIdKey] == null) { - return; - } - activeUserId = obj[activeUserIdKey]; - }); - - // Look up the user's settings from storage - chrome.storage.local.get(activeUserId, (obj: any) => { - if (obj?.[activeUserId] == null) { - return; - } - - const userSettings = obj[activeUserId].settings; - - // NeverDomains is a dictionary of domains that the user has chosen to never - // show the notification bar on (for login detail collection or password change). - // It is managed in the Settings > Excluded Domains page in the browser extension. - // Example: '{"bitwarden.com":null}' - const excludedDomainsDict = userSettings.neverDomains; - - if ( - excludedDomainsDict != null && - // eslint-disable-next-line - excludedDomainsDict.hasOwnProperty(window.location.hostname) - ) { - return; - } - - // Set local disabled preferences - disabledAddLoginNotification = userSettings.disableAddLoginNotification; - disabledChangedPasswordNotification = userSettings.disableChangedPasswordNotification; - - if (!disabledAddLoginNotification || !disabledChangedPasswordNotification) { - // If the user has not disabled both notifications, then handle the initial page change (null -> actual page) - handlePageChange(); - } - }); - // Message Processing // Listen for messages from the background script diff --git a/apps/browser/src/autofill/types/index.ts b/apps/browser/src/autofill/types/index.ts new file mode 100644 index 00000000000..d6891325353 --- /dev/null +++ b/apps/browser/src/autofill/types/index.ts @@ -0,0 +1,41 @@ +import { Region } from "@bitwarden/common/platform/abstractions/environment.service"; +import { VaultTimeoutAction } from "@bitwarden/common/src/enums/vault-timeout-action.enum"; + +export type UserSettings = { + avatarColor: string | null; + environmentUrls: { + api: string | null; + base: string | null; + events: string | null; + icons: string | null; + identity: string | null; + keyConnector: string | null; + notifications: string | null; + webVault: string | null; + }; + pinProtected: { [key: string]: any }; + region: Region; + serverConfig: { + environment: { + api: string | null; + cloudRegion: string | null; + identity: string | null; + notifications: string | null; + sso: string | null; + vault: string | null; + }; + featureStates: { [key: string]: any }; + gitHash: string; + server: { [key: string]: any }; + utcDate: string; + version: string; + }; + settings: { + equivalentDomains: string[][]; + }; + neverDomains?: { [key: string]: any }; + disableAddLoginNotification?: boolean; + disableChangedPasswordNotification?: boolean; + vaultTimeout: number; + vaultTimeoutAction: VaultTimeoutAction; +}; From 993f37fbae3b7b011c0fe7235398a1ef85eba5c7 Mon Sep 17 00:00:00 2001 From: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Date: Tue, 15 Aug 2023 11:35:01 -0400 Subject: [PATCH 266/299] PM-3451 - Update password reprompt logic checks to ensure we have an existing cipher in the add/edit flows to avoid showing the MP reprompt in new cipher scenarios (#6031) --- .../src/app/vault/individual-vault/vault.component.ts | 9 ++++++++- apps/web/src/app/vault/org-vault/vault.component.ts | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts index 70149cc0026..ba32a27aed8 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -604,7 +604,14 @@ export class VaultComponent implements OnInit, OnDestroy { async editCipherId(id: string) { const cipher = await this.cipherService.get(id); - if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + // if cipher exists (cipher is null when new) and MP reprompt + // is on for this cipher, then show password reprompt + if ( + cipher && + cipher.reprompt !== 0 && + !(await this.passwordRepromptService.showPasswordPrompt()) + ) { + // didn't pass password prompt, so don't open add / edit modal this.go({ cipherId: null, itemId: null }); return; } diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index 8370b78cdc3..cfeafbf032c 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -600,7 +600,14 @@ export class VaultComponent implements OnInit, OnDestroy { additionalComponentParameters?: (comp: AddEditComponent) => void ) { const cipher = await this.cipherService.get(cipherId); - if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { + // if cipher exists (cipher is null when new) and MP reprompt + // is on for this cipher, then show password reprompt + if ( + cipher && + cipher.reprompt !== 0 && + !(await this.passwordRepromptService.showPasswordPrompt()) + ) { + // didn't pass password prompt, so don't open add / edit modal this.go({ cipherId: null, itemId: null }); return; } From b56bb19c023f9ae71490d10063f10adc1812897d Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 15 Aug 2023 19:25:51 +0200 Subject: [PATCH 267/299] [CL-117] Update storybook, re-add addon-designs and add eslint (#6015) --- .eslintrc.json | 3 +- .github/CODEOWNERS | 3 +- .storybook/main.ts | 1 + package-lock.json | 5202 +++++++++++++++++++++++++++++++------------- package.json | 14 +- 5 files changed, 3646 insertions(+), 1577 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index afa134a65ed..f3115898ff8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -20,7 +20,8 @@ "plugin:import/recommended", "plugin:import/typescript", "prettier", - "plugin:rxjs/recommended" + "plugin:rxjs/recommended", + "plugin:storybook/recommended" ], "settings": { "import/parsers": { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1aed9c1be8c..15de72d785b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -74,6 +74,7 @@ apps/web/src/translation-constants.ts @bitwarden/team-platform-dev apps/browser/src/autofill @bitwarden/team-autofill-dev ## Component Library ## +.storybook @bitwarden/team-platform-dev libs/components @bitwarden/team-platform-dev ## Desktop native module ## @@ -95,7 +96,7 @@ apps/desktop/src/package.json package-lock.json -## Locales ## +## Locales ## apps/browser/src/_locales/en/messages.json apps/cli/src/locales/en/messages.json apps/desktop/src/locales/en/messages.json diff --git a/.storybook/main.ts b/.storybook/main.ts index a7f12f469ba..acc6e2a56db 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -15,6 +15,7 @@ const config: StorybookConfig = { "@storybook/addon-links", "@storybook/addon-essentials", "@storybook/addon-a11y", + "@storybook/addon-designs", { name: "@storybook/addon-docs", options: { diff --git a/package-lock.json b/package-lock.json index df157a9cff3..b80ec615f22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,11 +83,12 @@ "@electron/rebuild": "3.2.13", "@fluffy-spoon/substitute": "1.208.0", "@ngtools/webpack": "15.2.8", - "@storybook/addon-a11y": "7.0.18", - "@storybook/addon-actions": "7.0.18", - "@storybook/addon-essentials": "7.0.18", - "@storybook/addon-links": "7.0.18", - "@storybook/angular": "7.0.18", + "@storybook/addon-a11y": "7.2.2", + "@storybook/addon-actions": "7.2.2", + "@storybook/addon-designs": "7.0.4", + "@storybook/addon-essentials": "7.2.2", + "@storybook/addon-links": "7.2.2", + "@storybook/angular": "7.2.2", "@types/argon2-browser": "1.18.1", "@types/chrome": "0.0.237", "@types/duo_web_sdk": "2.7.1", @@ -136,6 +137,7 @@ "eslint-plugin-import": "2.27.5", "eslint-plugin-rxjs": "5.0.3", "eslint-plugin-rxjs-angular": "2.0.1", + "eslint-plugin-storybook": "0.6.13", "eslint-plugin-tailwindcss": "3.12.1", "gulp": "4.0.2", "gulp-filter": "7.0.0", @@ -166,7 +168,7 @@ "rimraf": "5.0.1", "sass": "1.62.1", "sass-loader": "13.3.1", - "storybook": "7.0.18", + "storybook": "7.2.2", "style-loader": "3.3.3", "tailwindcss": "3.3.2", "ts-jest": "29.1.0", @@ -1838,9 +1840,9 @@ "dev": true }, "node_modules/@aw-web-design/x-default-browser": { - "version": "1.4.88", - "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.88.tgz", - "integrity": "sha512-AkEmF0wcwYC2QkhK703Y83fxWARttIWXDmQN8+cof8FmFZ5BRhnNXGymeb1S73bOCLfWjYELxtujL56idCN/XA==", + "version": "1.4.126", + "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", + "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", "dev": true, "dependencies": { "default-browser-id": "3.0.0" @@ -1850,44 +1852,109 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", - "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1898,11 +1965,11 @@ } }, "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -1911,6 +1978,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1925,9 +2005,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1973,58 +2053,86 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", - "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dependencies": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", - "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.22.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2033,24 +2141,48 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", - "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2059,10 +2191,22 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2095,205 +2239,82 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", - "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", - "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", - "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", - "dependencies": { - "@babel/types": "^7.22.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2302,131 +2323,101 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", - "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2436,6 +2427,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -2444,64 +2436,90 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -2573,9 +2591,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", - "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2584,12 +2602,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2599,14 +2617,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2939,12 +2957,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", - "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", + "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2954,12 +2972,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2969,12 +2987,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", - "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3008,12 +3026,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3125,12 +3143,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3156,12 +3174,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3171,14 +3189,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", - "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -3206,12 +3224,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3221,12 +3239,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3236,13 +3254,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", - "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3252,13 +3270,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", - "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -3269,19 +3287,19 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -3291,14 +3309,38 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3307,13 +3349,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3323,13 +3379,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3339,12 +3395,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3354,12 +3410,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", - "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -3370,13 +3426,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3386,12 +3442,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", - "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -3402,13 +3458,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", - "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", + "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-flow": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3418,12 +3474,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3433,14 +3489,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3450,12 +3506,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", - "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -3466,12 +3522,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3481,12 +3537,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", - "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -3497,12 +3553,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3512,13 +3568,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3528,13 +3584,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3544,15 +3600,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3562,13 +3618,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3578,13 +3634,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3594,12 +3650,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3609,12 +3665,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", - "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -3625,12 +3681,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", - "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -3641,16 +3697,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", - "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.3" + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3660,13 +3716,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3676,12 +3732,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", - "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -3692,13 +3748,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", - "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -3709,12 +3765,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", - "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3724,13 +3780,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", - "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3740,14 +3796,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", - "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -3757,32 +3813,25 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3792,13 +3841,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -3808,12 +3857,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3852,12 +3901,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3867,13 +3916,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3883,12 +3932,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3898,12 +3947,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3913,12 +3962,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3928,15 +3977,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz", + "integrity": "sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3945,13 +3994,25 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3961,13 +4022,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", - "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3977,13 +4038,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3993,13 +4054,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", - "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -4107,14 +4168,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz", - "integrity": "sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz", + "integrity": "sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-flow-strip-types": "^7.21.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-flow-strip-types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -4140,16 +4201,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -4159,9 +4220,9 @@ } }, "node_modules/@babel/register": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz", - "integrity": "sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz", + "integrity": "sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -4287,9 +4348,9 @@ } }, "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4317,6 +4378,7 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", @@ -4327,18 +4389,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -4347,11 +4409,11 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -4360,6 +4422,17 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -4374,12 +4447,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -4614,72 +4687,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", - "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-transform-optional-chaining": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@compodoc/compodoc/node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", - "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@compodoc/compodoc/node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", - "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@compodoc/compodoc/node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", - "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@compodoc/compodoc/node_modules/@babel/preset-env": { "version": "7.22.4", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", @@ -4783,20 +4790,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@compodoc/compodoc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5378,6 +5371,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -5394,6 +5388,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -5410,6 +5405,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -5426,6 +5422,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=12" } @@ -5442,6 +5439,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=12" } @@ -5458,6 +5456,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -5474,6 +5473,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -5490,6 +5490,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5506,6 +5507,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5522,6 +5524,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5538,6 +5541,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5554,6 +5558,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5570,6 +5575,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5586,6 +5592,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5602,6 +5609,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5618,6 +5626,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -5634,6 +5643,7 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -5650,6 +5660,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -5666,6 +5677,7 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=12" } @@ -5682,6 +5694,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -5698,6 +5711,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -5714,6 +5728,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -5847,6 +5862,66 @@ "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", "dev": true }, + "node_modules/@figspec/components": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@figspec/components/-/components-1.0.2.tgz", + "integrity": "sha512-rTjjH7wvM55ZuX+MRVPND1cs4Z4JspJvKc9lzGxm/8gD4dLfgeFztQuNy+daGglaxcGXLXTuJ2oJtZ0/lmRKmw==", + "dev": true, + "dependencies": { + "lit": "^2.1.3" + } + }, + "node_modules/@figspec/react": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@figspec/react/-/react-1.0.3.tgz", + "integrity": "sha512-r683qOko+5CbT48Ox280fMx2MNAtaFPgCNJvldOqN3YtmAzlcTT+YSxd3OahA+kjXGGrnzDbUgeTOX1cPLII+g==", + "dev": true, + "dependencies": { + "@figspec/components": "^1.0.1", + "@lit-labs/react": "^1.0.2" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dev": true, + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "dev": true, + "dependencies": { + "@floating-ui/dom": "^1.3.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==", + "dev": true + }, "node_modules/@fluffy-spoon/substitute": { "version": "1.208.0", "resolved": "https://registry.npmjs.org/@fluffy-spoon/substitute/-/substitute-1.208.0.tgz", @@ -6596,6 +6671,27 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@lit-labs/react": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/react/-/react-1.2.1.tgz", + "integrity": "sha512-DiZdJYFU0tBbdQkfwwRSwYyI/mcWkg3sWesKRsHUd4G+NekTmmeq9fzsurvcKTNVa0comNljwtg4Hvi1ds3V+A==", + "dev": true + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", + "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==", + "dev": true + }, + "node_modules/@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "dev": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, "node_modules/@malept/cross-spawn-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", @@ -6763,9 +6859,9 @@ } }, "node_modules/@ndelangen/get-tarball": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.7.tgz", - "integrity": "sha512-NqGfTZIZpRFef1GoVaShSSRwDC3vde3ThtTeqFdcYd6ipKqnfEVhjK2hUeHjCQUcptyZr2TONqcloFXM+5QBrQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", + "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", "dev": true, "dependencies": { "gunzip-maybe": "^1.4.2", @@ -7096,6 +7192,527 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", + "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", + "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", + "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", + "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.2", + "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "node_modules/@schematics/angular": { "version": "15.2.8", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.8.tgz", @@ -7276,21 +7893,21 @@ } }, "node_modules/@storybook/addon-a11y": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.18.tgz", - "integrity": "sha512-kftOzFBpg3goWbLBXDLLsJslfrKYbHs1xtFEH5/4J9NFNE8vZKbIBDQa/R3ezWheL+l2y+5qOlWoLl5z96zlWA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.2.2.tgz", + "integrity": "sha512-gMGP5GdnTENdv5M1+1buk2n9md43jx6S8ZCsXlRagpVM57+jE9WyKtV6R+BPwfX2lBY45nhAj7Qmiy+OrUHarA==", "dev": true, "dependencies": { - "@storybook/addon-highlight": "7.0.18", - "@storybook/channels": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/addon-highlight": "7.2.2", + "@storybook/channels": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" @@ -7313,19 +7930,19 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.18.tgz", - "integrity": "sha512-3M5AU/ZD79YP88vKlFezIJbIoG/II7wCixUBTmwiC3BeQZDuVsqPNl8eiP6MGT70xwyx7a993lSM5f5N5W93vg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.2.2.tgz", + "integrity": "sha512-Ev9oGlpxrt7tCpCmAYA04hsZYKnZIiksaQDCgKAf6I2+yUZBBkZh490yBPkMExpH5bLk7fAgjCMZP9gOyzaq3A==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -7362,19 +7979,19 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.18.tgz", - "integrity": "sha512-cPQy1Ot7Urf4hQz+xnF1YKrqSyR0DRwozBmF+sGzceACWmueFl0CifYZC8RSmaiIyVh0RyWPxZ9F/eT67NX2lA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.2.2.tgz", + "integrity": "sha512-ZqSEw9R+ar9jMW6dxfnAAn7hQn9uC9z0om9dbOHNiulOz1CYa62GAyJXU+uZyCyuThqyEa0W8D2+Jsm/s9AuBw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -7396,20 +8013,21 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.18.tgz", - "integrity": "sha512-mD6DE52CCMKugXk2Uab0QxwgfE76kFJroxASmnePnXUNWfP9EZJpJXYE3cyyBbmZuxa46VHDGGEGXQWRl4+Eog==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.2.2.tgz", + "integrity": "sha512-kcFG7RMQJVz3fNvQO+9vjAodKbRrobsdr3WJYN6zmugh+qxEdUvHUUe093t0MpMKp2njY6c9eAbfjN+PrLSCJQ==", "dev": true, "dependencies": { - "@storybook/blocks": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-common": "7.0.18", - "@storybook/manager-api": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/blocks": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/core-events": "7.2.2", + "@storybook/manager-api": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -7430,29 +8048,54 @@ } } }, - "node_modules/@storybook/addon-docs": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.18.tgz", - "integrity": "sha512-oq+ZN5809gIRdTZQIpeK1F8BJtL1/VWo9rWvl6ymVOL/Xzdgd7AOfKf9Y99X35RcxAGysRIHLGJjF4bgLoY1Aw==", + "node_modules/@storybook/addon-designs": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@storybook/addon-designs/-/addon-designs-7.0.4.tgz", + "integrity": "sha512-u2Nxa69C6/VuuVI/Uc0vB2Hk+TOt2L/bAatowRBLcVtv7HiDpNuuc7OyW9QJMIzXZ6aVLjI59k53llz7BfExbA==", + "dev": true, + "dependencies": { + "@figspec/react": "^1.0.0" + }, + "peerDependencies": { + "@storybook/addon-docs": "^7.0.0", + "@storybook/addons": "^7.0.0", + "@storybook/components": "^7.0.0", + "@storybook/manager-api": "^7.0.0", + "@storybook/preview-api": "^7.0.0", + "@storybook/theming": "^7.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-docs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.2.2.tgz", + "integrity": "sha512-rQZ/LAC1oAQityI/NNwntLellAT2yrT7vQAPhHBpaVi/AOdT87wTkCyxnFJj/y3XYDAs4XgUqgbIKSIcRni/eA==", "dev": true, "dependencies": { - "@babel/core": "^7.20.2", - "@babel/plugin-transform-react-jsx": "^7.19.0", "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/csf-plugin": "7.0.18", - "@storybook/csf-tools": "7.0.18", + "@storybook/blocks": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/csf-plugin": "7.2.2", + "@storybook/csf-tools": "7.2.2", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.0.18", - "@storybook/postinstall": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/react-dom-shim": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/node-logger": "7.2.2", + "@storybook/postinstall": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/react-dom-shim": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -7482,24 +8125,24 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.18.tgz", - "integrity": "sha512-0XXu7xhtRefA1WxxorKk6BWeeB+7gQ+r2+bG1zQEfBgDYPR06YbPw4H79IZ8JiR97aJRsZBK5UUhOZMDrc5zcQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.2.2.tgz", + "integrity": "sha512-x99psHZqtHFE7IKnJ3ruZIGe2xkb/xb0IQHya+zmdGHxNkcIeZVCLidPJRjrplJGmykRg+B25q2330CMIUYd9Q==", "dev": true, "dependencies": { - "@storybook/addon-actions": "7.0.18", - "@storybook/addon-backgrounds": "7.0.18", - "@storybook/addon-controls": "7.0.18", - "@storybook/addon-docs": "7.0.18", - "@storybook/addon-highlight": "7.0.18", - "@storybook/addon-measure": "7.0.18", - "@storybook/addon-outline": "7.0.18", - "@storybook/addon-toolbars": "7.0.18", - "@storybook/addon-viewport": "7.0.18", - "@storybook/core-common": "7.0.18", - "@storybook/manager-api": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/preview-api": "7.0.18", + "@storybook/addon-actions": "7.2.2", + "@storybook/addon-backgrounds": "7.2.2", + "@storybook/addon-controls": "7.2.2", + "@storybook/addon-docs": "7.2.2", + "@storybook/addon-highlight": "7.2.2", + "@storybook/addon-measure": "7.2.2", + "@storybook/addon-outline": "7.2.2", + "@storybook/addon-toolbars": "7.2.2", + "@storybook/addon-viewport": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/manager-api": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/preview-api": "7.2.2", "ts-dedent": "^2.0.0" }, "funding": { @@ -7512,14 +8155,14 @@ } }, "node_modules/@storybook/addon-highlight": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.18.tgz", - "integrity": "sha512-a3nfUhbu6whoDclIZSV/fzLj132tNNjV05ENTpuN3JpLoMd3+obDUWzeQUs9TetK4RBRN3ewM7sIMEI4oBpgmg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.2.2.tgz", + "integrity": "sha512-jyuxPPTg3q021GYBzA+JoBO2ece6B4gt4ZqtWjKbOpTHpUyzkH6IBcBuWGtgGcQgrCGlmb5B8QCLAb8Cmy6VJg==", "dev": true, "dependencies": { - "@storybook/core-events": "7.0.18", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.0.18" + "@storybook/preview-api": "7.2.2" }, "funding": { "type": "opencollective", @@ -7527,19 +8170,19 @@ } }, "node_modules/@storybook/addon-links": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.18.tgz", - "integrity": "sha512-xEwflt7bp9FRoZVeqPGb6d3s2Gh+/jaSmnyIxMxrBy2oovKIqu9ptolqz1AhjFOXfaLs9c2RAmJUuFZJtETLxA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.2.2.tgz", + "integrity": "sha512-bRK0B1QLzpCJ80Cdk/SgA5qlT3RxRkouaJU/rcFc3obHng4bUBr164SLKDgWOHawSrBn3dohO0HIz2o8AevgmA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/router": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/router": "7.2.2", + "@storybook/types": "7.2.2", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" }, @@ -7561,18 +8204,19 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.18.tgz", - "integrity": "sha512-iu8vQpGOA+CFYbWR6QNshj20o33OQ/xcTbp5P4U6xGYDUliUBbwJ2KLxcKlmIeBanBrBdz0jPFtHwY4dM1ZdKw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.2.2.tgz", + "integrity": "sha512-gzXj28rqmtHyTKorGleP8+wlvvT6RQMsKtdHCJL/yT3Q9+REQ4/5lAgw+jKqSG+Ka6FxUYWlCN9nD5fRwxtXyQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/types": "7.0.18" + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/types": "7.2.2", + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", @@ -7592,18 +8236,18 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.18.tgz", - "integrity": "sha512-3vNWO7ezo6GIvidbz8JxFrKtfVEoTQN7tnZx+wpqmCF8ihBORewkpeMUnvgb9ZKjD0X7gE8eQvvG8KKWcyHDBQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.2.2.tgz", + "integrity": "sha512-Mh6tOiRWVQRgMQlH2GAh2Ov3uf4wmtGXV7MBfKmqxowIp6HGCd4ZJ5tTOgD8ANRFIloH57oSa2/Jf/qiUg0/OQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/types": "7.2.2", "ts-dedent": "^2.0.0" }, "funding": { @@ -7624,16 +8268,16 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.18.tgz", - "integrity": "sha512-mwhq962o0WloHAeFjJ6BXO2nzdTo5KE2fqawPpqcB2lwXP6tvaA2tDWwgntjPCHejqWTS+ZTdO4/1xrMhWYt/g==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.2.2.tgz", + "integrity": "sha512-KQkFwLEqi/Xm9wq6mqaqO6VEW7+Sgbr8BUtVRAB9sSpy2mlhZEzZpcWKjuHmyMb9/eiRvnicM9kXxz0tHAF0jA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18" + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2" }, "funding": { "type": "opencollective", @@ -7653,18 +8297,18 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.18.tgz", - "integrity": "sha512-aVVLBsWXfGDX3z1pc93LWWdG5RUoJbGL/JJPMZGwXdwWpP8V3OBl8D8bgPymyg+MgwhSRZZDDGgnJaVGGwZ6bQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.2.2.tgz", + "integrity": "sha512-6qjtkFSV+9Fxw/nS5X7b5xC1kbk+CMGUEZhzmqM+iYtijHZmK0K1+x6AoR/mOul/rLL2YT73U3OYCCKWV9lemQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" }, @@ -7686,14 +8330,14 @@ } }, "node_modules/@storybook/addons": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.0.18.tgz", - "integrity": "sha512-+j9ItxWoVzarbllaV4WRaJpDM3P2aC5O6F3cPn4YkG/unb6HOs11WLAqFbzZnLYZNAFvWS8PYEAtqs1BxG66YQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.2.2.tgz", + "integrity": "sha512-yWBBpBcRyPP1deAjzWV9OAXrPfeRd/vRpJw09dWHzuD3xtnd3jZ2h+t1r9a5yTSQbP5GO1YdS/WOK5Uf9hcsuw==", "dev": true, "dependencies": { - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/types": "7.0.18" + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/types": "7.2.2" }, "funding": { "type": "opencollective", @@ -7705,26 +8349,25 @@ } }, "node_modules/@storybook/angular": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-7.0.18.tgz", - "integrity": "sha512-dNATvKB4UntYlG65fiCwN86Wu7WOlXTYoTA2I5UoXUMPzREBtSLFAY4XOmsXHGp8PQSAX7voa3vK9fk1yxi8iA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-7.2.2.tgz", + "integrity": "sha512-NXJWXII0rIFTbLZapvaD2Qg/IBe4VQsorbwuiie6/ZBdnCj+DtJwFQ3usVhuPR11woFAvBiWqaxXofsfPmOueQ==", "dev": true, "dependencies": { - "@storybook/builder-webpack5": "7.0.18", - "@storybook/cli": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/core-client": "7.0.18", - "@storybook/core-common": "7.0.18", - "@storybook/core-events": "7.0.18", - "@storybook/core-server": "7.0.18", - "@storybook/core-webpack": "7.0.18", - "@storybook/docs-tools": "7.0.18", + "@storybook/builder-webpack5": "7.2.2", + "@storybook/cli": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/core-events": "7.2.2", + "@storybook/core-server": "7.2.2", + "@storybook/core-webpack": "7.2.2", + "@storybook/docs-tools": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/telemetry": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/telemetry": "7.2.2", + "@storybook/types": "7.2.2", "@types/node": "^16.0.0", "@types/react": "^16.14.34", "@types/react-dom": "^16.9.14", @@ -7735,7 +8378,7 @@ "semver": "^7.3.7", "telejson": "^7.0.3", "ts-dedent": "^2.0.0", - "tsconfig-paths-webpack-plugin": "^3.5.2", + "tsconfig-paths-webpack-plugin": "^4.0.1", "util-deprecate": "^1.0.2", "webpack": "5" }, @@ -7777,60 +8420,23 @@ "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", "dev": true }, - "node_modules/@storybook/angular/node_modules/tsconfig-paths-webpack-plugin": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", - "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" - } - }, - "node_modules/@storybook/api": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-7.0.18.tgz", - "integrity": "sha512-gikVJBR2z7LdepljmbvbsrYgywQm3jNEEEmjG0OwYDeYNjWPuoQSffT+LoyouaaCK90d1osJLl3062OkwlIG8g==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/manager-api": "7.0.18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/@storybook/blocks": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.18.tgz", - "integrity": "sha512-HLsuzmUdVIeFXEP5v5vyjnEePRNYjzltwTjCKQhHAlt8/aQZmREiIMOfoMoAa1Rd+On8Ib2DUd2cN10VS18H8A==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.2.2.tgz", + "integrity": "sha512-VgO46E5zA8oo/Cn8kT9o3xiFtnqxlqsRRGp5t8A1YqgN2OvYTtg5/PLS16XH8Qui/m9EvOoT7DlOmcqlp3Z78w==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/channels": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.0.18", + "@storybook/docs-tools": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -7840,6 +8446,7 @@ "polished": "^4.2.2", "react-colorful": "^5.1.2", "telejson": "^7.0.3", + "tocbot": "^4.20.1", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" }, @@ -7853,21 +8460,21 @@ } }, "node_modules/@storybook/builder-manager": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.18.tgz", - "integrity": "sha512-yFMm3xuYkyg2hS1uz3CkvyvLzK7qJsDPVEh7lew8GiJK1Xx8cc+FnAOlRTjWNxvhfiT296wAMCTPWv7LeoSgqQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.2.2.tgz", + "integrity": "sha512-19LqtL5/Yos9/wXqTxg+zOOK6M312eHXAdaYt2REGk1iqJzQXoy4wnmE2rbjBMmD5bUTzWm2vkmHGtkzAjwzzA==", "dev": true, "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.0.18", - "@storybook/manager": "7.0.18", - "@storybook/node-logger": "7.0.18", + "@storybook/core-common": "7.2.2", + "@storybook/manager": "7.2.2", + "@storybook/node-logger": "7.2.2", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", "browser-assert": "^1.2.1", "ejs": "^3.1.8", - "esbuild": "^0.17.0", + "esbuild": "^0.18.0", "esbuild-plugin-alias": "^0.2.1", "express": "^4.17.3", "find-cache-dir": "^3.0.0", @@ -7880,6 +8487,395 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-manager/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/@storybook/builder-manager/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -7895,54 +8891,55 @@ } }, "node_modules/@storybook/builder-webpack5": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.0.18.tgz", - "integrity": "sha512-ciDOHrnChHWjikQwsM+xGz70PGfWurcezCyRPPRY0zimyHWtlug6V1Q9dJAdEAFsxqFSZA/qg7gEcZyqdlTMaA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.2.2.tgz", + "integrity": "sha512-+f2H3tXPZfn3q/eruXCmWPVAopd1MMEAAvneZ4iqlSHPC5HK2dcX/zj3yPar6rjfHHvZBXNm5sSi4WuD5Pw9MA==", "dev": true, "dependencies": { - "@babel/core": "^7.12.10", - "@storybook/addons": "7.0.18", - "@storybook/api": "7.0.18", - "@storybook/channel-postmessage": "7.0.18", - "@storybook/channel-websocket": "7.0.18", - "@storybook/channels": "7.0.18", - "@storybook/client-api": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/components": "7.0.18", - "@storybook/core-common": "7.0.18", - "@storybook/core-events": "7.0.18", - "@storybook/core-webpack": "7.0.18", + "@babel/core": "^7.22.9", + "@storybook/addons": "7.2.2", + "@storybook/channels": "7.2.2", + "@storybook/client-api": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/components": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/core-events": "7.2.2", + "@storybook/core-webpack": "7.2.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/preview": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/router": "7.0.18", - "@storybook/store": "7.0.18", - "@storybook/theming": "7.0.18", + "@storybook/manager-api": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/preview": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/router": "7.2.2", + "@storybook/store": "7.2.2", + "@storybook/theming": "7.2.2", + "@swc/core": "^1.3.49", "@types/node": "^16.0.0", "@types/semver": "^7.3.4", "babel-loader": "^9.0.0", "babel-plugin-named-exports-order": "^0.0.2", "browser-assert": "^1.2.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", + "constants-browserify": "^1.0.0", "css-loader": "^6.7.1", "express": "^4.17.3", - "fork-ts-checker-webpack-plugin": "^7.2.8", + "fork-ts-checker-webpack-plugin": "^8.0.0", "fs-extra": "^11.1.0", "html-webpack-plugin": "^5.5.0", "path-browserify": "^1.0.1", "process": "^0.11.10", "semver": "^7.3.7", "style-loader": "^3.3.1", + "swc-loader": "^0.2.3", "terser-webpack-plugin": "^5.3.1", "ts-dedent": "^2.0.0", + "url": "^0.11.0", "util": "^0.12.4", "util-deprecate": "^1.0.2", "webpack": "5", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^6.1.1", "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.4.3" + "webpack-virtual-modules": "^0.5.0" }, "funding": { "type": "opencollective", @@ -7959,9 +8956,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "16.18.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.33.tgz", - "integrity": "sha512-WjW7iYRVtePnSeLxVfE1e+g1yStJrfR9Anuv4y6JZVgOqYyFcW7GhPBk2/J1d0rC4ZNLrI13lS4e32NUuuRmHA==", + "version": "16.18.40", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.40.tgz", + "integrity": "sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==", "dev": true }, "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { @@ -7979,90 +8976,71 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^3.4.12", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/channel-postmessage": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.18.tgz", - "integrity": "sha512-rpwBH5ANdPnugS6+7xG9qHSoS+aPSEnBxDKsONWFubfMTTXQuFkf/793rBbxGkoINdqh8kSdKOM2rIty6e9cmQ==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/core-events": "7.0.18", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.0.3" + "webpack": "^5.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/channel-websocket": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.18.tgz", - "integrity": "sha512-QYsZIfe23NN4i+oIdPKHaYBehk3a/HYk57a+M2oR3Frmv8IOqc/e31uH+xx5NxnjHrTJj7Y80ZJw6EKB682S6w==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/global": "^5.0.0", - "telejson": "^7.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, "node_modules/@storybook/channels": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.18.tgz", - "integrity": "sha512-rkA7ea0M3+dWS+71iHJdiZ5R2QuIdiVg0CgyLJHDagc1qej7pEVNhMWtppeq+X5Pwp9nkz8ZTQ7aCjTf6th0/A==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.2.2.tgz", + "integrity": "sha512-FkH5QzKkq7smtPlaKTWalJ+sN13H4dWtxdZ+ePFAXaubsBqGqo3Dw3e/hrbjrMqFjTwiKnmj5K5bjhdJcvzi1A==", "dev": true, + "dependencies": { + "@storybook/client-logger": "7.2.2", + "@storybook/core-events": "7.2.2", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.0.3", + "tiny-invariant": "^1.3.1" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/cli": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.18.tgz", - "integrity": "sha512-9n4J4thiCUsGSXiRc6ZysqYUaCMCrpu0/qgC+5ngfFRuMmZgUV0y5+0fmaOhT2XjsonTTgucizO82i7+ottCVg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.2.2.tgz", + "integrity": "sha512-YoXRCRICj4NEqUvYvgVRmk5IJadou6feCymI5r94z7XHQiObMoZd3p6QjyEp8ayi8XpxoJM/Hrddu3hddxUvyw==", "dev": true, "dependencies": { - "@babel/core": "^7.20.2", - "@babel/preset-env": "^7.20.2", + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/types": "^7.22.5", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.0.18", - "@storybook/core-common": "7.0.18", - "@storybook/core-server": "7.0.18", - "@storybook/csf-tools": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/telemetry": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/codemod": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/core-server": "7.2.2", + "@storybook/csf-tools": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/telemetry": "7.2.2", + "@storybook/types": "7.2.2", "@types/semver": "^7.3.4", - "boxen": "^5.1.2", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", "chalk": "^4.1.0", "commander": "^6.2.1", "cross-spawn": "^7.0.3", @@ -8084,8 +9062,7 @@ "puppeteer-core": "^2.1.1", "read-pkg-up": "^7.0.1", "semver": "^7.3.7", - "shelljs": "^0.8.5", - "simple-update-notifier": "^1.0.0", + "simple-update-notifier": "^2.0.0", "strip-json-comments": "^3.0.1", "tempy": "^1.0.1", "ts-dedent": "^2.0.0", @@ -8100,6 +9077,216 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@storybook/cli/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/cli/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/cli/node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/cli/node_modules/@babel/preset-env": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/cli/node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/cli/node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/cli/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/cli/node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/cli/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/cli/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@storybook/cli/node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -8123,14 +9310,59 @@ "node": ">=14.14" } }, - "node_modules/@storybook/client-api": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-7.0.18.tgz", - "integrity": "sha512-EdgE4om6nXZf/sDZcVMGMeKv4BPX+P3EKUfMHCHjlrbbeL0eeY8Ynf+u/wYrIYZPUodS8TEV5XchHVB8F7rLBQ==", + "node_modules/@storybook/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/preview-api": "7.0.18" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/cli/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/cli/node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@storybook/client-api": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-7.2.2.tgz", + "integrity": "sha512-47WDNZ5FdvtQuSijg3IexxFve2aBrBih6VHdKKcel2SSiS0W01043fNMsP1T+m6kJr4jdnp0J5GVQpTQFi8Kxg==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.2.2", + "@storybook/preview-api": "7.2.2" }, "funding": { "type": "opencollective", @@ -8138,9 +9370,9 @@ } }, "node_modules/@storybook/client-logger": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.18.tgz", - "integrity": "sha512-uKgFdVedYoRDZBVrE1IBdWNHDFln1IxWEeI+7ZiNSQwREG9swHpU5Fa8DceclM/oLjJRuzG1jFzv+XZY8894+Q==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.2.2.tgz", + "integrity": "sha512-ULqPNTJsJdlWTQt5V/hEv4CUq7GgrLzLvcjhKB9IYbp4a0gjhinfq7jBFIcXRE8BSOQLui2PDGE3SzElzOp5/g==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8151,18 +9383,19 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.18.tgz", - "integrity": "sha512-+9XFns29e8FpPLsqA8ZCQ3mNnIIKD3QnqGYkbkCVKi/G1fomvVQsIfsnkrYv5SobTbz29B4aNWxAaeSnO7/OGg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.2.2.tgz", + "integrity": "sha512-i8WY3PJeJalVWTjLChlJREYHp42mGw0GXLqTH/q0hbAwzuVBBTrsMqy+oXOWRCAeCGbK5uP10GOLN23s+zuNTQ==", "dev": true, "dependencies": { - "@babel/core": "~7.21.0", - "@babel/preset-env": "~7.21.0", - "@babel/types": "~7.21.2", + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/csf-tools": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/types": "7.2.2", + "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", "jscodeshift": "^0.14.0", @@ -8175,39 +9408,71 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/codemod/node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", + "node_modules/@storybook/codemod/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@storybook/codemod/node_modules/@babel/preset-env": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -8218,45 +9483,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -8265,26 +9547,81 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@storybook/codemod/node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/codemod/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/codemod/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@storybook/codemod/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@storybook/codemod/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@storybook/components": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.18.tgz", - "integrity": "sha512-Jn1CbF9UAKt8BVaZtuhmthpcZ02VMaCFXR0ISfDXCpiMKnylmpP0+WfXcoKLzz6yS+EW8EW5S9+Qq8xgQY8H7A==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.2.2.tgz", + "integrity": "sha512-A2SavROGKFK76w4pfMGr0Zf3A2QaQrnJqPZOfVB6dKrXBwgwM3VhdUj6N8cI9X4W7VaEvEyUWXVTCv+bG+yZtQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", + "@radix-ui/react-select": "^1.2.2", + "@storybook/client-logger": "7.2.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/icons": "^1.1.0", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -8298,40 +9635,29 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/core-client": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.18.tgz", - "integrity": "sha512-ueExRZx6fd9LRssgdhDJ0bL4Ir2RrbXzJz/kjIT2KgYY3l7jkhe0dpT3bOgGKjQt0f7XMFU24t/r7aDLGMB+2Q==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/preview-api": "7.0.18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, "node_modules/@storybook/core-common": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.18.tgz", - "integrity": "sha512-HZAB1NIK/Yv0x9poyzqYcue2tx39+MAF1mbHgGy+JJZRerO2fRShgo8f8VPH9ChbFCoJ7isL5wNhgGdg9kp2kA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.2.2.tgz", + "integrity": "sha512-evLV0oRLhByHVhrncRXdSmQL5VP8jLXUOBPiM63oCnSWDsw4GMt37JrmCYBNM4E1YiJ7zSllmvcFCBmyChcPFA==", "dev": true, "dependencies": { - "@storybook/node-logger": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/node-logger": "7.2.2", + "@storybook/types": "7.2.2", + "@types/find-cache-dir": "^3.2.1", "@types/node": "^16.0.0", + "@types/node-fetch": "^2.6.4", "@types/pretty-hrtime": "^1.0.0", "chalk": "^4.1.0", - "esbuild": "^0.17.0", + "esbuild": "^0.18.0", "esbuild-register": "^3.4.0", - "file-system-cache": "^2.0.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", "find-up": "^5.0.0", "fs-extra": "^11.1.0", - "glob": "^8.1.0", - "glob-promise": "^6.0.2", + "glob": "^10.0.0", "handlebars": "^4.7.7", "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", "picomatch": "^2.3.0", "pkg-dir": "^5.0.0", "pretty-hrtime": "^1.0.3", @@ -8343,12 +9669,410 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/core-common/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", - "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", + "version": "16.18.40", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.40.tgz", + "integrity": "sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==", "dev": true }, + "node_modules/@storybook/core-common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@storybook/core-common/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/@storybook/core-common/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -8363,10 +10087,56 @@ "node": ">=14.14" } }, + "node_modules/@storybook/core-common/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@storybook/core-common/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@storybook/core-common/node_modules/minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@storybook/core-events": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.18.tgz", - "integrity": "sha512-7gxHBQDezdKOeq/u1LL80Bwjfcwsv7XOS3yWQElcgqp+gLaYB6OwwgtkCB2yV6a6l4nep9IdPWE8G3TxIzn9xw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.2.2.tgz", + "integrity": "sha512-0MUsOygFSyYRIWHrVAA7Y7zBoehdILgK2AbnV42qescmPD48YyovkSRiGq0BwSWvuvMRq+094dp7sh2tkfSGHg==", "dev": true, "funding": { "type": "opencollective", @@ -8374,32 +10144,31 @@ } }, "node_modules/@storybook/core-server": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.18.tgz", - "integrity": "sha512-zGSGYSoCaSXM28OYKW7zsmpo8VU1icubXLRgdF21fbMhFN1WVS+bPA5+gSkAMf8acq5RNM8uSKskh7E2YDVEqA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.2.2.tgz", + "integrity": "sha512-djtZIe/dFvjppuUMuTSHq51NW4dgkKAercfHwyyzcvN3m+ZBZdUENCUzBfwsS0+Pn64lVgppg6otm8ckMFilMQ==", "dev": true, "dependencies": { - "@aw-web-design/x-default-browser": "1.4.88", + "@aw-web-design/x-default-browser": "1.4.126", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.0.18", - "@storybook/core-common": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/builder-manager": "7.2.2", + "@storybook/channels": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.0.18", + "@storybook/csf-tools": "7.2.2", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/telemetry": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/manager": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/telemetry": "7.2.2", + "@storybook/types": "7.2.2", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", - "@types/node-fetch": "^2.5.7", "@types/pretty-hrtime": "^1.0.0", "@types/semver": "^7.3.4", - "better-opn": "^2.1.1", - "boxen": "^5.1.2", + "better-opn": "^3.0.2", "chalk": "^4.1.0", "cli-table3": "^0.6.1", "compression": "^1.7.4", @@ -8409,7 +10178,6 @@ "globby": "^11.0.2", "ip": "^2.0.0", "lodash": "^4.17.21", - "node-fetch": "^2.6.7", "open": "^8.4.0", "pretty-hrtime": "^1.0.3", "prompts": "^2.4.0", @@ -8417,7 +10185,9 @@ "semver": "^7.3.7", "serve-favicon": "^2.5.0", "telejson": "^7.0.3", + "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0", + "util": "^0.12.4", "util-deprecate": "^1.0.2", "watchpack": "^2.2.0", "ws": "^8.2.3" @@ -8428,9 +10198,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "16.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", - "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", + "version": "16.18.40", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.40.tgz", + "integrity": "sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==", "dev": true }, "node_modules/@storybook/core-server/node_modules/fs-extra": { @@ -8469,14 +10239,14 @@ } }, "node_modules/@storybook/core-webpack": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.0.18.tgz", - "integrity": "sha512-U5e1r8cgZZzd/Lw9StIrACMVINCvucKm8ZfcFpPh0bjEv4+2qjo9tL3dLNh4OwKznvbzSE6pEO6cBjaphjTe1A==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.2.2.tgz", + "integrity": "sha512-KwdY+mFTWclIJM+qF25u0d4gQ/951uOZkgrsiRheKI5BKwD9omuF2OfLexWKnMEWz+UHzHKoN0QFlxcKs/rddw==", "dev": true, "dependencies": { - "@storybook/core-common": "7.0.18", - "@storybook/node-logger": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/core-common": "7.2.2", + "@storybook/node-logger": "7.2.2", + "@storybook/types": "7.2.2", "@types/node": "^16.0.0", "ts-dedent": "^2.0.0" }, @@ -8486,9 +10256,9 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@types/node": { - "version": "16.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", - "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", + "version": "16.18.40", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.40.tgz", + "integrity": "sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==", "dev": true }, "node_modules/@storybook/csf": { @@ -8501,13 +10271,13 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.18.tgz", - "integrity": "sha512-Cr/Qr4/H4JIYgbbmDjQIYuqjp6nOaZga73R3KZcuClk27B90sI2ADegMYvORgbFgSkwweNQjgak6hLoOyogAhw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.2.2.tgz", + "integrity": "sha512-8iHeK0zfcCIXbcwQm89Bj6Ejqak/dXBwQUMFmgmKzJ4VdyzKdhLgRO3T3EYGsX4AvH0dnuAPONP5uVrGEF8iLw==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.0.18", - "unplugin": "^0.10.2" + "@storybook/csf-tools": "7.2.2", + "unplugin": "^1.3.1" }, "funding": { "type": "opencollective", @@ -8515,17 +10285,17 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.18.tgz", - "integrity": "sha512-0IJ2qdrxleTl67FUzsEvGcy96CY0OKyERE33tAsLNbvWcabdJKpLHP+rJwbsCw4z6IlS+kkmEffeFf5qRPTwkQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.2.2.tgz", + "integrity": "sha512-uO9AXtc64tpEpnoqHk5eYCUUL6nMwo1xHTXgIst9NKOdNSBL1/wvRgaT+rW+AzyXGsBjMwvDNjX/HIptqsoNgw==", "dev": true, "dependencies": { - "@babel/generator": "~7.21.1", - "@babel/parser": "~7.21.2", - "@babel/traverse": "~7.21.2", - "@babel/types": "~7.21.2", + "@babel/generator": "^7.22.9", + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/types": "7.0.18", + "@storybook/types": "7.2.2", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -8536,12 +10306,12 @@ } }, "node_modules/@storybook/csf-tools/node_modules/@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -8585,15 +10355,14 @@ "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.18.tgz", - "integrity": "sha512-H95dW2DquGQ75ZVrFjvznPdCxT0eW6esDnemzLJB61KitcYZrWRavfrZzFtUcpzIa84OgY5pllFYt636v11LHQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.2.2.tgz", + "integrity": "sha512-57PiramTgJio0J8HyKQI8cjb/5pTFvKxWBji8UdM6WUe1EqLIwZbymUcOQZDQWr3H+6bdrm4pgYxj7XglcUa5A==", "dev": true, "dependencies": { - "@babel/core": "^7.12.10", - "@storybook/core-common": "7.0.18", - "@storybook/preview-api": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/core-common": "7.2.2", + "@storybook/preview-api": "7.2.2", + "@storybook/types": "7.2.2", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -8609,10 +10378,23 @@ "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true }, + "node_modules/@storybook/icons": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.1.6.tgz", + "integrity": "sha512-co5gDCYPojRAc5lRMnWxbjrR1V37/rTmAo9Vok4a1hDpHZIwkGTWesdzvYivSQXYFxZTpxdM1b5K3W87brnahw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@storybook/manager": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.18.tgz", - "integrity": "sha512-hasb8XDmkT9lyX2cwb3Xg0ngcNQ1QCNHKurl2YJtXowb1CvawGKokhnVUTso15NCnurolDyw/Wqka1sagfm+Mg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.2.2.tgz", + "integrity": "sha512-a7pGZMj5r5vk39IfB7Ca32DNkSTM6SEp+BZhqc4jMDHwSEsGKOZ+GZtWJipUlB1fEnHtdA3LH6IKTKbcpYP+Rg==", "dev": true, "funding": { "type": "opencollective", @@ -8620,19 +10402,19 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.18.tgz", - "integrity": "sha512-anQkm09twL96YkKGXHa+LI0+yMaY6Jxs1lRaetHdMlIqN4VHBHhizHaMgtGfH6xCTuO3WdrKTN7cZii5RH7PBQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.2.2.tgz", + "integrity": "sha512-7EI7TABGGB3VOTc4q7byC5dW/9A1xUJyR1gfCPU+7XiSNItnCz+seBJMSaf6Em/9wYxSAL6PQAGhrwTHGzgWAA==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/channels": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.0.18", - "@storybook/theming": "7.0.18", - "@storybook/types": "7.0.18", + "@storybook/router": "7.2.2", + "@storybook/theming": "7.2.2", + "@storybook/types": "7.2.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -8657,25 +10439,19 @@ "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.18.tgz", - "integrity": "sha512-cIeKEBvELtoVP/5UeQ01GJWZ7wM69/9Q+R5uOtNQBlwWFcCD6AVFWMRqq7ObMvdJG/okhXSF+sDetb+BF3zvdw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.2.2.tgz", + "integrity": "sha512-Pn6NJ349S+6tkzaFc1j3qOniDR9DyFPRfZsnAT85APKQaXyzNB3b1xwAhxnVjiCHIfp/a+SLOAdfXa+F8ALFQQ==", "dev": true, - "dependencies": { - "@types/npmlog": "^4.1.2", - "chalk": "^4.1.0", - "npmlog": "^5.0.1", - "pretty-hrtime": "^1.0.3" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/postinstall": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.18.tgz", - "integrity": "sha512-ObIwAK2UiYhXN/7UifISQgBoH5jnyxh6T8kvCw83YhC78SDOPNgIGjToJECizJ7iubtqAWtCfCT5TrGEpyLGbg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.2.2.tgz", + "integrity": "sha512-tGFZAFu5QFnuzhmzGMpasETVpzD1CVskok4+Dns/3iBWb8fZsFWaC0ZKazO+vHBtWZYO4uvrUbFSDTX2yPhtTQ==", "dev": true, "funding": { "type": "opencollective", @@ -8683,9 +10459,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.18.tgz", - "integrity": "sha512-L53p2eo8G12U6tp7hD3mk5tdWFXLvdEyV9e7a1x9bw1LfH15K/bp8lO6U/W1kkpse7+rqWBqoTjJC1Ktm5Sxog==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.2.2.tgz", + "integrity": "sha512-F3S3yK+RmpriADWnfVZsRN36WRT6LaFjD0sNrUkX8duxdnxNDaLFfJ3Cbxwyv/2lZ48uByIQbX2LC5HieVI0KA==", "dev": true, "funding": { "type": "opencollective", @@ -8693,18 +10469,17 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.18.tgz", - "integrity": "sha512-xxtC0gPGMn/DbwvS4ZuJaBwfFNsjUCf0yLYHFrNe6fxncbvcLZ550RuyUwYuIRfsiKrlgfa3QmmCa4JM/JesHQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.2.2.tgz", + "integrity": "sha512-II0EioQCGS2zTSoHbXNKyI1rwk2X7MBi2/tJerj4w4Qwi2fDQlwM0LKsIWlRjXTxBpOAsOoTelh24wSBoZu4bg==", "dev": true, "dependencies": { - "@storybook/channel-postmessage": "7.0.18", - "@storybook/channels": "7.0.18", - "@storybook/client-logger": "7.0.18", - "@storybook/core-events": "7.0.18", + "@storybook/channels": "7.2.2", + "@storybook/client-logger": "7.2.2", + "@storybook/core-events": "7.2.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.18", + "@storybook/types": "7.2.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -8720,9 +10495,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.18.tgz", - "integrity": "sha512-O1FRypR8q1katjbznnxI+NtALd2gaWa7KnTwbIDf+ddZltXHMZ8xMiEGEtAMrfXlIuqIr9UvmLRfKZC/ysuA+g==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.2.2.tgz", + "integrity": "sha512-H/yHlWl94vbUv1NNolcB3vCy1S185XKicswljJRC9o/AFCJK+a7d9wDVGTPKF6oy7ujrgpANLQyq02d+OuoO7w==", "dev": true, "funding": { "type": "opencollective", @@ -8734,12 +10509,12 @@ } }, "node_modules/@storybook/router": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.18.tgz", - "integrity": "sha512-Mue4s/BnKgdYcsiW9yuvW3qL9k3AgYn5HIhnkBExAteyiUGdAca4IJFhArmGgFktgeLc4ecBQ7sgaCljApnbgg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.2.2.tgz", + "integrity": "sha512-cnJg43dm3dVifKkRBUsQ4wXC4sJOm46JAS95yRPeGACoHpJTcbCWk1n5GLYA7ozO+KFQSNdxHxPIjNqvnzMFiA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", + "@storybook/client-logger": "7.2.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -8753,13 +10528,13 @@ } }, "node_modules/@storybook/store": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-7.0.18.tgz", - "integrity": "sha512-rvQOG7R1+r77Y9jwNqQB3EKW6D5kzIGoxqzFHd1oDqeY5+vqPXHC/J5iDrl8TZ4GES7ZMAHpkTySbY+rRQK7Ng==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-7.2.2.tgz", + "integrity": "sha512-4Z0iFdD6u9u9rDvr0ekLXOx1tIcmS1OU3xhk92RFWbGpAx4+bb1JDWmO7T04l+uPvLvYpWn5NrSV1ZdgyTVxUg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/preview-api": "7.0.18" + "@storybook/client-logger": "7.2.2", + "@storybook/preview-api": "7.2.2" }, "funding": { "type": "opencollective", @@ -8767,19 +10542,18 @@ } }, "node_modules/@storybook/telemetry": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.18.tgz", - "integrity": "sha512-JP5Z7lGU+oKjNmz2cZW5J7EerwyWBBPOU+NvvooZsymIx02ZvJ4ClmFtolJnBM7m4KoAy50JxV5NQWi+q8PicQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.2.2.tgz", + "integrity": "sha512-pJ8oQ++QD7hLezARp+3PR0JAw3FH6cmOrSs4KAB+IhNgACs8gehaEdy7TAikor5tlAUCWvqPetnNXDrrDIZhTQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.18", - "@storybook/core-common": "7.0.18", + "@storybook/client-logger": "7.2.2", + "@storybook/core-common": "7.2.2", + "@storybook/csf-tools": "7.2.2", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", "fs-extra": "^11.1.0", - "isomorphic-unfetch": "^3.1.0", - "nanoid": "^3.3.1", "read-pkg-up": "^7.0.1" }, "funding": { @@ -8802,13 +10576,13 @@ } }, "node_modules/@storybook/theming": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.18.tgz", - "integrity": "sha512-P1gMKa/mKQHIMq0sxBIwTzAcF6v/6hrc62YmkuV62vXu+8zNV2YWbRwywqm3Q6faZEadmb/bL9+z8whaKhCL/g==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.2.2.tgz", + "integrity": "sha512-B4nxcxl4IyVvB1NXwRi4yopAS73zl052f2zJi3kVghJbZ3tgPwgvi3CVpOs2D4pgmxOrKCgiLnzLrGTH+13+0A==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.0.18", + "@storybook/client-logger": "7.2.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -8822,21 +10596,215 @@ } }, "node_modules/@storybook/types": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.18.tgz", - "integrity": "sha512-qPop2CbvmX42/BX29YT9jIzW2TlMcMjAE+KCpcKLBiD1oT5DJ1fhMzpe6RW9HkMegkBxjWx54iamN4oHM/pwcQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.2.2.tgz", + "integrity": "sha512-yrL0+KD+dsusQvDmNKQGv36WjvdhoiUxMDEBgsZkP047kRc3b8/zEbD3Tu7iMDsWnpgwip1Frgy29Ro3UtK57Q==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.18", + "@storybook/channels": "7.2.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "file-system-cache": "^2.0.0" + "file-system-cache": "2.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, + "node_modules/@swc/core": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.76.tgz", + "integrity": "sha512-aYYTA2aVYkwJAZepQXtPnkUthhOfn8qd6rsh+lrJxonFrjmpI7RHt2tMDVTXP6XDX7fvnvrVtT1bwZfmBFPh0Q==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.76", + "@swc/core-darwin-x64": "1.3.76", + "@swc/core-linux-arm-gnueabihf": "1.3.76", + "@swc/core-linux-arm64-gnu": "1.3.76", + "@swc/core-linux-arm64-musl": "1.3.76", + "@swc/core-linux-x64-gnu": "1.3.76", + "@swc/core-linux-x64-musl": "1.3.76", + "@swc/core-win32-arm64-msvc": "1.3.76", + "@swc/core-win32-ia32-msvc": "1.3.76", + "@swc/core-win32-x64-msvc": "1.3.76" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.76.tgz", + "integrity": "sha512-ovviEhZ/1E81Z9OGrO0ivLWk4VCa3I3ZzM+cd3gugglRRwVwtlIaoIYqY5S3KiCAupDd1+UCl5X7Vbio7a/V8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.76.tgz", + "integrity": "sha512-tcySTDqs0SHCebtW35sCdcLWsmTEo7bEwx0gNL/spetqVT9fpFi6qU8qcnt7i2KaZHbeNl9g1aadu+Yrni+GzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.76.tgz", + "integrity": "sha512-apgzpGWy1AwoMF4urAAASsAjE7rEzZFIF+p6utuxhS7cNHzE0AyEVDYJbo+pzBdlZ8orBdzzsHtFwoEgKOjebA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.76.tgz", + "integrity": "sha512-c3c0zz6S0eludqidDpuqbadE0WT3OZczyQxe9Vw8lFFXES85mvNGtwYzyGK2o7TICpsuHrndwDIoYpmpWk879g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.76.tgz", + "integrity": "sha512-Is3bpq7F2qtlnkzEeOD6HIZJPpOmu3q6c82lKww90Q0NnrlSluVMozTHJgwVoFZyizH7uLnk0LuNcEAWLnmJIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.76.tgz", + "integrity": "sha512-iwCeRzd9oSvUzqt7nU6p/ztceAWfnO9XVxBn502R5gs6QCBbE1HCKrWHDO77aKPK7ss+0NcIGHvXTd9L8/wRzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.76.tgz", + "integrity": "sha512-a671g4tW8kyFeuICsgq4uB9ukQfiIyXJT4V6YSnmqhCTz5mazWuDxZ5wKnx/1g5nXTl+U5cWH2TZaCJatp4GKA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.76.tgz", + "integrity": "sha512-+swEFtjdMezS0vKUhJC3psdSDtOJGY5pEOt4e8XOPvn7aQpKQ9LfF49XVtIwDSk5SGuWtVoLFzkSY3reWUJCyg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.76.tgz", + "integrity": "sha512-5CqwAykpGBJ3PqGLOlWGLGIPpBAG1IwWVDUfro3hhjQ7XJxV5Z1aQf5V5OJ90HJVtrEAVx2xx59UV/Dh081LOg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.76", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.76.tgz", + "integrity": "sha512-CiMpWLLlR3Cew9067E7XxaLBwYYJ90r9EhGSO6V1pvYSWj7ET/Ppmtj1ZhzPJMqRXAP6xflfl5R5o4ee1m4WLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -9088,6 +11056,15 @@ "@types/node": "*" } }, + "node_modules/@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", @@ -9098,9 +11075,9 @@ } }, "node_modules/@types/detect-port": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.2.tgz", - "integrity": "sha512-xxgAGA2SAU4111QefXPSp5eGbDm/hW6zhvYl9IeEPZEry9F4d66QAHm5qpUXjb6IsevZV/7emAEx5MhP6O192g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.3.tgz", + "integrity": "sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==", "dev": true }, "node_modules/@types/doctrine": { @@ -9460,9 +11437,9 @@ } }, "node_modules/@types/mdx": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz", - "integrity": "sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.6.tgz", + "integrity": "sha512-sVcwEG10aFU2KcM7cIA0M410UPv/DesOPyG8zMVk0QUDexHA3lYmGucpEpZ2dtWWhi2ip3CG+5g/iH0PwoW4Fw==", "dev": true }, "node_modules/@types/mime": { @@ -9543,12 +11520,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "node_modules/@types/npmlog": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", - "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==", - "dev": true - }, "node_modules/@types/papaparse": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.7.tgz", @@ -9733,6 +11704,12 @@ "integrity": "sha512-ONpcZAEYlbPx4EtJwfTyCDQJGUpKf4sEcuySdCVjK5Fj/3vHp5HII1fqa1/+qrsLnpYELCQTfVW/awsGJePoIg==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", + "dev": true + }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -10919,9 +12896,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -11128,15 +13105,6 @@ "node": ">=0.4.2" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -11420,6 +13388,18 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", @@ -12299,31 +14279,15 @@ } }, "node_modules/better-opn": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz", - "integrity": "sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "dependencies": { - "open": "^7.0.3" + "open": "^8.0.4" }, "engines": { - "node": ">8.0.0" - } - }, - "node_modules/better-opn/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, "node_modules/big-integer": { @@ -12579,52 +14543,6 @@ "popper.js": "^1.16.1" } }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -13177,9 +15095,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", "funding": [ { "type": "opencollective", @@ -13640,18 +15558,6 @@ "rimraf": "bin.js" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -14179,6 +16085,12 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -14363,18 +16275,50 @@ } }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -15300,6 +17244,12 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "dev": true + }, "node_modules/detect-package-manager": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", @@ -15644,12 +17594,15 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dotenv-expand": { @@ -15934,9 +17887,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.408", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.408.tgz", - "integrity": "sha512-vjeaj0u/UYnzA/CIdGXzzcxRLCqRwREYc9YfaWInjIEr7/XPttZ6ShpyqapchEy0S2r6LpLjDBTnNj7ZxnxJKg==" + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==" }, "node_modules/electron-updater": { "version": "5.3.0", @@ -16751,6 +18704,33 @@ "typescript": ">=4.0.0" } }, + "node_modules/eslint-plugin-storybook": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.13.tgz", + "integrity": "sha512-smd+CS0WH1jBqUEJ3znGS7DU4ayBE9z6lkQAK2yrSUv1+rq8BT/tiI5C/rKE7rmiqiAfojtNYZRhzo5HrulccQ==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.45.0", + "requireindex": "^1.1.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": "12.x || 14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, "node_modules/eslint-plugin-tailwindcss": { "version": "3.12.1", "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.12.1.tgz", @@ -18197,9 +20177,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.207.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.207.0.tgz", - "integrity": "sha512-s90OlXqzWj1xc4yUtqD1Gr8pGVx0/5rk9gsqPrOYF1kBAPMH4opkmzdWgQ8aNe3Pckqtwr8DlYGbfE2GnW+zsg==", + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.214.0.tgz", + "integrity": "sha512-RW1Dh6BuT14DA7+gtNRKzgzvG3GTPdrceHCi4ddZ9VFGQ9HtO5L8wzxMGsor7XtInIrbWZZCSak0oxnBF7tApw==", "dev": true, "engines": { "node": ">=0.4.0" @@ -18300,9 +20280,9 @@ "dev": true }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -18324,13 +20304,7 @@ }, "peerDependencies": { "typescript": ">3.6.0", - "vue-template-compiler": "*", "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { @@ -18365,9 +20339,9 @@ "dev": true }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -18638,6 +20612,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/get-npm-tarball-url": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.0.3.tgz", @@ -18775,35 +20758,6 @@ "node": ">= 6" } }, - "node_modules/glob-promise": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.2.tgz", - "integrity": "sha512-Ni2aDyD1ekD6x8/+K4hDriRDbzzfuK4yKpqSymJ4P7IxbtARiOOuU+k40kbHM0sLIlbf1Qh0qdMkAHMZYE6XJQ==", - "dev": true, - "dependencies": { - "@types/glob": "^8.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/ahmadnassri" - }, - "peerDependencies": { - "glob": "^8.0.3" - } - }, - "node_modules/glob-promise/node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "dev": true, - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, "node_modules/glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", @@ -20883,6 +22837,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -21697,16 +23660,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -23875,6 +25828,37 @@ } } }, + "node_modules/lit": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", + "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "dev": true, + "dependencies": { + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.8.0" + } + }, + "node_modules/lit-element": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "dev": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.8.0" + } + }, + "node_modules/lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "dev": true, + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -24556,9 +26540,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", - "integrity": "sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz", + "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==", "dev": true, "engines": { "node": ">= 10" @@ -26429,9 +28413,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.1.1.tgz", - "integrity": "sha512-9VvspTSUp2Sxbl+9vbZTlFGq9lHwE8GDVVekxx6YsNd1YH59sb3Ba8v3Y3cD8PkLNcileGGcA21PFjVl0jzDaw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz", + "integrity": "sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==", "dev": true }, "node_modules/node-fetch/node_modules/tr46": { @@ -26627,9 +28611,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/node.extend": { "version": "2.0.2", @@ -27918,13 +29902,13 @@ } }, "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -27966,9 +29950,9 @@ } }, "node_modules/pathe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", - "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", "dev": true }, "node_modules/pause-stream": { @@ -29523,6 +31507,53 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dev": true, + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dev": true, + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-resize-detector": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz", @@ -29536,6 +31567,29 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dev": true, + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -29990,9 +32044,9 @@ "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -31360,43 +33414,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -32548,12 +34565,12 @@ "dev": true }, "node_modules/storybook": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.18.tgz", - "integrity": "sha512-FXMmTiomSlLPTHty7vGLr0prPf6pCV07EwAmNOYYYTskitEYV0R7hlhawByd7HuobjIhHvSTKesa1Whl86zLNA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.2.2.tgz", + "integrity": "sha512-JT4CtVagLi7B5CKFUX/ozRpW3X7z4ffdXaXr4g6uBQjPN8NmvQCCftVIntpiXPKIbQa+cqyOTCNiprGvFnQQfg==", "dev": true, "dependencies": { - "@storybook/cli": "7.0.18" + "@storybook/cli": "7.2.2" }, "bin": { "sb": "index.js", @@ -32976,6 +34993,16 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/swc-loader": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", + "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", + "dev": true, + "peerDependencies": { + "@swc/core": "^1.2.147", + "webpack": ">=2" + } + }, "node_modules/sweetalert2": { "version": "10.16.11", "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-10.16.11.tgz", @@ -33625,6 +35652,12 @@ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "dev": true }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -33825,6 +35858,12 @@ "xtend": "~4.0.1" } }, + "node_modules/tocbot": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.21.1.tgz", + "integrity": "sha512-IfajhBTeg0HlMXu1f+VMbPef05QpDTsZ9X2Yn1+8npdaXsXg/+wrm9Ze1WG5OS1UDC3qJ5EQN/XOZ3gfXjPFCw==", + "dev": true + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -34397,12 +36436,6 @@ "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", "dev": true }, - "node_modules/unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", - "dev": true - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -34654,15 +36687,15 @@ } }, "node_modules/unplugin": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-0.10.2.tgz", - "integrity": "sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.4.5" + "webpack-virtual-modules": "^0.5.0" } }, "node_modules/unset-value": { @@ -34817,6 +36850,27 @@ "node": ">=0.10.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-resize-observer": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", @@ -34830,6 +36884,28 @@ "react-dom": "16.8.0 - 18" } }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dev": true, + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -35508,9 +37584,9 @@ } }, "node_modules/webpack-hot-middleware": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz", - "integrity": "sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz", + "integrity": "sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w==", "dev": true, "dependencies": { "ansi-html-community": "0.0.8", @@ -35571,9 +37647,9 @@ } }, "node_modules/webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "dev": true }, "node_modules/webpack/node_modules/ajv": { @@ -35781,18 +37857,6 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", diff --git a/package.json b/package.json index cc0d47e39f4..115de695349 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,12 @@ "@electron/rebuild": "3.2.13", "@fluffy-spoon/substitute": "1.208.0", "@ngtools/webpack": "15.2.8", - "@storybook/addon-a11y": "7.0.18", - "@storybook/addon-actions": "7.0.18", - "@storybook/addon-essentials": "7.0.18", - "@storybook/addon-links": "7.0.18", - "@storybook/angular": "7.0.18", + "@storybook/addon-a11y": "7.2.2", + "@storybook/addon-actions": "7.2.2", + "@storybook/addon-designs": "7.0.4", + "@storybook/addon-essentials": "7.2.2", + "@storybook/addon-links": "7.2.2", + "@storybook/angular": "7.2.2", "@types/argon2-browser": "1.18.1", "@types/chrome": "0.0.237", "@types/duo_web_sdk": "2.7.1", @@ -99,6 +100,7 @@ "eslint-plugin-import": "2.27.5", "eslint-plugin-rxjs": "5.0.3", "eslint-plugin-rxjs-angular": "2.0.1", + "eslint-plugin-storybook": "0.6.13", "eslint-plugin-tailwindcss": "3.12.1", "gulp": "4.0.2", "gulp-filter": "7.0.0", @@ -129,7 +131,7 @@ "rimraf": "5.0.1", "sass": "1.62.1", "sass-loader": "13.3.1", - "storybook": "7.0.18", + "storybook": "7.2.2", "style-loader": "3.3.3", "tailwindcss": "3.3.2", "ts-jest": "29.1.0", From 15f29c5fb15d02a09fd543859be0e6721a86d6c4 Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Tue, 15 Aug 2023 20:32:40 +0200 Subject: [PATCH 268/299] [PM-3040] [BEEEP] Extend json-export to include passwordhistory and vault item dates (created, updated, deleted) (#5917) * Add password history to json exports Change callout to not mention missing password history any longer * Added item meta dates to json exports Added vault items creation-/revision-/deleted-dates to json exports * Removed unnecessary promises * Add bitwarden-json-export types Define types Use types in vault-export-service Move existing password-protected type to export-types * Use bitwarden-json-export types in bitwarden-json-importer * Clean up passwordHistory if needed * Define and use bitwarden-csv-export-types --- apps/web/src/locales/en/messages.json | 4 +- .../export-scope-callout.component.ts | 2 +- .../common/src/models/export/cipher.export.ts | 35 +++++ .../models/export/password-history.export.ts | 40 +++++ .../vault-export/bitwarden-csv-export-type.ts | 23 +++ .../bitwarden-json-export-types.ts | 51 +++++++ .../bitwarden-password-protected-types.ts | 11 -- .../services/vault-export.service.ts | 37 +++-- libs/importer/src/importers/base-importer.ts | 3 + .../bitwarden/bitwarden-json-importer.ts | 139 +++++++++++------- .../bitwarden-password-protected-importer.ts | 2 +- 11 files changed, 264 insertions(+), 83 deletions(-) create mode 100644 libs/common/src/models/export/password-history.export.ts create mode 100644 libs/exporter/src/vault-export/bitwarden-csv-export-type.ts create mode 100644 libs/exporter/src/vault-export/bitwarden-json-export-types.ts delete mode 100644 libs/exporter/src/vault-export/bitwarden-password-protected-types.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index e15b3f1b17e..97ad4adb408 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5454,8 +5454,8 @@ "exportingOrganizationVaultTitle": { "message": "Exporting organization vault" }, - "exportingPersonalVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated password history or attachments.", + "exportingIndividualVaultDescription": { + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", "placeholders": { "email": { "content": "$1", diff --git a/libs/angular/src/tools/export/components/export-scope-callout.component.ts b/libs/angular/src/tools/export/components/export-scope-callout.component.ts index 3095cd5e835..a97db1079a7 100644 --- a/libs/angular/src/tools/export/components/export-scope-callout.component.ts +++ b/libs/angular/src/tools/export/components/export-scope-callout.component.ts @@ -35,7 +35,7 @@ export class ExportScopeCalloutComponent implements OnInit { } : { title: "exportingPersonalVaultTitle", - description: "exportingPersonalVaultDescription", + description: "exportingIndividualVaultDescription", scopeIdentifier: await this.stateService.getEmail(), }; this.show = true; diff --git a/libs/common/src/models/export/cipher.export.ts b/libs/common/src/models/export/cipher.export.ts index 5bfde78b557..342cf59fd86 100644 --- a/libs/common/src/models/export/cipher.export.ts +++ b/libs/common/src/models/export/cipher.export.ts @@ -8,6 +8,7 @@ import { CardExport } from "./card.export"; import { FieldExport } from "./field.export"; import { IdentityExport } from "./identity.export"; import { LoginExport } from "./login.export"; +import { PasswordHistoryExport } from "./password-history.export"; import { SecureNoteExport } from "./secure-note.export"; export class CipherExport { @@ -26,6 +27,10 @@ export class CipherExport { req.card = null; req.identity = null; req.reprompt = CipherRepromptType.None; + req.passwordHistory = []; + req.creationDate = null; + req.revisionDate = null; + req.deletedDate = null; return req; } @@ -63,6 +68,13 @@ export class CipherExport { break; } + if (req.passwordHistory != null) { + view.passwordHistory = req.passwordHistory.map((ph) => PasswordHistoryExport.toView(ph)); + } + + view.creationDate = req.creationDate; + view.revisionDate = req.revisionDate; + view.deletedDate = req.deletedDate; return view; } @@ -96,6 +108,13 @@ export class CipherExport { break; } + if (req.passwordHistory != null) { + domain.passwordHistory = req.passwordHistory.map((ph) => PasswordHistoryExport.toDomain(ph)); + } + + domain.creationDate = req.creationDate; + domain.revisionDate = req.revisionDate; + domain.deletedDate = req.deletedDate; return domain; } @@ -112,6 +131,10 @@ export class CipherExport { card: CardExport; identity: IdentityExport; reprompt: CipherRepromptType; + passwordHistory: PasswordHistoryExport[] = null; + revisionDate: Date = null; + creationDate: Date = null; + deletedDate: Date = null; // Use build method instead of ctor so that we can control order of JSON stringify for pretty print build(o: CipherView | CipherDomain) { @@ -152,5 +175,17 @@ export class CipherExport { this.identity = new IdentityExport(o.identity); break; } + + if (o.passwordHistory != null) { + if (o instanceof CipherView) { + this.passwordHistory = o.passwordHistory.map((ph) => new PasswordHistoryExport(ph)); + } else { + this.passwordHistory = o.passwordHistory.map((ph) => new PasswordHistoryExport(ph)); + } + } + + this.creationDate = o.creationDate; + this.revisionDate = o.revisionDate; + this.deletedDate = o.deletedDate; } } diff --git a/libs/common/src/models/export/password-history.export.ts b/libs/common/src/models/export/password-history.export.ts new file mode 100644 index 00000000000..0bdbc6697ac --- /dev/null +++ b/libs/common/src/models/export/password-history.export.ts @@ -0,0 +1,40 @@ +import { EncString } from "../../platform/models/domain/enc-string"; +import { Password } from "../../vault/models/domain/password"; +import { PasswordHistoryView } from "../../vault/models/view/password-history.view"; + +export class PasswordHistoryExport { + static template(): PasswordHistoryExport { + const req = new PasswordHistoryExport(); + req.password = null; + req.lastUsedDate = null; + return req; + } + + static toView(req: PasswordHistoryExport, view = new PasswordHistoryView()) { + view.password = req.password; + view.lastUsedDate = req.lastUsedDate; + return view; + } + + static toDomain(req: PasswordHistoryExport, domain = new Password()) { + domain.password = req.password != null ? new EncString(req.password) : null; + domain.lastUsedDate = req.lastUsedDate; + return domain; + } + + password: string; + lastUsedDate: Date = null; + + constructor(o?: PasswordHistoryView | Password) { + if (o == null) { + return; + } + + if (o instanceof PasswordHistoryView) { + this.password = o.password; + } else { + this.password = o.password?.encryptedString; + } + this.lastUsedDate = o.lastUsedDate; + } +} diff --git a/libs/exporter/src/vault-export/bitwarden-csv-export-type.ts b/libs/exporter/src/vault-export/bitwarden-csv-export-type.ts new file mode 100644 index 00000000000..30c6bb89bc1 --- /dev/null +++ b/libs/exporter/src/vault-export/bitwarden-csv-export-type.ts @@ -0,0 +1,23 @@ +import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; + +export type BitwardenCsvExportType = { + type: string; + name: string; + notes: string; + fields: string; + reprompt: CipherRepromptType; + // Login props + login_uri: string[]; + login_username: string; + login_password: string; + login_totp: string; + favorite: number | null; +}; + +export type BitwardenCsvIndividualExportType = BitwardenCsvExportType & { + folder: string | null; +}; + +export type BitwardenCsvOrgExportType = BitwardenCsvExportType & { + collections: string[] | null; +}; diff --git a/libs/exporter/src/vault-export/bitwarden-json-export-types.ts b/libs/exporter/src/vault-export/bitwarden-json-export-types.ts new file mode 100644 index 00000000000..ab2bcbb9f1f --- /dev/null +++ b/libs/exporter/src/vault-export/bitwarden-json-export-types.ts @@ -0,0 +1,51 @@ +import { + CipherWithIdExport, + CollectionWithIdExport, + FolderWithIdExport, +} from "@bitwarden/common/models/export"; + +// Base +export type BitwardenJsonExport = { + encrypted: boolean; + items: CipherWithIdExport[]; +}; + +// Decrypted +export type BitwardenUnEncryptedJsonExport = BitwardenJsonExport & { + encrypted: false; +}; + +export type BitwardenUnEncryptedIndividualJsonExport = BitwardenUnEncryptedJsonExport & { + folders: FolderWithIdExport[]; +}; + +export type BitwardenUnEncryptedOrgJsonExport = BitwardenUnEncryptedJsonExport & { + collections: CollectionWithIdExport[]; +}; + +// Account-encrypted +export type BitwardenEncryptedJsonExport = BitwardenJsonExport & { + encrypted: true; + encKeyValidation_DO_NOT_EDIT: string; +}; + +export type BitwardenEncryptedIndividualJsonExport = BitwardenEncryptedJsonExport & { + folders: FolderWithIdExport[]; +}; + +export type BitwardenEncryptedOrgJsonExport = BitwardenEncryptedJsonExport & { + collections: CollectionWithIdExport[]; +}; + +// Password-protected +export type BitwardenPasswordProtectedFileFormat = { + encrypted: boolean; + passwordProtected: boolean; + salt: string; + kdfIterations: number; + kdfMemory?: number; + kdfParallelism?: number; + kdfType: number; + encKeyValidation_DO_NOT_EDIT: string; + data: string; +}; diff --git a/libs/exporter/src/vault-export/bitwarden-password-protected-types.ts b/libs/exporter/src/vault-export/bitwarden-password-protected-types.ts deleted file mode 100644 index 01671c16804..00000000000 --- a/libs/exporter/src/vault-export/bitwarden-password-protected-types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface BitwardenPasswordProtectedFileFormat { - encrypted: boolean; - passwordProtected: boolean; - salt: string; - kdfIterations: number; - kdfMemory?: number; - kdfParallelism?: number; - kdfType: number; - encKeyValidation_DO_NOT_EDIT: string; - data: string; -} diff --git a/libs/exporter/src/vault-export/services/vault-export.service.ts b/libs/exporter/src/vault-export/services/vault-export.service.ts index 06a8b45f58a..8609ce0d1c8 100644 --- a/libs/exporter/src/vault-export/services/vault-export.service.ts +++ b/libs/exporter/src/vault-export/services/vault-export.service.ts @@ -26,7 +26,18 @@ import { CollectionView } from "@bitwarden/common/vault/models/view/collection.v import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { ExportHelper } from "../../export-helper"; -import { BitwardenPasswordProtectedFileFormat } from "../bitwarden-password-protected-types"; +import { + BitwardenCsvExportType, + BitwardenCsvIndividualExportType, + BitwardenCsvOrgExportType, +} from "../bitwarden-csv-export-type"; +import { + BitwardenEncryptedIndividualJsonExport, + BitwardenEncryptedOrgJsonExport, + BitwardenUnEncryptedIndividualJsonExport, + BitwardenUnEncryptedOrgJsonExport, + BitwardenPasswordProtectedFileFormat, +} from "../bitwarden-json-export-types"; import { ExportFormat, VaultExportServiceAbstraction } from "./vault-export.service.abstraction"; @@ -123,7 +134,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { } }); - const exportCiphers: any[] = []; + const exportCiphers: BitwardenCsvIndividualExportType[] = []; decCiphers.forEach((c) => { // only export logins and secure notes if (c.type !== CipherType.Login && c.type !== CipherType.SecureNote) { @@ -133,7 +144,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { return; } - const cipher: any = {}; + const cipher = {} as BitwardenCsvIndividualExportType; cipher.folder = c.folderId != null && foldersMap.has(c.folderId) ? foldersMap.get(c.folderId).name : null; cipher.favorite = c.favorite ? 1 : null; @@ -143,7 +154,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { return papa.unparse(exportCiphers); } else { - const jsonDoc: any = { + const jsonDoc: BitwardenUnEncryptedIndividualJsonExport = { encrypted: false, folders: [], items: [], @@ -193,7 +204,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { const encKeyValidation = await this.cryptoService.encrypt(Utils.newGuid()); - const jsonDoc: any = { + const jsonDoc: BitwardenEncryptedIndividualJsonExport = { encrypted: true, encKeyValidation_DO_NOT_EDIT: encKeyValidation.encryptedString, folders: [], @@ -269,14 +280,14 @@ export class VaultExportService implements VaultExportServiceAbstraction { collectionsMap.set(c.id, c); }); - const exportCiphers: any[] = []; + const exportCiphers: BitwardenCsvOrgExportType[] = []; decCiphers.forEach((c) => { // only export logins and secure notes if (c.type !== CipherType.Login && c.type !== CipherType.SecureNote) { return; } - const cipher: any = {}; + const cipher = {} as BitwardenCsvOrgExportType; cipher.collections = []; if (c.collectionIds != null) { cipher.collections = c.collectionIds @@ -289,7 +300,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { return papa.unparse(exportCiphers); } else { - const jsonDoc: any = { + const jsonDoc: BitwardenUnEncryptedOrgJsonExport = { encrypted: false, collections: [], items: [], @@ -317,20 +328,17 @@ export class VaultExportService implements VaultExportServiceAbstraction { promises.push( this.apiService.getCollections(organizationId).then((c) => { - const collectionPromises: any = []; if (c != null && c.data != null && c.data.length > 0) { c.data.forEach((r) => { const collection = new Collection(new CollectionData(r as CollectionDetailsResponse)); collections.push(collection); }); } - return Promise.all(collectionPromises); }) ); promises.push( this.apiService.getCiphersOrganization(organizationId).then((c) => { - const cipherPromises: any = []; if (c != null && c.data != null && c.data.length > 0) { c.data .filter((item) => item.deletedDate === null) @@ -339,7 +347,6 @@ export class VaultExportService implements VaultExportServiceAbstraction { ciphers.push(cipher); }); } - return Promise.all(cipherPromises); }) ); @@ -348,7 +355,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { const orgKey = await this.cryptoService.getOrgKey(organizationId); const encKeyValidation = await this.cryptoService.encrypt(Utils.newGuid(), orgKey); - const jsonDoc: any = { + const jsonDoc: BitwardenEncryptedOrgJsonExport = { encrypted: true, encKeyValidation_DO_NOT_EDIT: encKeyValidation.encryptedString, collections: [], @@ -369,7 +376,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { return JSON.stringify(jsonDoc, null, " "); } - private buildCommonCipher(cipher: any, c: CipherView) { + private buildCommonCipher(cipher: BitwardenCsvExportType, c: CipherView): BitwardenCsvExportType { cipher.type = null; cipher.name = c.name; cipher.notes = c.notes; @@ -382,7 +389,7 @@ export class VaultExportService implements VaultExportServiceAbstraction { cipher.login_totp = null; if (c.fields) { - c.fields.forEach((f: any) => { + c.fields.forEach((f) => { if (!cipher.fields) { cipher.fields = ""; } else { diff --git a/libs/importer/src/importers/base-importer.ts b/libs/importer/src/importers/base-importer.ts index 7c3110ad232..676fec4f333 100644 --- a/libs/importer/src/importers/base-importer.ts +++ b/libs/importer/src/importers/base-importer.ts @@ -313,6 +313,9 @@ export abstract class BaseImporter { if (cipher.fields != null && cipher.fields.length === 0) { cipher.fields = null; } + if (cipher.passwordHistory != null && cipher.passwordHistory.length === 0) { + cipher.passwordHistory = null; + } } protected processKvp( diff --git a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts index 0789c7df2e4..5c281dc6b73 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts @@ -6,13 +6,21 @@ import { import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; +import { + BitwardenEncryptedIndividualJsonExport, + BitwardenEncryptedOrgJsonExport, + BitwardenJsonExport, + BitwardenUnEncryptedIndividualJsonExport, + BitwardenUnEncryptedOrgJsonExport, +} from "@bitwarden/exporter/vault-export/bitwarden-json-export-types"; import { ImportResult } from "../../models/import-result"; import { BaseImporter } from "../base-importer"; import { Importer } from "../importer"; export class BitwardenJsonImporter extends BaseImporter implements Importer { - private results: any; private result: ImportResult; protected constructor( @@ -24,25 +32,27 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { async parse(data: string): Promise { this.result = new ImportResult(); - this.results = JSON.parse(data); - if (this.results == null || this.results.items == null) { + const results: BitwardenJsonExport = JSON.parse(data); + if (results == null || results.items == null) { this.result.success = false; return this.result; } - if (this.results.encrypted) { - await this.parseEncrypted(); + if (results.encrypted) { + await this.parseEncrypted(results as any); } else { - this.parseDecrypted(); + await this.parseDecrypted(results as any); } return this.result; } - private async parseEncrypted() { - if (this.results.encKeyValidation_DO_NOT_EDIT != null) { + private async parseEncrypted( + results: BitwardenEncryptedIndividualJsonExport | BitwardenEncryptedOrgJsonExport + ) { + if (results.encKeyValidation_DO_NOT_EDIT != null) { const orgKey = await this.cryptoService.getOrgKey(this.organizationId); - const encKeyValidation = new EncString(this.results.encKeyValidation_DO_NOT_EDIT); + const encKeyValidation = new EncString(results.encKeyValidation_DO_NOT_EDIT); const encKeyValidationDecrypt = await this.cryptoService.decryptToUtf8( encKeyValidation, orgKey @@ -54,30 +64,11 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { } } - const groupingsMap = new Map(); + const groupingsMap = this.organization + ? await this.parseCollections(results as BitwardenEncryptedOrgJsonExport) + : await this.parseFolders(results as BitwardenEncryptedIndividualJsonExport); - if (this.organization && this.results.collections != null) { - for (const c of this.results.collections as CollectionWithIdExport[]) { - const collection = CollectionWithIdExport.toDomain(c); - if (collection != null) { - collection.organizationId = this.organizationId; - const view = await collection.decrypt(); - groupingsMap.set(c.id, this.result.collections.length); - this.result.collections.push(view); - } - } - } else if (!this.organization && this.results.folders != null) { - for (const f of this.results.folders as FolderWithIdExport[]) { - const folder = FolderWithIdExport.toDomain(f); - if (folder != null) { - const view = await folder.decrypt(); - groupingsMap.set(f.id, this.result.folders.length); - this.result.folders.push(view); - } - } - } - - for (const c of this.results.items as CipherWithIdExport[]) { + for (const c of results.items) { const cipher = CipherWithIdExport.toDomain(c); // reset ids incase they were set for some reason cipher.id = null; @@ -113,28 +104,14 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { this.result.success = true; } - private parseDecrypted() { - const groupingsMap = new Map(); - if (this.organization && this.results.collections != null) { - this.results.collections.forEach((c: CollectionWithIdExport) => { - const collection = CollectionWithIdExport.toView(c); - if (collection != null) { - collection.organizationId = null; - groupingsMap.set(c.id, this.result.collections.length); - this.result.collections.push(collection); - } - }); - } else if (!this.organization && this.results.folders != null) { - this.results.folders.forEach((f: FolderWithIdExport) => { - const folder = FolderWithIdExport.toView(f); - if (folder != null) { - groupingsMap.set(f.id, this.result.folders.length); - this.result.folders.push(folder); - } - }); - } + private async parseDecrypted( + results: BitwardenUnEncryptedIndividualJsonExport | BitwardenUnEncryptedOrgJsonExport + ) { + const groupingsMap = this.organization + ? await this.parseCollections(results as BitwardenUnEncryptedOrgJsonExport) + : await this.parseFolders(results as BitwardenUnEncryptedIndividualJsonExport); - this.results.items.forEach((c: CipherWithIdExport) => { + results.items.forEach((c) => { const cipher = CipherWithIdExport.toView(c); // reset ids incase they were set for some reason cipher.id = null; @@ -168,4 +145,60 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { this.result.success = true; } + + private async parseFolders( + data: BitwardenUnEncryptedIndividualJsonExport | BitwardenEncryptedIndividualJsonExport + ): Promise> | null { + if (data.folders == null) { + return null; + } + + const groupingsMap = new Map(); + + for (const f of data.folders) { + let folderView: FolderView; + if (data.encrypted) { + const folder = FolderWithIdExport.toDomain(f); + if (folder != null) { + folderView = await folder.decrypt(); + } + } else { + folderView = FolderWithIdExport.toView(f); + } + + if (folderView != null) { + groupingsMap.set(f.id, this.result.folders.length); + this.result.folders.push(folderView); + } + } + return groupingsMap; + } + + private async parseCollections( + data: BitwardenUnEncryptedOrgJsonExport | BitwardenEncryptedOrgJsonExport + ): Promise> | null { + if (data.collections == null) { + return null; + } + + const groupingsMap = new Map(); + + for (const c of data.collections) { + let collectionView: CollectionView; + if (data.encrypted) { + const collection = CollectionWithIdExport.toDomain(c); + collection.organizationId = this.organizationId; + collectionView = await collection.decrypt(); + } else { + collectionView = CollectionWithIdExport.toView(c); + collectionView.organizationId = null; + } + + if (collectionView != null) { + groupingsMap.set(c.id, this.result.collections.length); + this.result.collections.push(collectionView); + } + } + return groupingsMap; + } } diff --git a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts index 80872b68042..a8c2a711a0b 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts @@ -4,7 +4,7 @@ import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.se import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { BitwardenPasswordProtectedFileFormat } from "@bitwarden/exporter/vault-export/bitwarden-password-protected-types"; +import { BitwardenPasswordProtectedFileFormat } from "@bitwarden/exporter/vault-export/bitwarden-json-export-types"; import { ImportResult } from "../../models/import-result"; import { Importer } from "../importer"; From 8593966a714c546c9e2c012e7bb748557df301d7 Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Tue, 15 Aug 2023 15:15:13 -0400 Subject: [PATCH 269/299] PM-171 remove confirmation alerts for restoring an item (#5799) * remove confirmation alerts for restoring an item from trash and remove bulk-restore-dialog from vault individual and org --- apps/browser/src/_locales/en/messages.json | 3 - apps/desktop/src/locales/en/messages.json | 6 -- .../bulk-dialogs.module.ts | 15 +---- .../bulk-restore-dialog.component.html | 14 ---- .../bulk-restore-dialog.component.ts | 67 ------------------- .../vault/individual-vault/vault.component.ts | 25 +------ .../app/vault/org-vault/vault.component.ts | 25 +------ apps/web/src/locales/en/messages.json | 18 ----- .../vault/components/add-edit.component.ts | 10 --- .../src/vault/components/view.component.ts | 10 --- 10 files changed, 8 insertions(+), 185 deletions(-) delete mode 100644 apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.html delete mode 100644 apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.ts diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 63dd227e52b..400e75dd1b4 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1446,9 +1446,6 @@ "restoreItem": { "message": "Restore item" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 57ba39d673a..ab8446ee465 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -1512,12 +1512,6 @@ "permanentlyDeletedItem": { "message": "Item permanently deleted" }, - "restoreItem": { - "message": "Restore item" - }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, "restoredItem": { "message": "Item restored" }, diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-dialogs.module.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-dialogs.module.ts index 0618025bbfa..848f5629dae 100644 --- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-dialogs.module.ts +++ b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-dialogs.module.ts @@ -4,22 +4,11 @@ import { SharedModule } from "../../../shared"; import { BulkDeleteDialogComponent } from "./bulk-delete-dialog/bulk-delete-dialog.component"; import { BulkMoveDialogComponent } from "./bulk-move-dialog/bulk-move-dialog.component"; -import { BulkRestoreDialogComponent } from "./bulk-restore-dialog/bulk-restore-dialog.component"; import { BulkShareDialogComponent } from "./bulk-share-dialog/bulk-share-dialog.component"; @NgModule({ imports: [SharedModule], - declarations: [ - BulkDeleteDialogComponent, - BulkMoveDialogComponent, - BulkRestoreDialogComponent, - BulkShareDialogComponent, - ], - exports: [ - BulkDeleteDialogComponent, - BulkMoveDialogComponent, - BulkRestoreDialogComponent, - BulkShareDialogComponent, - ], + declarations: [BulkDeleteDialogComponent, BulkMoveDialogComponent, BulkShareDialogComponent], + exports: [BulkDeleteDialogComponent, BulkMoveDialogComponent, BulkShareDialogComponent], }) export class BulkDialogsModule {} diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.html b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.html deleted file mode 100644 index 9cfe1bf69bc..00000000000 --- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.html +++ /dev/null @@ -1,14 +0,0 @@ - - - {{ "restoreSelected" | i18n }} - - - {{ "restoreSelectedItemsDesc" | i18n : cipherIds.length }} - - - - - - diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.ts deleted file mode 100644 index 94685f9fda0..00000000000 --- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { DialogConfig, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; -import { Component, Inject } from "@angular/core"; - -import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; -import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; - -export interface BulkRestoreDialogParams { - cipherIds: string[]; - organization?: Organization; -} - -export enum BulkRestoreDialogResult { - Restored = "restored", - Canceled = "canceled", -} - -/** - * Strongly typed helper to open a BulkRestoreDialog - * @param dialogService Instance of the dialog service that will be used to open the dialog - * @param config Configuration for the dialog - */ -export const openBulkRestoreDialog = ( - dialogService: DialogServiceAbstraction, - config: DialogConfig -) => { - return dialogService.open( - BulkRestoreDialogComponent, - config - ); -}; - -@Component({ - templateUrl: "bulk-restore-dialog.component.html", -}) -export class BulkRestoreDialogComponent { - cipherIds: string[]; - organization?: Organization; - - constructor( - @Inject(DIALOG_DATA) params: BulkRestoreDialogParams, - private dialogRef: DialogRef, - private cipherService: CipherService, - private platformUtilsService: PlatformUtilsService, - private i18nService: I18nService - ) { - this.cipherIds = params.cipherIds ?? []; - this.organization = params.organization; - } - - submit = async () => { - const asAdmin = this.organization?.canEditAnyCollection; - await this.cipherService.restoreManyWithServer(this.cipherIds, this.organization?.id, asAdmin); - this.platformUtilsService.showToast("success", null, this.i18nService.t("restoredItems")); - this.close(BulkRestoreDialogResult.Restored); - }; - - protected cancel() { - this.close(BulkRestoreDialogResult.Canceled); - } - - private close(result: BulkRestoreDialogResult) { - this.dialogRef.close(result); - } -} diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts index ba32a27aed8..b0cd2eb9581 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -75,10 +75,6 @@ import { BulkMoveDialogResult, openBulkMoveDialog, } from "./bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component"; -import { - BulkRestoreDialogResult, - openBulkRestoreDialog, -} from "./bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component"; import { BulkShareDialogResult, openBulkShareDialog, @@ -683,16 +679,6 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "restoreItemConfirmation" }, - content: { key: "restoreItem" }, - type: SimpleDialogType.WARNING, - }); - - if (!confirmed) { - return false; - } - try { await this.cipherService.restoreWithServer(c.id); this.platformUtilsService.showToast("success", null, this.i18nService.t("restoredItem")); @@ -717,14 +703,9 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - const dialog = openBulkRestoreDialog(this.dialogService, { - data: { cipherIds: selectedCipherIds }, - }); - - const result = await lastValueFrom(dialog.closed); - if (result === BulkRestoreDialogResult.Restored) { - this.refresh(); - } + await this.cipherService.restoreManyWithServer(selectedCipherIds); + this.platformUtilsService.showToast("success", null, this.i18nService.t("restoredItems")); + this.refresh(); } async deleteCipher(c: CipherView): Promise { diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts index cfeafbf032c..dc12eeba49e 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -71,10 +71,6 @@ import { BulkDeleteDialogResult, openBulkDeleteDialog, } from "../individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component"; -import { - BulkRestoreDialogResult, - openBulkRestoreDialog, -} from "../individual-vault/bulk-action-dialogs/bulk-restore-dialog/bulk-restore-dialog.component"; import { RoutedVaultFilterBridgeService } from "../individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; import { RoutedVaultFilterService } from "../individual-vault/vault-filter/services/routed-vault-filter.service"; import { createFilterFunction } from "../individual-vault/vault-filter/shared/models/filter-function"; @@ -669,16 +665,6 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "restoreItem" }, - content: { key: "restoreItemConfirmation" }, - type: SimpleDialogType.WARNING, - }); - - if (!confirmed) { - return false; - } - try { const asAdmin = this.organization?.canEditAnyCollection; await this.cipherService.restoreWithServer(c.id, asAdmin); @@ -704,14 +690,9 @@ export class VaultComponent implements OnInit, OnDestroy { return; } - const dialog = openBulkRestoreDialog(this.dialogService, { - data: { cipherIds: selectedCipherIds, organization: this.organization }, - }); - - const result = await lastValueFrom(dialog.closed); - if (result === BulkRestoreDialogResult.Restored) { - this.refresh(); - } + await this.cipherService.restoreManyWithServer(selectedCipherIds); + this.platformUtilsService.showToast("success", null, this.i18nService.t("restoredItems")); + this.refresh(); } async deleteCipher(c: CipherView): Promise { diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 97ad4adb408..316dd8b68c8 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -3842,30 +3842,12 @@ "restoreSelected": { "message": "Restore selected" }, - "restoreItem": { - "message": "Restore item" - }, "restoredItem": { "message": "Item restored" }, "restoredItems": { "message": "Items restored" }, - "restoreItemConfirmation": { - "message": "Are you sure you want to restore this item?" - }, - "restoreItems": { - "message": "Restore items" - }, - "restoreSelectedItemsDesc": { - "message": "You have selected $COUNT$ item(s) to restore. Are you sure you want to restore these items?", - "placeholders": { - "count": { - "content": "$1", - "example": "150" - } - } - }, "restoredItemId": { "message": "Item $ID$ restored", "placeholders": { diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index 52780ae3957..44da000a7ba 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -433,16 +433,6 @@ export class AddEditComponent implements OnInit, OnDestroy { return false; } - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "restoreItem" }, - content: { key: "restoreItemConfirmation" }, - type: SimpleDialogType.WARNING, - }); - - if (!confirmed) { - return false; - } - try { this.restorePromise = this.restoreCipher(); await this.restorePromise; diff --git a/libs/angular/src/vault/components/view.component.ts b/libs/angular/src/vault/components/view.component.ts index 1236e07bd79..7ba14b97f8f 100644 --- a/libs/angular/src/vault/components/view.component.ts +++ b/libs/angular/src/vault/components/view.component.ts @@ -209,16 +209,6 @@ export class ViewComponent implements OnDestroy, OnInit { return false; } - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "restoreItem" }, - content: { key: "restoreItemConfirmation" }, - type: SimpleDialogType.WARNING, - }); - - if (!confirmed) { - return false; - } - try { await this.restoreCipher(); this.platformUtilsService.showToast("success", null, this.i18nService.t("restoredItem")); From 7b4faeaaca1b767eafde26e18a82a0fc23ecbdb1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 15:54:39 -0400 Subject: [PATCH 270/299] Update npm minor (#5724) * Update npm minor * Do not update past prettier major version --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Matt Gibson --- apps/cli/package.json | 10 +- apps/desktop/desktop_native/package.json | 2 +- .../package-lock.json | 8 +- .../native-messaging-test-runner/package.json | 2 +- .../vault-cipher-row.component.html | 6 +- .../src/navigation/nav-item.component.html | 4 +- package-lock.json | 6080 ++++++++++++----- package.json | 104 +- 8 files changed, 4255 insertions(+), 1961 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 7c6e50e22a2..0fc26e1fabf 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -49,29 +49,29 @@ "dependencies": { "@koa/multer": "3.0.2", "@koa/router": "12.0.0", - "argon2": "0.30.3", + "argon2": "0.31.0", "big-integer": "1.6.51", "browser-hrtime": "1.1.8", "chalk": "4.1.2", "commander": "7.2.0", "form-data": "4.0.0", "https-proxy-agent": "5.0.1", - "inquirer": "8.2.5", + "inquirer": "8.2.6", "jsdom": "22.1.0", "jszip": "3.10.1", "koa": "2.14.2", - "koa-bodyparser": "4.4.0", + "koa-bodyparser": "4.4.1", "koa-json": "2.0.2", "lowdb": "1.0.0", "lunr": "2.3.9", "multer": "1.4.5-lts.1", - "node-fetch": "2.6.11", + "node-fetch": "2.6.12", "node-forge": "1.3.1", "open": "8.4.2", "papaparse": "5.4.1", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", - "tldts": "6.0.5", + "tldts": "6.0.14", "zxcvbn": "4.4.2" } } diff --git a/apps/desktop/desktop_native/package.json b/apps/desktop/desktop_native/package.json index fe37602768e..44958043707 100644 --- a/apps/desktop/desktop_native/package.json +++ b/apps/desktop/desktop_native/package.json @@ -11,7 +11,7 @@ "author": "", "license": "GPL-3.0", "devDependencies": { - "@napi-rs/cli": "2.16.1" + "@napi-rs/cli": "2.16.2" }, "napi": { "name": "desktop_native", diff --git a/apps/desktop/native-messaging-test-runner/package-lock.json b/apps/desktop/native-messaging-test-runner/package-lock.json index d90b46ea702..324cbee1bea 100644 --- a/apps/desktop/native-messaging-test-runner/package-lock.json +++ b/apps/desktop/native-messaging-test-runner/package-lock.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@tsconfig/node16": "1.0.4", - "@types/node": "18.16.16", + "@types/node": "18.17.5", "@types/node-ipc": "9.2.0", "typescript": "4.7.4" } @@ -99,9 +99,9 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/node": { - "version": "18.16.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.16.tgz", - "integrity": "sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==" + "version": "18.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz", + "integrity": "sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==" }, "node_modules/@types/node-ipc": { "version": "9.2.0", diff --git a/apps/desktop/native-messaging-test-runner/package.json b/apps/desktop/native-messaging-test-runner/package.json index 70e69fd51ae..002138d3b57 100644 --- a/apps/desktop/native-messaging-test-runner/package.json +++ b/apps/desktop/native-messaging-test-runner/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@tsconfig/node16": "1.0.4", - "@types/node": "18.16.16", + "@types/node": "18.17.5", "@types/node-ipc": "9.2.0", "typescript": "4.7.4" }, diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index 664b3bbc380..07d061311cf 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -11,11 +11,7 @@ - +
diff --git a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts b/libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts similarity index 72% rename from libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts rename to libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts index d8824cd7dd4..f9acdbe8c6e 100644 --- a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts +++ b/libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.component.ts @@ -2,37 +2,30 @@ import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; import { Component, Inject } from "@angular/core"; import { FormGroup } from "@angular/forms"; -import { - SimpleDialogType, - SimpleDialogCloseType, - Translation, -} from "@bitwarden/angular/services/dialog"; -import { SimpleDialogOptions } from "@bitwarden/angular/services/dialog/simple-dialog-options"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SimpleDialogOptions, SimpleDialogType, Translation } from "../.."; + const DEFAULT_ICON: Record = { - [SimpleDialogType.PRIMARY]: "bwi-business", - [SimpleDialogType.SUCCESS]: "bwi-star", - [SimpleDialogType.INFO]: "bwi-info-circle", - [SimpleDialogType.WARNING]: "bwi-exclamation-triangle", - [SimpleDialogType.DANGER]: "bwi-error", + primary: "bwi-business", + success: "bwi-star", + info: "bwi-info-circle", + warning: "bwi-exclamation-triangle", + danger: "bwi-error", }; const DEFAULT_COLOR: Record = { - [SimpleDialogType.PRIMARY]: "tw-text-primary-500", - [SimpleDialogType.SUCCESS]: "tw-text-success", - [SimpleDialogType.INFO]: "tw-text-info", - [SimpleDialogType.WARNING]: "tw-text-warning", - [SimpleDialogType.DANGER]: "tw-text-danger", + primary: "tw-text-primary-500", + success: "tw-text-success", + info: "tw-text-info", + warning: "tw-text-warning", + danger: "tw-text-danger", }; @Component({ templateUrl: "./simple-configurable-dialog.component.html", }) export class SimpleConfigurableDialogComponent { - protected SimpleDialogType = SimpleDialogType; - protected SimpleDialogCloseType = SimpleDialogCloseType; - get iconClasses() { return [ this.simpleDialogOpts.icon ?? DEFAULT_ICON[this.simpleDialogOpts.type], @@ -61,7 +54,7 @@ export class SimpleConfigurableDialogComponent { await this.simpleDialogOpts.acceptAction(); } - this.dialogRef.close(SimpleDialogCloseType.ACCEPT); + this.dialogRef.close(true); }; private localizeText() { diff --git a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts b/libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts similarity index 84% rename from libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts rename to libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts index 0982db1ca7a..81400537be5 100644 --- a/libs/components/src/dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts +++ b/libs/components/src/dialog/simple-dialog/simple-configurable-dialog/simple-configurable-dialog.service.stories.ts @@ -1,17 +1,13 @@ import { Component } from "@angular/core"; import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; -import { - SimpleDialogType, - SimpleDialogOptions, - DialogServiceAbstraction, -} from "@bitwarden/angular/services/dialog"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { ButtonModule } from "../../button"; -import { CalloutModule } from "../../callout"; -import { I18nMockService } from "../../utils/i18n-mock.service"; -import { DialogModule } from "../dialog.module"; +import { SimpleDialogOptions, DialogService } from "../.."; +import { ButtonModule } from "../../../button"; +import { CalloutModule } from "../../../callout"; +import { I18nMockService } from "../../../utils/i18n-mock.service"; +import { DialogModule } from "../../dialog.module"; @Component({ template: ` @@ -41,27 +37,27 @@ class StoryDialogComponent { { title: this.i18nService.t("primaryTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, + type: "primary", }, { title: this.i18nService.t("successTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.SUCCESS, + type: "success", }, { title: this.i18nService.t("infoTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.INFO, + type: "info", }, { title: this.i18nService.t("warningTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.WARNING, + type: "warning", }, { title: this.i18nService.t("dangerTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.DANGER, + type: "danger", }, ], }, @@ -71,21 +67,21 @@ class StoryDialogComponent { { title: this.i18nService.t("primaryTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, + type: "primary", acceptButtonText: "Ok", cancelButtonText: null, }, { title: this.i18nService.t("primaryTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, + type: "primary", acceptButtonText: this.i18nService.t("accept"), cancelButtonText: this.i18nService.t("decline"), }, { title: this.i18nService.t("primaryTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, + type: "primary", acceptButtonText: "Ok", }, ], @@ -96,7 +92,7 @@ class StoryDialogComponent { { title: this.i18nService.t("primaryTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, + type: "primary", icon: "bwi-family", }, ], @@ -107,7 +103,7 @@ class StoryDialogComponent { { title: this.i18nService.t("primaryTypeSimpleDialog"), content: this.i18nService.t("dialogContent"), - type: SimpleDialogType.PRIMARY, + type: "primary", disableClose: true, }, { @@ -116,7 +112,7 @@ class StoryDialogComponent { acceptAction: () => { return new Promise((resolve) => setTimeout(resolve, 10000)); }, - type: SimpleDialogType.PRIMARY, + type: "primary", }, ], }, @@ -126,7 +122,7 @@ class StoryDialogComponent { calloutType = "info"; dialogCloseResult: boolean; - constructor(public dialogService: DialogServiceAbstraction, private i18nService: I18nService) {} + constructor(public dialogService: DialogService, private i18nService: I18nService) {} async openSimpleConfigurableDialog(opts: SimpleDialogOptions) { this.dialogCloseResult = await this.dialogService.openSimpleDialog(opts); diff --git a/libs/components/src/dialog/simple-dialog.service.stories.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts similarity index 80% rename from libs/components/src/dialog/simple-dialog.service.stories.ts rename to libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts index 5050af35b6f..b6615184ecb 100644 --- a/libs/components/src/dialog/simple-dialog.service.stories.ts +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts @@ -4,15 +4,15 @@ import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { ButtonModule } from "../button"; -import { IconButtonModule } from "../icon-button"; -import { SharedModule } from "../shared/shared.module"; -import { I18nMockService } from "../utils/i18n-mock.service"; +import { ButtonModule } from "../../button"; +import { IconButtonModule } from "../../icon-button"; +import { SharedModule } from "../../shared/shared.module"; +import { I18nMockService } from "../../utils/i18n-mock.service"; +import { DialogService } from "../dialog.service"; +import { DialogCloseDirective } from "../directives/dialog-close.directive"; +import { DialogTitleContainerDirective } from "../directives/dialog-title-container.directive"; -import { DialogService } from "./dialog.service"; -import { DialogCloseDirective } from "./directives/dialog-close.directive"; -import { DialogTitleContainerDirective } from "./directives/dialog-title-container.directive"; -import { SimpleDialogComponent } from "./simple-dialog/simple-dialog.component"; +import { SimpleDialogComponent } from "./simple-dialog.component"; interface Animal { animal: string; diff --git a/libs/angular/src/services/dialog/simple-dialog-options.ts b/libs/components/src/dialog/simple-dialog/types.ts similarity index 89% rename from libs/angular/src/services/dialog/simple-dialog-options.ts rename to libs/components/src/dialog/simple-dialog/types.ts index aec6f00e32f..4032b499cbe 100644 --- a/libs/angular/src/services/dialog/simple-dialog-options.ts +++ b/libs/components/src/dialog/simple-dialog/types.ts @@ -1,5 +1,7 @@ -import { SimpleDialogType } from "./simple-dialog-type.enum"; -import { Translation } from "./translation"; +export interface Translation { + key: string; + placeholders?: Array; +} // Using type lets devs skip optional params w/out having to pass undefined. /** @@ -55,3 +57,5 @@ export type SimpleDialogOptions = { */ acceptAction?: () => Promise; }; + +export type SimpleDialogType = "primary" | "success" | "info" | "warning" | "danger"; diff --git a/libs/components/src/search/search.stories.ts b/libs/components/src/search/search.stories.ts index c68d6112809..d4af6e676ae 100644 --- a/libs/components/src/search/search.stories.ts +++ b/libs/components/src/search/search.stories.ts @@ -1,10 +1,10 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { JslibModule } from "@bitwarden/angular/jslib.module"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { InputModule } from "../input/input.module"; +import { SharedModule } from "../shared"; import { I18nMockService } from "../utils/i18n-mock.service"; import { SearchComponent } from "./search.component"; @@ -14,7 +14,7 @@ export default { component: SearchComponent, decorators: [ moduleMetadata({ - imports: [InputModule, FormsModule, ReactiveFormsModule, JslibModule], + imports: [SharedModule, InputModule, FormsModule, ReactiveFormsModule], providers: [ { provide: I18nService, diff --git a/libs/shared/tsconfig.libs.json b/libs/shared/tsconfig.libs.json index 28a1ccdfa4c..18b7b1712a4 100644 --- a/libs/shared/tsconfig.libs.json +++ b/libs/shared/tsconfig.libs.json @@ -5,6 +5,7 @@ "@bitwarden/angular/*": ["../angular/src/*"], "@bitwarden/auth": ["../auth/src/*"], "@bitwarden/common/*": ["../common/src/*"], + "@bitwarden/components": ["../components/src"], "@bitwarden/exporter/*": ["../exporter/src/*"], "@bitwarden/importer": ["../importer/src"], "@bitwarden/node/*": ["../node/src/*"] From e016ed001e1f6f40390e7fccc2ad4e8e0249228f Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Wed, 16 Aug 2023 16:17:03 +0200 Subject: [PATCH 277/299] [PM-2899] Implement ProtonPass json importer (#5766) * Implement ProtonPass json importer * Add protonpass-importer json type definition * Fix alphabetical order in importer imports * Add importer error message for encrypted protonpass imports * Add i18n to protonpass importer * Add protonpass (zip) importer * Fix protonpass importer * Add unit tests for protonpass importer * Make protonpass importer not discard totp codes * Merge protonpass json & zip importers * Add protonpass creditcard import & fix note import * Fix protonpass zip import not recognizing zip files on windows/chrome * Make protonpass importer use vault types * Make protonpass importer treat vaults as folders * Make protonpass importer treat folders as collections for organizations Co-authored-by: Daniel James Smith * Add types to protonpass test data * Fix protonpass importer's moveFoldersToCollections * Add tests for folders/collections * Remove unecessary type cast in protonpass importer * Remove unecessary type annotations in protonpass importer * Add assertion for credit card cvv in protonpass importer * Handle trashed items in protonpass importer * Fix setting expiry month on credit cards * Fix wrong folder-assignment Only the first item of a "vault" was getting assigned to a folder Extend unit tests to verify behaviour --------- Co-authored-by: Daniel James Smith Co-authored-by: Daniel James Smith --- apps/cli/src/locales/en/messages.json | 3 + apps/cli/src/tools/import.command.ts | 4 +- apps/cli/src/utils.ts | 5 +- .../tools/import-export/import.component.html | 4 + .../tools/import-export/import.component.ts | 16 +- .../spec/protonpass-json-importer.spec.ts | 117 ++++++++++++ .../protonpass-json/protonpass.json.ts | 174 ++++++++++++++++++ libs/importer/src/importers/index.ts | 1 + .../protonpass/protonpass-json-importer.ts | 105 +++++++++++ .../protonpass/types/protonpass-json-type.ts | 72 ++++++++ libs/importer/src/models/import-options.ts | 1 + libs/importer/src/services/import.service.ts | 3 + 12 files changed, 498 insertions(+), 7 deletions(-) create mode 100644 libs/importer/spec/protonpass-json-importer.spec.ts create mode 100644 libs/importer/spec/test-data/protonpass-json/protonpass.json.ts create mode 100644 libs/importer/src/importers/protonpass/protonpass-json-importer.ts create mode 100644 libs/importer/src/importers/protonpass/types/protonpass-json-type.ts diff --git a/apps/cli/src/locales/en/messages.json b/apps/cli/src/locales/en/messages.json index 4b6524b7ccb..e12b30af2c0 100644 --- a/apps/cli/src/locales/en/messages.json +++ b/apps/cli/src/locales/en/messages.json @@ -46,5 +46,8 @@ }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." + }, + "unsupportedEncryptedImport": { + "message": "Importing encrypted files is currently not supported." } } diff --git a/apps/cli/src/tools/import.command.ts b/apps/cli/src/tools/import.command.ts index 0080197aa74..c013d3c6b62 100644 --- a/apps/cli/src/tools/import.command.ts +++ b/apps/cli/src/tools/import.command.ts @@ -67,7 +67,9 @@ export class ImportCommand { try { let contents; if (format === "1password1pux") { - contents = await CliUtils.extract1PuxContent(filepath); + contents = await CliUtils.extractZipContent(filepath, "export.data"); + } else if (format === "protonpass" && filepath.endsWith(".zip")) { + contents = await CliUtils.extractZipContent(filepath, "Proton Pass/data.json"); } else { contents = await CliUtils.readFile(filepath); } diff --git a/apps/cli/src/utils.ts b/apps/cli/src/utils.ts index d5e442ded19..f8780dbec63 100644 --- a/apps/cli/src/utils.ts +++ b/apps/cli/src/utils.ts @@ -46,7 +46,7 @@ export class CliUtils { }); } - static extract1PuxContent(input: string): Promise { + static extractZipContent(input: string, filepath: string): Promise { return new Promise((resolve, reject) => { let p: string = null; if (input != null && input !== "") { @@ -65,7 +65,7 @@ export class CliUtils { } JSZip.loadAsync(data).then( (zip) => { - resolve(zip.file("export.data").async("string")); + resolve(zip.file(filepath).async("string")); }, (reason) => { reject(reason); @@ -74,6 +74,7 @@ export class CliUtils { }); }); } + /** * Save the given data to a file and determine the target file if necessary. * If output is non-empty, it is used as target filename. Otherwise the target filename is diff --git a/apps/web/src/app/tools/import-export/import.component.html b/apps/web/src/app/tools/import-export/import.component.html index 67c2fe45b2a..c9e3285c291 100644 --- a/apps/web/src/app/tools/import-export/import.component.html +++ b/apps/web/src/app/tools/import-export/import.component.html @@ -341,6 +341,10 @@ Log in to "https://vault.passky.org" → "Import & Export" → "Export" in the Passky section. ("Backup" is unsupported as it is encrypted). + + In the ProtonPass browser extension, go to Settings > Export. Export without PGP encryption + and save the zip file. + {{ "selectImportFile" | i18n }} diff --git a/apps/web/src/app/tools/import-export/import.component.ts b/apps/web/src/app/tools/import-export/import.component.ts index 58f30b4ee48..eb9201f021d 100644 --- a/apps/web/src/app/tools/import-export/import.component.ts +++ b/apps/web/src/app/tools/import-export/import.component.ts @@ -326,7 +326,15 @@ export class ImportComponent implements OnInit, OnDestroy { private getFileContents(file: File): Promise { if (this.format === "1password1pux") { - return this.extract1PuxContent(file); + return this.extractZipContent(file, "export.data"); + } + if ( + this.format === "protonpass" && + (file.type === "application/zip" || + file.type == "application/x-zip-compressed" || + file.name.endsWith(".zip")) + ) { + return this.extractZipContent(file, "Proton Pass/data.json"); } return new Promise((resolve, reject) => { @@ -353,11 +361,11 @@ export class ImportComponent implements OnInit, OnDestroy { }); } - private extract1PuxContent(file: File): Promise { + private extractZipContent(zipFile: File, contentFilePath: string): Promise { return new JSZip() - .loadAsync(file) + .loadAsync(zipFile) .then((zip) => { - return zip.file("export.data").async("string"); + return zip.file(contentFilePath).async("string"); }) .then( function success(content) { diff --git a/libs/importer/spec/protonpass-json-importer.spec.ts b/libs/importer/spec/protonpass-json-importer.spec.ts new file mode 100644 index 00000000000..b8d57b9be7b --- /dev/null +++ b/libs/importer/spec/protonpass-json-importer.spec.ts @@ -0,0 +1,117 @@ +import { MockProxy } from "jest-mock-extended"; + +import { FieldType } from "@bitwarden/common/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; + +import { ProtonPassJsonImporter } from "../src/importers"; + +import { testData } from "./test-data/protonpass-json/protonpass.json"; + +describe("Protonpass Json Importer", () => { + let importer: ProtonPassJsonImporter; + let i18nService: MockProxy; + beforeEach(() => { + importer = new ProtonPassJsonImporter(i18nService); + }); + + it("should parse login data", async () => { + const testDataJson = JSON.stringify(testData); + + const result = await importer.parse(testDataJson); + expect(result != null).toBe(true); + + const cipher = result.ciphers.shift(); + expect(cipher.name).toEqual("Test Login - Personal Vault"); + expect(cipher.type).toEqual(CipherType.Login); + expect(cipher.login.username).toEqual("Username"); + expect(cipher.login.password).toEqual("Password"); + expect(cipher.login.uris.length).toEqual(2); + const uriView = cipher.login.uris.shift(); + expect(uriView.uri).toEqual("https://example.com/"); + expect(cipher.notes).toEqual("My login secure note."); + + expect(cipher.fields.at(2).name).toEqual("second 2fa secret"); + expect(cipher.fields.at(2).value).toEqual("TOTPCODE"); + expect(cipher.fields.at(2).type).toEqual(FieldType.Hidden); + }); + + it("should parse note data", async () => { + const testDataJson = JSON.stringify(testData); + + const result = await importer.parse(testDataJson); + expect(result != null).toBe(true); + + result.ciphers.shift(); + const noteCipher = result.ciphers.shift(); + expect(noteCipher.type).toEqual(CipherType.SecureNote); + expect(noteCipher.name).toEqual("My Secure Note"); + expect(noteCipher.notes).toEqual("Secure note contents."); + }); + + it("should parse credit card data", async () => { + const testDataJson = JSON.stringify(testData); + + const result = await importer.parse(testDataJson); + expect(result != null).toBe(true); + + result.ciphers.shift(); + result.ciphers.shift(); + + const creditCardCipher = result.ciphers.shift(); + expect(creditCardCipher.type).toBe(CipherType.Card); + expect(creditCardCipher.card.number).toBe("1234222233334444"); + expect(creditCardCipher.card.cardholderName).toBe("Test name"); + expect(creditCardCipher.card.expMonth).toBe("1"); + expect(creditCardCipher.card.expYear).toBe("2025"); + expect(creditCardCipher.card.code).toBe("333"); + expect(creditCardCipher.fields.at(0).name).toEqual("PIN"); + expect(creditCardCipher.fields.at(0).value).toEqual("1234"); + expect(creditCardCipher.fields.at(0).type).toEqual(FieldType.Hidden); + }); + + it("should create folders if not part of an organization", async () => { + const testDataJson = JSON.stringify(testData); + const result = await importer.parse(testDataJson); + + const folders = result.folders; + expect(folders.length).toBe(2); + expect(folders[0].name).toBe("Personal"); + expect(folders[1].name).toBe("Test"); + + // "My Secure Note" is assigned to folder "Personal" + expect(result.folderRelationships[1]).toEqual([1, 0]); + // "Other vault login" is assigned to folder "Test" + expect(result.folderRelationships[3]).toEqual([3, 1]); + }); + + it("should create collections if part of an organization", async () => { + const testDataJson = JSON.stringify(testData); + importer.organizationId = Utils.newGuid(); + const result = await importer.parse(testDataJson); + expect(result != null).toBe(true); + + const collections = result.collections; + expect(collections.length).toBe(2); + expect(collections[0].name).toBe("Personal"); + expect(collections[1].name).toBe("Test"); + + // "My Secure Note" is assigned to folder "Personal" + expect(result.collectionRelationships[1]).toEqual([1, 0]); + // "Other vault login" is assigned to folder "Test" + expect(result.collectionRelationships[3]).toEqual([3, 1]); + }); + + it("should not add deleted items", async () => { + const testDataJson = JSON.stringify(testData); + const result = await importer.parse(testDataJson); + + const ciphers = result.ciphers; + for (const cipher of ciphers) { + expect(cipher.name).not.toBe("My Deleted Note"); + } + + expect(ciphers.length).toBe(4); + }); +}); diff --git a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts b/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts new file mode 100644 index 00000000000..4217ddd4d5b --- /dev/null +++ b/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts @@ -0,0 +1,174 @@ +import { ProtonPassJsonFile } from "../../../src/importers/protonpass/types/protonpass-json-type"; + +export const testData: ProtonPassJsonFile = { + version: "1.3.1", + userId: "REDACTED_USER_ID", + encrypted: false, + vaults: { + REDACTED_VAULT_ID_A: { + name: "Personal", + description: "Personal vault", + display: { + color: 0, + icon: 0, + }, + items: [ + { + itemId: + "yZENmDjtmZGODNy3Q_CZiPAF_IgINq8w-R-qazrOh-Nt9YJeVF3gu07ovzDS4jhYHoMdOebTw5JkYPGgIL1mwQ==", + shareId: + "SN5uWo4WZF2uT5wIDqtbdpkjuxCbNTOIdf-JQ_DYZcKYKURHiZB5csS1a1p9lklvju9ni42l08IKzwQG0B2ySg==", + data: { + metadata: { + name: "Test Login - Personal Vault", + note: "My login secure note.", + itemUuid: "e8ee1a0c", + }, + extraFields: [ + { + fieldName: "non-hidden field", + type: "text", + data: { + content: "non-hidden field content", + }, + }, + { + fieldName: "hidden field", + type: "hidden", + data: { + content: "hidden field content", + }, + }, + { + fieldName: "second 2fa secret", + type: "totp", + data: { + totpUri: "TOTPCODE", + }, + }, + ], + type: "login", + content: { + username: "Username", + password: "Password", + urls: ["https://example.com/", "https://example2.com/"], + totpUri: + "otpauth://totp/Test%20Login%20-%20Personal%20Vault:Username?issuer=Test%20Login%20-%20Personal%20Vault&secret=TOTPCODE&algorithm=SHA1&digits=6&period=30", + }, + }, + state: 1, + aliasEmail: null, + contentFormatVersion: 1, + createTime: 1689182868, + modifyTime: 1689182868, + }, + { + itemId: + "xqq_Bh8RxNMBerkiMvRdH427yswZznjYwps-f6C5D8tmKiPgMxCSPNz1BOd4nRJ309gciDiPhXcCVWOyfJ66ZA==", + shareId: + "SN5uWo4WZF2uT5wIDqtbdpkjuxCbNTOIdf-JQ_DYZcKYKURHiZB5csS1a1p9lklvju9ni42l08IKzwQG0B2ySg==", + data: { + metadata: { + name: "My Secure Note", + note: "Secure note contents.", + itemUuid: "ad618070", + }, + extraFields: [], + type: "note", + content: {}, + }, + state: 1, + aliasEmail: null, + contentFormatVersion: 1, + createTime: 1689182908, + modifyTime: 1689182908, + }, + { + itemId: + "ZmGzd-HNQYTr6wmfWlSfiStXQLqGic_PYB2Q2T_hmuRM2JIA4pKAPJcmFafxJrDpXxLZ2EPjgD6Noc9a0U6AVQ==", + shareId: + "SN5uWo4WZF2uT5wIDqtbdpkjuxCbNTOIdf-JQ_DYZcKYKURHiZB5csS1a1p9lklvju9ni42l08IKzwQG0B2ySg==", + data: { + metadata: { + name: "Test Card", + note: "Credit Card Note", + itemUuid: "d8f45370", + }, + extraFields: [], + type: "creditCard", + content: { + cardholderName: "Test name", + cardType: 0, + number: "1234222233334444", + verificationNumber: "333", + expirationDate: "012025", + pin: "1234", + }, + }, + state: 1, + aliasEmail: null, + contentFormatVersion: 1, + createTime: 1691001643, + modifyTime: 1691001643, + }, + { + itemId: + "xqq_Bh8RxNMBerkiMvRdH427yswZznjYwps-f6C5D8tmKiPgMxCSPNz1BOd4nRJ309gciDiPhXcCVWOyfJ66ZA==", + shareId: + "SN5uWo4WZF2uT5wIDqtbdpkjuxCbNTOIdf-JQ_DYZcKYKURHiZB5csS1a1p9lklvju9ni42l08IKzwQG0B2ySg==", + data: { + metadata: { + name: "My Deleted Note", + note: "Secure note contents.", + itemUuid: "ad618070", + }, + extraFields: [], + type: "note", + content: {}, + }, + state: 2, + aliasEmail: null, + contentFormatVersion: 1, + createTime: 1689182908, + modifyTime: 1689182908, + }, + ], + }, + REDACTED_VAULT_ID_B: { + name: "Test", + description: "", + display: { + color: 4, + icon: 2, + }, + items: [ + { + itemId: + "U_J8-eUR15sC-PjUhjVcixDcayhjGuoerUZCr560RlAi0ZjBNkSaSKAytVzZn4E0hiFX1_y4qZbUetl6jO3aJw==", + shareId: + "OJz-4MnPqAuYnyemhctcGDlSLJrzsTnf2FnFSwxh1QP_oth9xyGDc2ZAqCv5FnqkVgTNHT5aPj62zcekNemfNw==", + data: { + metadata: { + name: "Other vault login", + note: "", + itemUuid: "f3429d44", + }, + extraFields: [], + type: "login", + content: { + username: "other vault username", + password: "other vault password", + urls: [], + totpUri: "", + }, + }, + state: 1, + aliasEmail: null, + contentFormatVersion: 1, + createTime: 1689182949, + modifyTime: 1689182949, + }, + ], + }, + }, +}; diff --git a/libs/importer/src/importers/index.ts b/libs/importer/src/importers/index.ts index 1a479a4cf5f..fff2edf3d54 100644 --- a/libs/importer/src/importers/index.ts +++ b/libs/importer/src/importers/index.ts @@ -44,6 +44,7 @@ export { PasswordBossJsonImporter } from "./passwordboss-json-importer"; export { PasswordDragonXmlImporter } from "./passworddragon-xml-importer"; export { PasswordSafeXmlImporter } from "./passwordsafe-xml-importer"; export { PasswordWalletTxtImporter } from "./passwordwallet-txt-importer"; +export { ProtonPassJsonImporter } from "./protonpass/protonpass-json-importer"; export { PsonoJsonImporter } from "./psono/psono-json-importer"; export { RememBearCsvImporter } from "./remembear-csv-importer"; export { RoboFormCsvImporter } from "./roboform-csv-importer"; diff --git a/libs/importer/src/importers/protonpass/protonpass-json-importer.ts b/libs/importer/src/importers/protonpass/protonpass-json-importer.ts new file mode 100644 index 00000000000..86f4444ec4d --- /dev/null +++ b/libs/importer/src/importers/protonpass/protonpass-json-importer.ts @@ -0,0 +1,105 @@ +import { FieldType, SecureNoteType } from "@bitwarden/common/enums"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { CardView } from "@bitwarden/common/vault/models/view/card.view"; +import { SecureNoteView } from "@bitwarden/common/vault/models/view/secure-note.view"; + +import { ImportResult } from "../../models/import-result"; +import { BaseImporter } from "../base-importer"; +import { Importer } from "../importer"; + +import { + ProtonPassCreditCardItemContent, + ProtonPassItemState, + ProtonPassJsonFile, + ProtonPassLoginItemContent, +} from "./types/protonpass-json-type"; + +export class ProtonPassJsonImporter extends BaseImporter implements Importer { + constructor(private i18nService: I18nService) { + super(); + } + + parse(data: string): Promise { + const result = new ImportResult(); + const results: ProtonPassJsonFile = JSON.parse(data); + if (results == null || results.vaults == null) { + result.success = false; + return Promise.resolve(result); + } + + if (results.encrypted) { + result.success = false; + result.errorMessage = this.i18nService.t("unsupportedEncryptedImport"); + return Promise.resolve(result); + } + + for (const [, vault] of Object.entries(results.vaults)) { + for (const item of vault.items) { + if (item.state == ProtonPassItemState.TRASHED) { + continue; + } + this.processFolder(result, vault.name); + + const cipher = this.initLoginCipher(); + cipher.name = item.data.metadata.name; + cipher.notes = item.data.metadata.note; + + switch (item.data.type) { + case "login": { + const loginContent = item.data.content as ProtonPassLoginItemContent; + cipher.login.uris = this.makeUriArray(loginContent.urls); + cipher.login.username = loginContent.username; + cipher.login.password = loginContent.password; + if (loginContent.totpUri != "") { + cipher.login.totp = new URL(loginContent.totpUri).searchParams.get("secret"); + } + for (const extraField of item.data.extraFields) { + this.processKvp( + cipher, + extraField.fieldName, + extraField.type == "totp" ? extraField.data.totpUri : extraField.data.content, + extraField.type == "text" ? FieldType.Text : FieldType.Hidden + ); + } + break; + } + case "note": + cipher.type = CipherType.SecureNote; + cipher.secureNote = new SecureNoteView(); + cipher.secureNote.type = SecureNoteType.Generic; + break; + case "creditCard": { + const creditCardContent = item.data.content as ProtonPassCreditCardItemContent; + cipher.type = CipherType.Card; + cipher.card = new CardView(); + cipher.card.cardholderName = creditCardContent.cardholderName; + cipher.card.number = creditCardContent.number; + cipher.card.brand = CardView.getCardBrandByPatterns(creditCardContent.number); + cipher.card.code = creditCardContent.verificationNumber; + + if (!this.isNullOrWhitespace(creditCardContent.expirationDate)) { + cipher.card.expMonth = creditCardContent.expirationDate.substring(0, 2); + cipher.card.expMonth = cipher.card.expMonth.replace(/^0+/, ""); + cipher.card.expYear = creditCardContent.expirationDate.substring(2, 6); + } + + if (!this.isNullOrWhitespace(creditCardContent.pin)) { + this.processKvp(cipher, "PIN", creditCardContent.pin, FieldType.Hidden); + } + + break; + } + } + + this.cleanupCipher(cipher); + result.ciphers.push(cipher); + } + } + if (this.organization) { + this.moveFoldersToCollections(result); + } + result.success = true; + return Promise.resolve(result); + } +} diff --git a/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts b/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts new file mode 100644 index 00000000000..27b38f434e7 --- /dev/null +++ b/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts @@ -0,0 +1,72 @@ +export type ProtonPassJsonFile = { + version: string; + userId: string; + encrypted: boolean; + vaults: Record; +}; + +export type ProtonPassVault = { + name: string; + description: string; + display: { + color: number; + icon: number; + }; + items: ProtonPassItem[]; +}; + +export type ProtonPassItem = { + itemId: string; + shareId: string; + data: ProtonPassItemData; + state: ProtonPassItemState; + aliasEmail: string | null; + contentFormatVersion: number; + createTime: number; + modifyTime: number; +}; + +export enum ProtonPassItemState { + ACTIVE = 1, + TRASHED = 2, +} + +export type ProtonPassItemData = { + metadata: ProtonPassItemMetadata; + extraFields: ProtonPassItemExtraField[]; + type: "login" | "alias" | "creditCard" | "note"; + content: ProtonPassLoginItemContent | ProtonPassCreditCardItemContent; +}; + +export type ProtonPassItemMetadata = { + name: string; + note: string; + itemUuid: string; +}; + +export type ProtonPassItemExtraField = { + fieldName: string; + type: string; + data: ProtonPassItemExtraFieldData; +}; + +export type ProtonPassItemExtraFieldData = { + content?: string; + totpUri?: string; +}; + +export type ProtonPassLoginItemContent = { + username?: string; + password?: string; + urls?: string[]; + totpUri?: string; +}; + +export type ProtonPassCreditCardItemContent = { + cardholderName?: string; + cardType?: number; + number?: string; + verificationNumber?: string; + expirationDate?: string; + pin?: string; +}; diff --git a/libs/importer/src/models/import-options.ts b/libs/importer/src/models/import-options.ts index 8a8ead96a49..2afe801d202 100644 --- a/libs/importer/src/models/import-options.ts +++ b/libs/importer/src/models/import-options.ts @@ -27,6 +27,7 @@ export const regularImportOptions = [ // { id: "keeperjson", name: "Keeper (json)" }, { id: "enpasscsv", name: "Enpass (csv)" }, { id: "enpassjson", name: "Enpass (json)" }, + { id: "protonpass", name: "ProtonPass (zip/json)" }, { id: "safeincloudxml", name: "SafeInCloud (xml)" }, { id: "pwsafexml", name: "Password Safe (xml)" }, { id: "stickypasswordxml", name: "Sticky Password (xml)" }, diff --git a/libs/importer/src/services/import.service.ts b/libs/importer/src/services/import.service.ts index 5920ec200d4..4ff15174c56 100644 --- a/libs/importer/src/services/import.service.ts +++ b/libs/importer/src/services/import.service.ts @@ -62,6 +62,7 @@ import { PasswordDragonXmlImporter, PasswordSafeXmlImporter, PasswordWalletTxtImporter, + ProtonPassJsonImporter, PsonoJsonImporter, RememBearCsvImporter, RoboFormCsvImporter, @@ -319,6 +320,8 @@ export class ImportService implements ImportServiceAbstraction { return new PsonoJsonImporter(); case "passkyjson": return new PasskyJsonImporter(); + case "protonpass": + return new ProtonPassJsonImporter(this.i18nService); default: return null; } From d2bff7eb8b9dc23527668b70c927fd13c8ef1090 Mon Sep 17 00:00:00 2001 From: Opeyemi Date: Wed, 16 Aug 2023 16:41:02 +0100 Subject: [PATCH 278/299] [DEVOPS-1528] - Update clients to point build and release to Prod ACR (#6026) * update clients to point build and release to Prod ACR * FIX: typo * FIX: run block * UPDATE: add suggestions * UPDATE: workflow runners and job needs * UPDATE: registry env in build * UPDATE: suggestion --- .github/workflows/build-web.yml | 79 ++++++++++------------------- .github/workflows/release-web.yml | 83 +++++++++++-------------------- 2 files changed, 54 insertions(+), 108 deletions(-) diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 9c670f01c65..b17cb816336 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -31,6 +31,9 @@ on: description: "Custom image tag extension" required: false +env: + _AZ_REGISTRY: bitwardenprod.azurecr.io + jobs: cloc: name: CLOC @@ -65,8 +68,7 @@ jobs: build-artifacts: name: Build artifacts runs-on: ubuntu-22.04 - needs: - - setup + needs: setup env: _VERSION: ${{ needs.setup.outputs.version }} strategy: @@ -146,13 +148,10 @@ jobs: matrix: include: - artifact_name: cloud-QA - registries: [bitwardenprod.azurecr.io, bitwardenqa.azurecr.io] image_name: web-qa-cloud - artifact_name: ee - registries: [bitwardenprod.azurecr.io, bitwardenqa.azurecr.io] image_name: web-ee - artifact_name: selfhosted-COMMERCIAL - registries: [bitwarden, bitwardenprod.azurecr.io, bitwardenqa.azurecr.io] image_name: web env: _VERSION: ${{ needs.setup.outputs.version }} @@ -174,15 +173,7 @@ jobs: fi ########## ACRs ########## - - name: Login to Azure - QA - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }} - - - name: Log into QA container registry - run: az acr login -n bitwardenqa - - - name: Login to Azure - Prod + - name: Login to Prod Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} @@ -190,6 +181,18 @@ jobs: - name: Log into Prod container registry run: az acr login -n bitwardenprod + - name: Login to Azure - CI Subscription + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + + - name: Retrieve github PAT secrets + id: retrieve-secret-pat + uses: bitwarden/gh-actions/get-keyvault-secrets@f096207b7a2f31723165aee6ad03e91716686e78 + with: + keyvault: "bitwarden-ci" + secrets: "github-pat-bitwarden-devops-bot-repo-scope" + - name: Download ${{ matrix.artifact_name }} artifact uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: @@ -218,37 +221,17 @@ jobs: echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT - - name: Generate tag list - id: tag-list - env: - IMAGE_TAG: ${{ steps.tag.outputs.image_tag }} - PROJECT_NAME: ${{ matrix.image_name }} - run: echo "tags=bitwardenqa.azurecr.io/${PROJECT_NAME}:${IMAGE_TAG},bitwardenprod.azurecr.io/${PROJECT_NAME}:${IMAGE_TAG}" >> $GITHUB_OUTPUT - ########## Build Image ########## - name: Extract artifact working-directory: apps/web run: unzip web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - - name: Login to Azure - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve github PAT secrets - id: retrieve-secret-pat - uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c - with: - keyvault: "bitwarden-ci" - secrets: "github-pat-bitwarden-devops-bot-repo-scope" - - - name: Setup DCT - if: ${{ env.is_publish_branch == 'true' }} - id: setup-dct - uses: bitwarden/gh-actions/setup-docker-trust@a30e9c3d658dc97c4c2e61ec749fdab64b83386c - with: - azure-creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - azure-keyvault-name: "bitwarden-ci" + - name: Generate image full name + id: image-name + env: + IMAGE_TAG: ${{ steps.tag.outputs.image_tag }} + PROJECT_NAME: ${{ matrix.image_name }} + run: echo "name=$_AZ_REGISTRY/${PROJECT_NAME}:${IMAGE_TAG}" >> $GITHUB_OUTPUT - name: Build Docker image uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 @@ -257,21 +240,10 @@ jobs: file: apps/web/Dockerfile platforms: linux/amd64 push: true - tags: ${{ steps.tag-list.outputs.tags }} + tags: ${{ steps.image-name.outputs.name }} secrets: | "GH_PAT=${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }}" - - name: Push to DockerHub - if: contains(matrix.registries, 'bitwarden') && env.is_publish_branch == 'true' - env: - IMAGE_TAG: ${{ steps.tag.outputs.image_tag }} - PROJECT_NAME: ${{ matrix.image_name }} - DOCKER_CONTENT_TRUST: 1 - DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} - run: | - docker tag bitwardenprod.azurecr.io/$PROJECT_NAME:$IMAGE_TAG bitwarden/$PROJECT_NAME:$IMAGE_TAG - docker push bitwarden/$PROJECT_NAME:$IMAGE_TAG - - name: Log out of Docker run: docker logout @@ -279,8 +251,7 @@ jobs: crowdin-push: name: Crowdin Push if: github.ref == 'refs/heads/master' - needs: - - build-artifacts + needs: build-artifacts runs-on: ubuntu-22.04 steps: - name: Checkout repo diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 0a9a0bcb23f..b53542747d9 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -15,6 +15,9 @@ on: - Redeploy - Dry Run +env: + _AZ_REGISTRY: bitwardenprod.azurecr.io + jobs: setup: name: Setup @@ -46,7 +49,6 @@ jobs: monorepo: true monorepo-project: web - self-host: name: Release self-host docker runs-on: ubuntu-22.04 @@ -67,42 +69,6 @@ jobs: - name: Checkout repo uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - ########## DockerHub ########## - - name: Setup DCT - id: setup-dct - uses: bitwarden/gh-actions/setup-docker-trust@a30e9c3d658dc97c4c2e61ec749fdab64b83386c - with: - azure-creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - azure-keyvault-name: "bitwarden-ci" - - - name: Pull branch image - run: | - if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker pull bitwarden/web:latest - else - docker pull bitwarden/web:$_BRANCH_NAME - fi - - - name: Docker Tag version - run: | - if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker tag bitwarden/web:latest bitwarden/web:$_RELEASE_VERSION - else - docker tag bitwarden/web:$_BRANCH_NAME bitwarden/web:$_RELEASE_VERSION - fi - - - name: Docker Push version - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - env: - DOCKER_CONTENT_TRUST: 1 - DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }} - run: docker push bitwarden/web:$_RELEASE_VERSION - - - name: Log out of Docker and disable Docker Notary - run: | - docker logout - echo "DOCKER_CONTENT_TRUST=0" >> $GITHUB_ENV - ########## ACR ########## - name: Login to Azure - PROD Subscription uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -112,28 +78,37 @@ jobs: - name: Login to Azure ACR run: az acr login -n bitwardenprod - - name: Tag version - env: - REGISTRY: bitwardenprod.azurecr.io + - name: Pull branch image run: | if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then - docker tag bitwarden/web:latest $REGISTRY/web:$_RELEASE_VERSION - - docker tag bitwarden/web:latest $REGISTRY/web-sh:$_RELEASE_VERSION + docker pull $_AZ_REGISTRY/web:latest else - docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web:$_RELEASE_VERSION + docker pull $_AZ_REGISTRY/web:$_BRANCH_NAME + fi - docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web-sh:$_RELEASE_VERSION + - name: Tag version + run: | + if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then + docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web:dryrun + docker tag $_AZ_REGISTRY/web:latest $_AZ_REGISTRY/web-sh:dryrun + else + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web:$_RELEASE_VERSION + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web-sh:$_RELEASE_VERSION + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web:latest + docker tag $_AZ_REGISTRY/web:$_BRANCH_NAME $_AZ_REGISTRY/web-sh:latest fi - name: Push version - if: ${{ github.event.inputs.release_type != 'Dry Run' }} - env: - REGISTRY: bitwardenprod.azurecr.io run: | - docker push $REGISTRY/web:$_RELEASE_VERSION - - docker push $REGISTRY/web-sh:$_RELEASE_VERSION + if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then + docker push $_AZ_REGISTRY/web:dryrun + docker push $_AZ_REGISTRY/web-sh:dryrun + else + docker push $_AZ_REGISTRY/web:$_RELEASE_VERSION + docker push $_AZ_REGISTRY/web-sh:$_RELEASE_VERSION + docker push $_AZ_REGISTRY/web:latest + docker push $_AZ_REGISTRY/web-sh:latest + fi - name: Log out of Docker run: docker logout @@ -190,7 +165,7 @@ jobs: - name: Unzip build asset working-directory: assets run: unzip web-*-cloud-COMMERCIAL.zip - + - name: Create new branch run: | cd ${{ github.workspace }}/ghpages-deployment @@ -199,12 +174,12 @@ jobs: git config --global url."https://github.com/".insteadOf ssh://git@github.com/ git config --global url."https://".insteadOf ssh:// git checkout -b ${_BRANCH} - + - name: Copy build files run: | rm -rf ${{ github.workspace }}/ghpages-deployment/* cp -Rf ${{ github.workspace }}/assets/build/* ghpages-deployment/ - + - name: Commit and push changes working-directory: ghpages-deployment run: | From ffabb64f6dffe2f023b7daf49d5458bf9357a023 Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:16:27 -0700 Subject: [PATCH 279/299] [PM-3099] Desktop UI Small Screen Tweaks (#4620) * add responsive queries for small screens * increase media query max-width so icons don't get cut off on medium screens --- apps/desktop/src/scss/box.scss | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/apps/desktop/src/scss/box.scss b/apps/desktop/src/scss/box.scss index 2b720eac69c..9dbdc80a5bf 100644 --- a/apps/desktop/src/scss/box.scss +++ b/apps/desktop/src/scss/box.scss @@ -504,3 +504,26 @@ } } } + +.details { + .inner-content { + .box-content-row-flex:not([type="button"]) { + @media (max-width: 875px) { + flex-direction: column; + align-items: start; + } + + .action-buttons { + @media (max-width: 875px) { + margin-left: 0; + } + } + + .row-btn:first-of-type { + @media (max-width: 875px) { + margin-left: -8px; + } + } + } + } +} From 7dc284bc3ee2346e38324591167fcfb876309e07 Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:18:42 -0700 Subject: [PATCH 280/299] remove login CTA and add footer link (#6028) --- .../auth/register-form/register-form.component.html | 11 +++++------ apps/web/src/locales/en/messages.json | 3 +++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/web/src/app/auth/register-form/register-form.component.html b/apps/web/src/app/auth/register-form/register-form.component.html index 44a53fb6e40..9a5220c57d4 100644 --- a/apps/web/src/app/auth/register-form/register-form.component.html +++ b/apps/web/src/app/auth/register-form/register-form.component.html @@ -123,8 +123,7 @@
-
-
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 485b0e616b0..b91ea4add5e 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -7094,5 +7094,8 @@ }, "beta": { "message": "Beta" + }, + "alreadyHaveAccount": { + "message": "Already have an account?" } } From acd169b113cfcea946fe34084541c37bc1b34537 Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:21:51 -0700 Subject: [PATCH 281/299] update link for Web and Browser (#5779) --- .../angular/src/auth/components/two-factor-options.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/angular/src/auth/components/two-factor-options.component.ts b/libs/angular/src/auth/components/two-factor-options.component.ts index a7d8a3235e3..786a9d7bb54 100644 --- a/libs/angular/src/auth/components/two-factor-options.component.ts +++ b/libs/angular/src/auth/components/two-factor-options.component.ts @@ -30,7 +30,7 @@ export class TwoFactorOptionsComponent implements OnInit { } recover() { - this.platformUtilsService.launchUri("https://bitwarden.com/help/lost-two-step-device/"); + this.platformUtilsService.launchUri("https://vault.bitwarden.com/#/recover-2fa"); this.onRecoverSelected.emit(); } } From 70f115c8f5929defb77b800393a8e7404d9a296a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ch=C4=99ci=C5=84ski?= Date: Thu, 17 Aug 2023 10:33:07 +0200 Subject: [PATCH 282/299] [DEVOPS-1438] Migrate our mac os desktop notary tool (#5741) * Change altool to notarytool for desktop app notarizing * Comment for testing * Add team id * Try to notarize with old method * TEst vaslues * Change after-sign notarization option * CHange notarization in package * Fix * fix * Maybe fix * Use altool to upload * Re enable if after testing --- apps/desktop/electron-builder.json | 1 + apps/desktop/scripts/after-sign.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index e92a80c4972..8e6d300218a 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -97,6 +97,7 @@ }, "dmg": { "icon": "dmg.icns", + "sign": false, "contents": [ { "x": 150, diff --git a/apps/desktop/scripts/after-sign.js b/apps/desktop/scripts/after-sign.js index 4ef3023946a..0b181f90f62 100644 --- a/apps/desktop/scripts/after-sign.js +++ b/apps/desktop/scripts/after-sign.js @@ -53,8 +53,9 @@ async function run(context) { const appleId = process.env.APPLE_ID_USERNAME || process.env.APPLEID; const appleIdPassword = process.env.APPLE_ID_PASSWORD || `@keychain:AC_PASSWORD`; return await notarize({ - appBundleId: "com.bitwarden.desktop", + tool: "notarytool", appPath: appPath, + teamId: "LTZ2PFU5D6", appleId: appleId, appleIdPassword: appleIdPassword, }); From 1b32cddbad9e797bdefcc28035ae0404d49a3f81 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Fri, 18 Aug 2023 08:47:03 +1000 Subject: [PATCH 283/299] Fix SM beta grace period dates (#6054) --- .../organization-subscription-cloud.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts index 82da9bda1ff..dedc99edcb1 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts +++ b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts @@ -47,8 +47,8 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy firstLoaded = false; loading: boolean; - private readonly _smBetaEndingDate = new Date(2023, 7, 25); - private readonly _smGracePeriodEndingDate = new Date(2023, 9, 24); + private readonly _smBetaEndingDate = new Date(2023, 7, 15); + private readonly _smGracePeriodEndingDate = new Date(2023, 10, 14); private destroy$ = new Subject(); From e916cec6b514fdd62eae123c70ae629ca6f5b776 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Fri, 18 Aug 2023 08:47:36 +1000 Subject: [PATCH 284/299] [AC-1599] Fix Secrets Manager cost subtotal when creating an organization (#6044) * Fix service account cost not included in SM subtotal * Simplify logic --- .../settings/organization-plans.component.ts | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/web/src/app/billing/settings/organization-plans.component.ts b/apps/web/src/app/billing/settings/organization-plans.component.ts index 7d9f76708ea..5c6359af951 100644 --- a/apps/web/src/app/billing/settings/organization-plans.component.ts +++ b/apps/web/src/app/billing/settings/organization-plans.component.ts @@ -314,16 +314,11 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { return 0; } - let subTotal = plan.basePrice; - if (plan.hasAdditionalSeatsOption && formValues.userSeats) { - subTotal += this.seatTotal(plan, formValues.userSeats); - } - - if (plan.hasAdditionalStorageOption && formValues.additionalServiceAccounts) { - subTotal += this.additionalServiceAccountTotal(this.selectedPlan); - } - - return subTotal; + return ( + plan.basePrice + + this.seatTotal(plan, formValues.userSeats) + + this.additionalServiceAccountTotal(plan) + ); } get freeTrial() { From 56b0fffdc85c566a4596604ff9fd85b81c3a8e00 Mon Sep 17 00:00:00 2001 From: Robyn MacCallum Date: Fri, 18 Aug 2023 11:20:10 -0400 Subject: [PATCH 285/299] Update CODEOWNERS (#6060) * Update CODEOWNERS * Update CODEOWNERS --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 15de72d785b..564763a866d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,7 +4,7 @@ # The following owners will be the default owners for everything in the repo. # Unless a later match takes precedence -* @bitwarden/team-leads-eng +* @bitwarden/tech-leads ## Secrets Manager team files ## bitwarden_license/bit-web/src/app/secrets-manager @bitwarden/team-secrets-manager-dev From 5665576147a4fbf30024f56358d424ff26a1a131 Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:05:08 -0400 Subject: [PATCH 286/299] Trusted Device Encryption feature (#5950) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * PM-1049 - Create first display draft of login-decryption-options base and web components (no data loading or user actions wired up yet; WIP) * PM-1049 - Update DeviceResponse to match latest properties on backend * PM-1049 - Add getDevices call to retrieve all user devices to API service * PM-1049 - WIP on figuring out login decryption options component requirements * PM-1049 - Add empty login decryption options to desktop * PM-1049 - Desktop - Update "Log in initiated" translation to be "Login Initiated" per figma and product request * PM-1049 - Desktop - login decryption options component html done * PM-1049 - Move login-decryption-options in web into own folder * PM-1049 - Browser - created html for login-decryption-options component * PM-1049 - Move newly created getDevices() method out of api.service into proper place in new devices-api.service. * PM-1049 -Comment cleanup and TODO added * PM-1049 - Comment cleanup and dependency cleanup across all login-decryption-options comps * PM-1049 - WIP of building out needed response and regular models for saving new UserDecryptionOptions on the Account in state. * PM-1049 - Update all User Decryption Options response and state models in light of the back end changes from a list to an object. Web building now with decryption options stored on state under the account successfully. Must now build out state service methods for retrieving / setting account decryption options for use elsewhere. * PM-1049 - State Service - setup setters / getters for UserDecryptionOptions off the account * PM-1049 - StateService - replace User with Acct for decryption options * PM-1049 - Create domain models vs using response models as response models have a response property w/ the full response nested underneath which we don't need to persist for the user decryption options stored on the account. * PM-1049 - AcctDecryptionOptions now persist across page refreshes of the login-initiated page to act similarly to refreshes on the lock screen. Accomplished via persisting AcctDecryptionOptions in local storage -- still cleared on logout. * PM-1049 - IdTokenResponse - only userDecryptionOptions if they exist on the response from the server; I saw a few instances where it did not. Wasn't able to replicate consistently, but I put this check here to be safe. * PM-1049 - Login Initiated route can only be accessed if user is AuthN w/ locked vault + TDE feature flag is on. * PM-1049 - LoginDecryptionOptions - (1) Wire up loading logic (2) Retrieve User Acct Decryption options to determine whether or not to show request admin approval btn and approve w/ MP (3) Write up future logic for requestAdminApproval (4) approveWithMasterPassword takes you to the lock screen to login. * PM-1049 - Apply same guards as in web to login-decryption-options in desktop & browser. * PM-1049 - (1) Updated dependencies in parent BaseLoginDecryptionOptionsComponent class + child components (2) Retrieve userEmail b/c needed for displaying which email the user is logging in with (3) Add log out functionality (4) Add comments regarding future implementation details for each login approval flow. * PM-1049 - Web/Browser/Desktop LoginDecryptionOptions - (1) Wire up approval buttons (2) Add conditional margins (3) Loading spinner added (4) Display userEmail + "not you" logout link * PM-1049 - Add TODOs for future changes needed as part of the Login Approval flows for TDE * PM-1049 - TODO: replace base component with business service * add new storage to replace MasterKey with UserSymKey * add storage for master key encrypted user symmetric key * Begin refactor of crypto service to support new key structure * remove provided key from getKeyForUserEncryption * add decryption with MasterKey method to crypto service * update makeKeyPair on crypto service to be generic * add type to parameter of setUserKey in abstraction of crypto service * add setUserSymKeyMasterKey so we can set the encrypted user sym key from server * update cli with new crypto service methods - decrypt user sym key and set when unlocking * separate the user key in memory from user keys in storage * add new memory concept to crypto service calls in cli * update auth service to use new crypto service * update register component in lib to use new crypto service * update register component again with more crypto service * update sync service to use new crypto service methods * update send service to use new crypto service methods * update folder service to use new crypto service methods * update cipher service to use new crypto service * update password generation service to use new crypto service * update vault timeout service with new crypto service * update collection service to use new crypto service * update emergency access components to use new crypto service methods * migrate login strategies to new key model - decrypt and set user symmetric key if Master Key is available - rename keys where applicable - update unit tests * migrate pin to use user's symmetric key instead of master key - set up new state - migrate on lock component - use new crypto service methods * update pin key when the user symmetric key is set - always set the protected pin so we can recreate pin key from user symmetric key - stop using EncryptionPair in account - use EncString for both pin key storage - update migration from old strategy on lock component * set user symmetric key on lock component - add missed key suffix types to crypto service methods * migrate auto key - add helper to internal crypto service method to migrate * remove additional keys in state service clean * clean up the old pin keys in more flows - in the case that the app is updated while logged in and the user changes their pin, this will clear the old pin keys * finish migrate auto key if needed - migrate whenever retrieved from storage - add back the user symmetric key toggle * migrate biometrics key - migrate only on retrieval * fix crypto calls for key connector and vault timeout settings * update change password components with new crypto service * update assortment of leftover old crypto service calls * update device-crypto service with new crypto service * remove old EncKey methods from crypto service * remove clearEncKey from crypto service * move crypto service jsdoc to abstraction * add org key type and new method to build a data enc key for orgs * fix typing of bulk confirm component * fix EncString serialization issues & various fixes Co-authored-by: Matt Gibson * update account model with new keys serialization * migrate native messaging for biometrics to use new key model - support backwards compatibility - update safari web extension to send user key - add error handling * add early exit to native messaging flow for errors * improve error strings in crypto service * disable disk cache for browser due to bg script/popup race conditions * clear bio key when pin is migrated as bio is refreshed * share disk cache to fix syncing issues between contexts * check for ephemeral pin before process reload * remove state no longer needed and add JSDOC * fix linter * add new types to tests * remove cryptoMasterKeyB64 from account * fix tests imports * use master key for device approvals still * cleanup old TODOs, add missing crypto service parameters * fix cli crypto service calls * share disk cache between contexts on browser * Revert "share disk cache between contexts on browser" This reverts commit 56a590c4919f119cb1465eb7091a4384f5d90699. * use user sym key for account changing unlock verification * add tests to crypto service * rename 'user symmetric key' with 'user key' * remove userId from browser crypto service * updated EncKey to UserKey where applicable * jsdoc deprecate account properties * use encrypt service in crypto service * use encrypt service in crypto service * require key in validateUserKey * check storage for user key if missing in memory * change isPinLockSet to union type * move biometric check to electron crypto service * add secondary fallback name for bio key for safari * migrate master key if found * pass key to encrypt service * rename pinLock to pinEnabled * use org key or user key for encrypting attachments * refactor makeShareKey to be more clear its for orgs * rename retrieveUserKeyFromStorage * clear deprecated keys when setting new user key * fix cipher service test * options is nullable while setting user key * more crypto service refactors - check for auto key when getting user key - consolidate getUserKeyFromMemory and FromStorage methods - move bio key references out of base crypto service - update either pin key when setting user key instead of lock component - group deprecated methods - rename key legacy method * Feature/PM-1049 - TDEFflow 3 login decryption options - PR feedback changes (#5642) * PM-1049 - PR Feedback change - Browser - replace incorrect use of routerlink with manual attribute styling to keep anchor styling + tab focus while not having a router action race condition for the log out action to complete. * PM-1049 - PR Feedback - State Service changes - rename get/setAcctDecryptionOptions to get/setAccountDecryptionOptions * PM-1049 - PR Feedback changes - LoginDecryptionOptionsComp - Remove unncessary appA11yTitle directives as title / aria text would be identical to the displayed inner button text. * DeviceType - Create sets of device types which other components can reference to avoid having to manually define groups of device types. * PM-1049 - PR Feedback Changes - Update base-login-decryption-options component to leverage async piped observables per best practices. Updated all client templates to leverage new data streams. * PM-1049 - BaseLoginDecryptionOptionsComp - Add validation service for generic error handling * PM-1049 - DeviceResponse mistakenly had name as a number instead of a string * PM-1049 - First draft of creating observable based data store service for Devices so that the base login comp can leverage it instead of calling the devices API service directly (as it will be moved into the SDK in the future). * PM-1049 - Register new DevicesService on jslib-services module for use in components. * PM-1049 - Add new hasDevicesOfTypes call to devices data store svc + devices API service. * PM-1049 - BaseLoginDecryptionOptionsComp - wire up call to devicesService.hasDevicesOfTypes to replace getDevices() to avoid bringing down all trusted device information unnecessarily. * PM-1049 - LoginDecryptionOptionsComp - Web HTML - clean up loading state so it displays spinner centered properly. * PM-1049 - LoginDecryptionOptionsComp - Desktop HTML - Don't show login initiated title while page is loading to match other clients behavior. * PM-1049 - Devices Services - Update naming of hasDevicesOfTypes to match new name on back end + route change to getDevicesExistenseByTypes * PM-1049 - Device Response & View models - remove keys which are going to be deprecated on the base model * PM-1049 - DevicesService - devicesBSubject --> devicesSubject rename per PR feedback * PM-1049 - Devices Services - correct spelling of existence (*facepalm*) * PM-1049 - Update comment for clarity per PR feedback * PM-1049 - DevicesSvc - UserSymKey --> UserKey rename * PM-1049 - BaseLoginDecryptionOptions - replace user email source - get from stateService vs tokenService. * PM-1049 - BaseLoginDecryptionOptions - Remove uncessary check for userEmail as we will always have it here otherwise everything in the app is broken. * PM-1049 - BaseLoginDecryptionOptions - Finish cleaning up removal of user email from showReqAdminApprovalBtn$ stream * PM-1049 - LoginDecryptionOptionsComp - HTML revisions in web & browser to better space out buttons using tailwind or top margin to avoid need for multiple async pipes and shareReplay. * PM-1049 - DevicesService - of course all observables should have $ suffix. Facepalm. * PM-1049 - BaseLoginDecryptionOptionsComp - Update verbiage and style of destroy observable used for hooking into ngOnDestroy lifecycle to clean up all observables * PM-1049 - BaseLoginDecryptionOptions - PR feedback changes - refactor user email to have an underlying bSubject stream to ensure subscription/promise execution separately from the template async pipe subscribing to the stream. * PM-1049 - DevicesApiService - getDevicesExistenceByTypes - PR feedback - explicitly convert result to boolean instead of casting. * PM-1049 - BaseLoginDecryptionOptionsComp - Add ShareReplay for getAccountDecryptionOptions + context per PR feedback * PM-1049 - LoginDecryptionOptionsComp - Completely back away from template async pipe reactive approach as it caused massively increased complexity for little gain. Instead, just focus on reactively pulling asynchronously retrieved data and setting page loading state simply. This just works and is so much less overhead. + Add comments re flows of the component to be done later * PM-1049- Revert DevicesService implementation from smart data store cache service giant mess into simple, clean data passthrough service to avoid complexity and keep moving forward. YAGNI Co-authored-by: Andreas Coroiu * PM-1049 - DeviceCryptoService - Add decryptUserKey method (WIP) * PM-1049 - AccountDecryptionOptions - add get helpers for checking for trusted device / key connector decryption option existence. * PM-1049 - SSO Login Strategy - added comments in setUserKey method for where we will probably be consuming device keys and determining if the device is trusted or not (i.e., if we can get a decrypted user sym key in memory) * PM-1049 - DeviceCryptoSvc.decryptUserKey - Update method to properly use state service device key retrieval + add TODO to figure out what to do if user has previously had a device key and has cleared their local cache (which will result in the device being untrusted now) * PM-1049 - SSO Login Strategy - add comment re future passkey login strategy support * PM-2759 - SSO & 2FA components updated with v0 of navigation logic to send users to LoginDecryptionOptions * PM-1049 - Account > AccountDecryptionOptions - can't create getter helper methods for determining if user has decryption options b/c of issues w/ account deserialization. Moving past b/c I can just easily check if the given options are not undefined. * PM-2759 - Add TODOs for deprecation of id token response resetMasterPassword logic and replacement with use of accountDecryptionOptions --------- Co-authored-by: Andreas Coroiu * revert sharing disk cache between contexts * fix tests * add better tests to crypto service * add hack to get around duplicate instances of disk cache on browser * prevent duplicate cache deletes in browser * fix browser state service tests * Feature/PM-1212 - TDE - Approve with master password flow (#5706) * PM-1212 - StateSvc - Add getUserDeviceTrustChoice && setUserDeviceTrustChoice to persist user's choice in local storage in case of refresh on login approval screens (ex: lock) * PM-1212 - DeviceCryptoSvc - Add getUserDeviceTrustChoice && setUserDeviceTrustChoice as state service is lower level service for caching * PM-1212 - LoginDecryptionOptionsComp - Save result of rememberEmail checkbox into local storage via deviceCryptoService.setUserDeviceTrustChoice * PM-1212 - Lock component - after user key is set, check if user chose to establish trust, and if they did, then establish trust and reset choice. * PM-1212 - Update naming of methods per discussion with Jake + add comment explaining intended single use retrieval and need for resetting the value. * DeviceCryptoService - Refactor - decryptUserKey --> decryptUserKeyWithDeviceKey to match crypto service refactor naming convention * PM-1212 - Refactor State Service per PR feedback to store trustDeviceChoiceForDecryption on Account.settings b/c the temp setting is scoped to a user. * PM-2759 - SSO & 2FA Navigation to TDE Comp - Needs more work - Found scenarios on web with 2FA in which the expected navigation doesn't work. Adding TODO to assist in fixing * (1) Add Trust to DeviceCryptoService name (2) Move DeviceTrustCryptoService under auth folder * PM-1212 - Add tests for new getUserTrustDeviceChoiceForDecryption and setUserTrustDeviceChoiceForDecryption methods + TODOs for future tests. * PM-1212- Renaming / moving DeviceTrustCryptoService broke all the things - fixed all the client builds. * PM-1212- Copy doc comment to abstraction per PR feedback * PM-1212 - BaseLoginDecryptionOptions comp - remove unncessary cast to form control as apparently reactive forms now properly derives types. * [PM-1203] Replace MP confirmation with verification code (#5656) * [PM-1203] feat: ask for OTP if user does not have MP * [PM-1203] feat: add backwards compatibility for accounts/servers without decryption options * [PM-1203] feat: move hasMasterPassword to user-verification.service * [PM-1203] fix: remove duplicate implementation from crypto service * [PM-1203] fix: cli build * Tweak device trust crypto service implementation to match mobile late… (#5744) * Tweak device trust crypto service implementation to match mobile latest which results in more single responsibility methods * Update tests to match device trust crypto service implementation changes * update comment about state service * update pinLockType states and add jsdocs * add missed pinLockType changes * [PM-1033] Org invite user creation flow 1 (#5611) * [PM-1033] feat: basic redirection to login initiated * [PM-1033] feat: add ui for TDE enrollment * [PM-1033] feat: implement auto-enroll * [PM-1033] chore: add todo * [PM-1033] feat: add support in browser * [PM-1033] feat: add support for desktop * [PM-1033] feat: improve key check hack to allow regular accounts * [PM-1033] feat: init asymmetric account keys * [PM-1033] chore: temporary fix bug from merge * [PM-1033] feat: properly check if user can go ahead an auto-enroll * [PM-1033] feat: simplify approval required * [PM-1033] feat: rewrite using discrete states * [PM-1033] fix: clean-up and fix merge artifacts * [PM-1033] chore: clean up empty ng-container * [PM-1033] fix: new user identification logic * [PM-1033] feat: optimize data fetching * [PM-1033] feat: split user creating and reset enrollment * [PM-1033] fix: add missing loading false statement * [PM-1033] fix: navigation logic in sso component * [PM-1033] fix: add missing query param * [PM-1033] chore: rename to `ExistingUserUntrustedDevice` * PM-1033 - fix component templates to reference `ExistingUserUntrustedDevice` so clients can build --------- Co-authored-by: Jared Snider * remove extra partial key * set master key on lock component * rename key hash to password hash on crypto service * fix cli * rename enc user key setter in crypto service * Adds Events & Human Readable Messages (#5746) * [PM-1202] Hide the Master Password tab on Settings / Security (#5649) * [PM-1203] feat: ask for OTP if user does not have MP * [PM-1203] feat: get master password status from decryption options * [PM-1203] feat: add backwards compatibility for accounts/servers without decryption options * [PM-1203] feat: move hasMasterPassword to user-verification.service * fix merge issues * Change getUserTrustDeviceChoiceForDecryption / setUserTrustDeviceChoiceForDecryption to getShouldTrustDevice / setShouldTrustDevice (#5795) * Auth/[PM-1260] - Existing User - Login with Trusted Device (Flow 2) (#5775) * PM-1378 - Refactor - StateSvc.getDeviceKey() must actually convert JSON obj into instance of SymmetricCryptoKey * TODO: BaseLoginDecryptionOptionsComponent - verify new user check doesn't improperly pick up key connector users * PM-1260 - Add new encrypted keys to TrustedDeviceUserDecryptionOptionResponse * PM-1260 - DeviceTrustCryptoSvc - decryptUserKeyWithDeviceKey: (1) update method to optionally accept deviceKey (2) Return null user key when no device key exists (3) decryption of user key now works in the happy path * PM-1260 - LoginStrategy - SaveAcctInfo - Must persist device key on new account entity created from IdTokenResponse for TDE to work * PM-1260 - SSO Login Strategy - setUserKey refactor - (1) Refactor existing logic into trySetUserKeyForKeyConnector + setUserKeyMasterKey call and (2) new trySetUserKeyWithDeviceKey method for TDE * PM-1260 - Refactor DeviceTrustCryptoService.decryptUserKeyWithDeviceKey(...) - Add try catch around decryption attempts which removes device key (and trust) on decryption failure + warn. * PM-1260 - Account - Add deviceKey to fromJSON * TODO: add device key tests to account keys * TODO: figure out state service issues with getDeviceKey or if they are an issue w/ the account deserialization as a whole * PM-1260 - Add test suite for decryptUserKeyWithDeviceKey * PM-1260 - Add interfaces for server responses for UserDecryptionOptions to make testing easier without having to use the dreaded any type. * PM-1260 - SSOLoginStrategy - SetUserKey - Add check looking for key connector url on user decryption options + comment about future deprecation of tokenResponse.keyConnectorUrl * PM-1260 - SSO Login Strategy Spec file - Add test suite for TDE set user key logic * PM-1260 - BaseLoginStrategy - add test to verify device key persists on login * PM-1260 - StateService - verified that settings persist properly post SSO and it's just device keys we must manually instantiate into SymmetricCryptoKeys * PM-1260 - Remove comment about being unable to feature flag auth service / login strategy code due to circ deps as we don't need to worry about it b/c of the way we've written the new logic to be additive. * PM-1260 - DevicesApiServiceImplementation - Update constructor to properly use abstraction for API service * PM-1260 - Browser - AuthService - (1) Add new, required service factories for auth svc and (2) Update auth svc creation in main.background with new deps * PM-1260 - CLI - Update AuthSvc deps * PM-1260 - Address PR feedback to add clarity / match conventions * PM-1260 - Resolving more minor PR feedback * PM-1260 - DeviceTrustCryptoService - remove debug warn * PM-1378 - DeviceTrustCryptoSvc - TrustDevice - Fix bug where we only partially encrypted the user key with the device public key b/c I incorrectly passed userKey.encKey (32 bytes) instead of userKey.key (64 bytes) to the rsaEncrypt function which lead to an encryption type mismatch when decrypting the user's private key with the 32 byte decrypted user key obtained after TDE login. (Updated happy path test to prevent this from happening again) * PM-1260 - AccountKeys tests - add tests for deviceKey persistence and deserialization * PM-1260 - DeviceTrustCryptoSvc Test - tweak verbiage per feedback * PM-1260 - DeviceTrustCryptoSvc - Test verbiage tweak part 2 * Update apps/browser/src/background/service-factories/devices-api-service.factory.ts per PR feedback Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> --------- Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> * Defect - LockComp - After setting user key, must AWAIT retrieval of user's previous choice to have trusted the device or not. (#5804) * [PM-2928] [PM-2929] [PM-2930] Fixes for: [PM-1203] Replace MP confirmation with verification code (#5798) * [PM-2928] feat: hide change email if user doen't have MP * [PM-2929] feat: hide KDF settings if user doesn't have MP * [PM-2930] feat: remove MP copy * Removed self-hosted check from TDE SSO config. (#5837) * [PM-2998] Move Approving Device Check (#5822) * Switch to retrieving approving device from token response - Remove exist-by-types API call - Define `HasApprovingDevices` on TDE options * Update Naming * Update Test * Update Missing Names * [PM-2908] feat: show account created toast (#5810) * fix bug where we weren't passing MP on Restart to migrate method in lock * fix: buffer null error (#5856) * Auth/[pm-2759] - TDE - SSO and 2FA routing logic (#5829) * PM-2759 - SsoComp - (1) Temp remove all TDE routing logic (2) Refactor existing navigation logic via new component utility function navigateViaCallbackOrRoute * PM-2759 - SSO Component - Create test suite for logIn logic * PM-2759 - SsoComp Tests - add disclaimer regarding testing private methods and props * PM-1259 - SSO Comp - Refactor LogIn method to use functions for each navigation case for improved readability * PM-1259 - SSO Comp Tests - Add tests for error case during login + test for new handleLoginError logic * PM-2759 - SsoComp - Deprecate resetMasterPassword and replace with AccountDecryptionOptions logic + update tests * PM-2759 - SsoComp + tests - Add trusted device encryption first draft handling which has login success and force password reset handling * PM-2759 - Minor SsoComp comment and method name tweaks * PM-2759 - BaseTwoFactorComp - (1) Comment out TDE stuff for now (2) Add test suite (3) Replace global window in base comp constructor with angular injection token for window which follows best practices and allows for mocking so the comp can be unit tested * PM-2759 - Update child 2FA components to use angular injection token for window like base comp * PM-2759 - TwoFactorComp - Finish testing all logic in doSubmit * PM-2759 - TwoFactorComponent - Refactor DoSubmit method logic into multiple simple functions to make logic easier to follow * PM-2759 - Add newtrustedDeviceOption.hasManageResetPasswordPermission property to match server changes * PM-2759 - Flag AuthResult.resetMasterPassword property as deprecated * PM-2759 - SSO comp - TDE routing logic - User without MP and ResetPassword permission must set a MP * PM-2759 - Update Sso Comp tests to reflect additionally added TDE > MP set required logic (when user has no MP but they can reset other user passwords) * PM-2759 - SsoComp - Add comment explaining the happy paths better for TDE success navigation * PM-2759 - SsoComp - Refactor isTrustedDeviceEncEnabled logic into own method * PM-2759 - SsoComp - As the 2FA comp passes the org id through to each route, going to standardize on doing so across the board for now to avoid any tricky scenarios down the line where it is needed and it's not present * PM-2759 - SsoComp - Finish renaming orgIdFromState to orgIdentifier * PM-2759 - SsoComp - update tests for forcePasswordReset flows now passing orgIdentifier as query param * PM-2759 - SsoComp Tests - Export mockAcctDecryptionOpts permutations so we can share them across SsoComp and TwoFactorComp tests * PM-2759 - Refactor 2FA comp post login redirect logic to match SSO component + add TDE logic * PM-2759 - SsoComp - Refactor tests a bit for improved re-use * PM-2759 - Sso Comp tests - can't export consts from a spec file or the other spec files that import them will re-execute the whole test suite as a nested test suite. TIL. * PM-2759 - TwoFactorComp tests - All existing navigation scenarios + new TDE scenarios should now be tested. * PM-2759 - Web - 2FA comp - Fix build error b/c of renamed base comp prop (identifier --> orgIdentifier) * PM-2759 - Fix SsoLogin strategy tests b/c they were broken w/ the addition of the HasManageResetPasswordPermission prop to the TrustedDeviceOption interface * PM-2759 - Web TwoFactorComp - goAfterLogIn method must be an arrow function to inherit the parent base component scope so that important things like angular services can be defined. Web 2FA flow does not work without this being an arrow func. * PM-2759 - Fix typo * PM-2759 - SsoComp and TwoFactorComp tests - move service and other mocks into the top level before each to better ensure no crossover between test states per PR feedback * PM-2759 - SsoComp - add clarity by refactoring unclear comment * PM-2759 - SsoComp - Per excellent PR feedback, refactor if else statements to guard statements for better readability / design * PM-2759 - TwoFactorComp - Replace ifs with guard statements * PM-2759 - TwoFactorComp - add clarity to comment per PR feedback * PM-2759 - Replace use of jest.Mocked with MockProxy per PR feedback * PM-2759 - Use unknown over any per PR feedback * Bypass Master Password Reprompt if a user does not have a MP set (#5600) * Add a check for a master password in PasswordRepromptService.enabled() * Add tests for enabled() * Update state service method call * Use UserVerificationService to determine if a user has a master password * rename password hash to master key hash * fix cli build from key hash renaming * [PM-1339] Allow Rotating Device Keys (#5806) * Merge remote-tracking branch 'origin/feature/trusted-device-encryption' into Auth/pm-1339/rotate-device-keys * Implement Rotation of Current Device Keys - Detects if you are on a trusted device - Will rotate your keys of only this device - Allows you to still log in through SSO and decrypt your vault because the device is still trusted * Address PR Feedback * Move Files to Auth Ownership * fix: getOrgKeys returning null * [PM-3143] Trusted device encryption: Refactor reset enroll service (#5869) * create new reset enrollment service * refactor: login decryption options according to TODO * feat: add tests * PM-3143 - Add override to overriden methods --------- Co-authored-by: Jared Snider * generate a master key from master password if needed (#5870) * [PM-3120] fix: device key not being saved properly (#5882) * Auth/pm 1050/pm 1051/remaining tde approval flows (#5864) * fix: remove `Unauth guard` from `/login-with-device` * [PM-3101] Fix autofill items not working for users without a master password (#5885) * Add service factories for user verification services * Update autofill service to check for existence of master password for autofill * Update the context menu to check for existence of master password for autofill * context menu test fixes * [PM-3210] fix: use back navigation (#5907) * Removed buttons (#5935) * PM-2759 - Fix broken backwards compatibility for authResult.resetMast… (#5940) * PM-2759 - Fix broken backwards compatibility for authResult.resetMasterPassword * PM-2759 - Update TODO with specific tech debt task + target release date * TDE - State Svc - setDeviceKey should support setting null for future support of clearing device key. (#5942) * Check if a user has a mp before showing kdf warning (#5929) * [PM-1200] Unlock settings changes for accounts without master password - clients (#5894) * [PM-1200] chore: add comment for jake * [PM-1200] chore: rename to `vault-timeout` * [PM-1200] feat: initial version of `getAvailableVaultTimeoutActions` * [PM-1200] feat: implement `getAvailableVaultTimeoutActions` * [PM-1200] feat: change helper text if only logout is available * [PM-1200] feat: only show available timeout actions * [PM-1200] fix: add new service factories and dependencies * [PM-1200] fix: order of dependencies `UserVerificationService` is needed by `VaultTimeoutSettingsService` * [PM-1200] feat: add helper text if no lock method added * [PM-1200] refactor: simplify prev/new values when changing timeout and action * [PM-1200] feat: fetch timeout action from new observable * [PM-1200] refactor: make `getAvailableVaultTimeoutActions` private * [PM-1200] feat: add test cases for `vaultTimeoutAction$` * [PM-1200] feat: implement new timeout action logic * [PM-1200] feat: add dynamic lock options to browser * [PM-1200] feat: enable/disable action select * [PM-1200] feat: add support for biometrics * [PM-1200] feat: add helper text and disable unavailable options * [PM-1200] feat: update action on unlock method changes * [PM-1200] feat: update browser to use async pipe * [PM-1200] fix: element not updating * [PM-1200] feat: hide masterPassOnRestart pin option * [PM-1200] feat: hide change master password from browser settins * [PM-1200] feat: hide change master password from app menu * [PM-1200] feat: logout if lock is not supported * [PM-1200] feat: auto logout from lock screen if unlocking is not supported * [PM-1200] feat: remove lock button from web menus * Revert "[PM-1200] fix: element not updating" This reverts commit b27f425f48570d0d5dbc9dedb9797023fef64d8b. * Revert "[PM-1200] feat: update browser to use async pipe" This reverts commit 766c15bc3dbadcf7dcef3053b148e7874f8939ce. * [PM-1200] chore: add comment regarding detectorRef * [PM-1200] feat: remove lock now button from browser settings * [PM-1200] feat: add `userId` to unlock settings related methods * [PM-1200] feat: remove non-lockable accounts from menu * [PM-1200] fix: cli not building --------- Co-authored-by: Todd Martin Co-authored-by: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> * [PM-3215][PM-3289] Create MasterKey from Password If Needed (#5931) * Create MasterKey from Password - Check if the MasterKey is stored or not - Create it if it's not * Add getOrDeriveKey Helper * Use Helper In More Places * Changed settings menu to be enabled whenever the account is not locked. (#5965) * [PM-3169] Login decryption options in extension popup (#5909) * [PM-3169] refactor: lock guard and add new redirect guard * [PM-3169] feat: implement fully rewritten routing * [PM-3169] feat: close SSO window * [PM-3169] feat: store sso org identifier in state * [PM-3169] fix: tests * [PM-3169] feat: get rid of unconventional patch method * PM-3169 - SSO & 2FA Comps - Update naming of new callback to match existing pattern + add tests for callback logic execution. * PM-3169 - Update LockGuard to have a special exception for allowing the TDE Login with MP flow * PM-3169 - Per discussion w/ Jake and Justin, rename login-initiated guard to be tde decryption required guard (more named for functionality vs specific route) * PM-3169 - Add some additional context to new redirect guard scenario * PM-3169 - Per PR feedback, replace all callback types with Promise as the return values are not being used. * PM-3169 - StateSvc - Per PR feedback, update setUserSsoOrganizationIdentifier signature to explicitly use null instead of partial which doesn't do anything * PM-3169 - Replace onSuccessfulLogin type to compile * PM-3169 - Add clarification comment for why we are not using a query param for persisting the org identifier * PM-3169 - Per discussion with Justin, only use memory for SsoOrgId as we don't need to persist it beyond that; tested and it worked on all 3 clients for new user TDE creation * PM-3169 - Add missing ssoIdentifierRequired translation to desktop and browser * PM-3169 - After discussing with Justin again, we realized that memory doesn't work on desktop if user refreshes app or closes and re-opens it so must use disk. * PM-3169 - Per PR feedback, remove hasEverHadUserKey logic as we can just leverage existing getUserKey method to check if we have a user key or not; tested all guards in browser and web with no issues * PM-3169 - Per design discussion with Danielle, move account created toast after successful account creation vs on load of page. --------- Co-authored-by: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Co-authored-by: Jared Snider * [PM-3314] Fixed missing MP prompt on lock component (#5966) * Updated lock component to handle no master password. * Added a comment. * Add Missing Slash (#5967) * Fix AdminAuthRequest Serialization on Desktop (#5970) - toJSON isn't being called by ElectronStorageService - Force it's conversion to JSON earlier so it happens for all storage methods * Fix issue where we were incorrectly calling setRememberEmailValues in the AdminAuthRequest state - no need to do this as the email is already saved to state. By calling this method, we would actually overwrite the already saved email with null as the user's choice to remember email wasn't persisted through SSO on the login service. (#5972) * PM-3329 - Restore everHadUserKey logic from PM-3169 which I incorrectly removed in order to fix routing logic so that user can lock and land on the lock screen properly (#5979) * PM-3210 - TDE - LoginWithDevice routing fix - Mirror PR #5950 in just simply providing a back action on click which works for all app generated scenarios (#5982) * PM-3332 - TDE - SsoLoginStrategy - For existing admin auth reqs, must… (#5980) * PM-3332 - TDE - SsoLoginStrategy - For existing admin auth reqs, must manually handle 404 error case to prevent app from hanging and clear the local state if the admin auth req in the DB has been purged; i.e., it should fail silently. * Add TODO for SSO Login Strategy tests * PM-3331 - TDE - Firefox - Browser extension - fix access denied error… (#5984) * PM-3331 - TDE - Firefox - Browser extension - fix access denied error on popup load which was caused by the canAccessFeature guard failing to lookup the TDE feature flag as the server config was returning null even after a successful server call as only returned the value if the user was unauthenticated for some reason * PM-3331 - After discussion with Andre, further refactor ConfigService logic to always return the latest information from the server so that requests for feature flag data will always get the most up to date information. * PM-3345 - TDE - Desktop - Biometrics setting submenu tweak - do not s… (#5988) * PM-3345 - TDE - Desktop - Biometrics setting submenu tweak - do not show require MP or PIN entry on restart if user doesn't have at least one of those options b/c otherwise user can get into a bad state where they cannot unlock * PM-3345 - TDE - Desktop - Settings comp - if user turns off PIN and Biometric is on + require PIN on restart is enabled then must turn that setting off to prevent bad user state * PM-3345 - Final tweak to logic * [PM-2852] Final merge from Key Migration branch to TDE Feature Branch (#5977) * [PM-3121] Added new copy with exclamation mark * [PM 3219] Fix key migration locking up the Desktop app (#5990) * Only check to migrate key on VaultTimeout startup * Remove desktop specific check * PM-3332 - LoginWithDevice - Add error handling logic around admin auth request retrieval similar to sso login strategy to prevent error state and allow re-creation of an admin auth request if it has been purged from the server for whatever reason. (#5991) * PM-3355 - TDE - Browser JIT Account Creation - Browser create user logic still had logic for simply closing the extension tab but as we no longer open the login decryption options in a tab we needed to update the logic here to navigate the user directly onto the vault. (#5993) * Add distinctUntilChanged to fix multiple value changes for biometrics firing (#5999) * Add optional chaining to master key (#6007) * PM-3369 - TDE - Persist user's choice to trust device to state when user ma… (#6000) * PM-3369 - Persist user's choice to trust device to state when user makes choice + persist previous choices out of state * PM-3369 - Must set trust device in state on load if it's never been set before * PM-3369 - Refactor BaseLoginDecOptions to properly set trust device choice in state on load * Update libs/angular/src/auth/components/base-login-decryption-options.component.ts Co-authored-by: Jake Fink --------- Co-authored-by: Jake Fink * Updated email change component to getOrDeriveMasterKey (#6009) * [PM-3330] Force Update to Lockable Accounts on PIN/Biometric Update (#6006) * Add Listener For Events that Need To Redraw the Menu * Send redrawMenu Message When Pin/Biometrics Updated * DeviceTrustCryptoService - don't worry about checking if a device should establish trust or not if the user doesn't have trusted device encryption on (#6010) * Auth / pm 3351 / TDE Login - Browser & Desktop vault sync issue fix (#6002) * PM-3351 - TDE Login on desktop and browser via SSO comp with no 2FA should trigger sync like standard onSuccessfulLogin process used to so user lands on vault with data. * PM-3351 - 2FA Comp - Refactor onSuccessfulLogin logic to only execute in the success path just like the SSO component + adding specific onSuccessfulLoginTde flow just like SSO comp. + removed unnecessary calls to loginService.clearValues(). Added browser & desktop definitions for onSuccessfulLoginTde which is just a fullSync kick off. * TODO * PM-3351 - remove await to restore code back to previous state without hang. * PM-3351 - 2FA Comp - Don't await onSuccessfulLoginTde b/c it causes a hang * PM-3351 - remove sso comp incorrect todo * PM-3351 - SsoComp - don't await onSuccessfulLoginTde for browsers sake * PM-3351 - SsoComp - remove awaits from onSuccessfulLoginTde and onSuccessfulLogin to avoid any hangs on desktop and browser * PM-3351 - Convert onSuccessfulLoginTde to promise as its return is not used + refactor all to be consistent and clearly communciate that the sync won't be awaited. * PM-3351 - Convert onSuccessfulLogin to promise and update all methods accordingly to more clearly indicate that the syncs and any other logic won't be awaited. * [PM-3356] Fallback to OTP When MasterPassword Hasn't Been Used (#6017) * Fallback to OTP When MasterPassword Hasn't Been Used * Update Test and Rename Method * Revert "DeviceTrustCryptoService - don't worry about checking if a device should establish trust or not if the user doesn't have trusted device encryption on (#6010)" (#6020) This reverts commit 6ec22f95702050c12716f79c7d7454835f9b2807. * PM-3390 - TDE - Redraw desktop after user creation to update isLocked checks and get menu to be enabled properly (#6018) * [PM-3383] Hide Change Password menu option for user with no MP (#6022) * Hide Change Master Password menu item on desktop when a user doesn't have a master password. * Renamed variable for consistency. * Updated to base logic on account. * Fixed menubar * Resolve merge errors in crypto service spec * Fixed autofill to use new method on userVerificationService (#6029) * PM-3456 - TDE Admin Auth Req Flow - FF dead object issue - The foreground popup must retrieve the long lived background services for the new TDE services (the AuthRequestCryptoService service fixes this issue, but the DeviceTrustCryptoService should have been added to services.module as well) (#6037) * skip auto key check when using biometrics on browser (#6041) * Added comments for backward compatibility removal. (#6039) * Updated warning message. (#6059) * Tde pr feedback (#6051) * move pin migration to the crypto service * refactor config service logic * refactor lock component load logic * rename key connector methods * add date to backwards compat todo * update backwards compat todo * don't specify defaults in redirectGuard * nit * add null & undefined check for userid before using the account * fix ui tests * add todo for tech debt * add todo comment * Fix storybook per PR feedback * Desktop & Browser - lock comp - add optional chaining check for focusable input - user can just have biometric and not have a MP or a PIN so must support that. * Main.background.ts - remove duplicate instantiations of the userVerificationApiService and userVerificationService which were added in two separate PRs * Per PR feedback - (1) Browser app routing module - fix incorrect import for redirect guard (2) Created index.ts file for auth guards to simplify imports and updated imports * Per PR feedback, (1) Update jslib-services.module to provide actual instance of VaultTimeoutService (2) Update init service to use concrete VaultTimeoutService vs abstraction. Co-authored-by: Matt Gibson * Per PR feedback - update services module AuthRequestCryptoService and DeviceTrustCryptoService to use shorthand format. * Per PR feedback, add devicesService to main background and update services module to ensure the popup leverages the background devicesService --------- Co-authored-by: Jared Snider Co-authored-by: Matt Gibson * Updated message keys for CrowdIn to pick them up. (#6066) * TDE PR Feedback resolutions round 2 (#6068) * Per PR feedback - main.background.ts - move userVerificationService and userVerificationApiService to correct location * Per PR feedback - JS lib services + vault timeout service updates - (1) Correctly type callbacks based on injection tokens (2) Update vault timeout service to have proper types based on injection tokens * Per PR Feedback - update web init service to inject actual VaultTimeoutService vs abstraction similar to what we did for desktop here: https://github.com/bitwarden/clients/commit/55a797d4ff571a1942686a32fdcbb5ad0311b5ae * Per more feedback - revert incorrect changes to VaultTimeoutService based on existing injection token types for LOGOUT_CALLBACK and LOCKED_CALLBACK.. and instead update the injection token types themselves to match how they are being used. * Per PR feedback - in browser main.background.ts, inject concrete VaultTimeoutService instead of abstraction so we don't have to cast it anymore (matching web & desktop) --------- Co-authored-by: Jared Snider Co-authored-by: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Co-authored-by: Jacob Fink Co-authored-by: Matt Gibson Co-authored-by: Andreas Coroiu Co-authored-by: Andreas Coroiu Co-authored-by: Andreas Coroiu Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> Co-authored-by: André Bispo Co-authored-by: Thomas Rittson Co-authored-by: Vincent Salucci Co-authored-by: Robyn MacCallum Co-authored-by: Jonathan Prusik Co-authored-by: Matt Gibson --- .github/whitelist-capital-letters.txt | 8 - apps/browser/src/_locales/en/messages.json | 62 +- .../auth-request-crypto-service.factory.ts | 29 + .../service-factories/auth-service.factory.ts | 16 +- .../device-trust-crypto-service.factory.ts | 74 ++ .../user-verification-api-service.factory.ts | 29 + .../user-verification-service.factory.ts | 51 + .../src/auth/popup/lock.component.html | 14 +- apps/browser/src/auth/popup/lock.component.ts | 21 +- .../login-decryption-options.component.html | 108 ++ .../login-decryption-options.component.ts | 18 + .../popup/login-with-device.component.html | 63 +- .../auth/popup/login-with-device.component.ts | 16 +- .../browser/src/auth/popup/login.component.ts | 2 +- apps/browser/src/auth/popup/services/index.ts | 1 - .../auth/popup/services/lock-guard.service.ts | 8 - .../popup/services/unauth-guard.service.ts | 2 +- apps/browser/src/auth/popup/sso.component.ts | 24 +- .../src/auth/popup/two-factor.component.ts | 33 +- .../autofill-service.factory.ts | 10 +- .../cipher-context-menu-handler.spec.ts | 77 +- .../browser/cipher-context-menu-handler.ts | 14 +- .../src/autofill/services/autofill.service.ts | 9 +- .../src/background/commands.background.ts | 2 +- .../browser/src/background/idle.background.ts | 2 +- .../browser/src/background/main.background.ts | 73 +- .../background/nativeMessaging.background.ts | 54 +- .../devices-api-service.factory.ts | 28 + .../vault-timeout-service.factory.ts | 10 +- .../vault-timeout-settings-service.factory.ts | 14 +- .../services/browser-crypto.service.ts | 27 +- .../services/browser-state.service.spec.ts | 3 +- .../services/browser-state.service.ts | 60 +- apps/browser/src/popup/app-routing.module.ts | 34 +- apps/browser/src/popup/app.module.ts | 2 + .../user-verification.component.html | 4 +- apps/browser/src/popup/scss/base.scss | 34 + .../src/popup/services/services.module.ts | 28 +- .../popup/settings/settings.component.html | 22 +- .../src/popup/settings/settings.component.ts | 191 ++- .../safari/SafariWebExtensionHandler.swift | 34 +- .../vault-timeout.service.ts} | 2 +- apps/cli/src/auth/commands/lock.command.ts | 2 +- apps/cli/src/auth/commands/login.command.ts | 33 +- apps/cli/src/auth/commands/unlock.command.ts | 22 +- apps/cli/src/bw.ts | 52 +- apps/cli/src/commands/serve.command.ts | 7 +- apps/cli/src/program.ts | 6 +- apps/cli/src/vault/create.command.ts | 4 +- .../src/app/accounts/settings.component.html | 106 +- .../src/app/accounts/settings.component.ts | 131 +- apps/desktop/src/app/app-routing.module.ts | 32 +- apps/desktop/src/app/app.component.ts | 23 +- .../user-verification.component.html | 4 +- apps/desktop/src/app/services/init.service.ts | 7 +- apps/desktop/src/auth/lock.component.html | 14 +- apps/desktop/src/auth/lock.component.ts | 21 +- .../login-decryption-options.component.html | 66 + .../login-decryption-options.component.ts | 19 + .../login/login-with-device.component.html | 86 +- .../auth/login/login-with-device.component.ts | 16 +- .../desktop/src/auth/login/login.component.ts | 2 +- apps/desktop/src/auth/login/login.module.ts | 8 +- apps/desktop/src/auth/sso.component.ts | 16 +- apps/desktop/src/auth/two-factor.component.ts | 22 +- apps/desktop/src/locales/en/messages.json | 59 +- apps/desktop/src/main/menu/menu.account.ts | 22 +- apps/desktop/src/main/menu/menu.bitwarden.ts | 5 +- apps/desktop/src/main/menu/menu.file.ts | 5 +- apps/desktop/src/main/menu/menu.first.ts | 53 +- apps/desktop/src/main/menu/menu.updater.ts | 3 +- apps/desktop/src/main/menu/menubar.ts | 19 +- .../services/electron-crypto.service.spec.ts | 91 ++ .../services/electron-crypto.service.ts | 93 +- .../services/electron-state.service.ts | 4 + apps/desktop/src/scss/pages.scss | 20 +- .../native-message-handler.service.ts | 6 +- .../src/services/native-messaging.service.ts | 15 +- .../components/bulk/bulk-confirm.component.ts | 3 +- .../components/reset-password.component.ts | 29 +- .../organization-routing.module.ts | 2 +- .../enroll-master-password-reset.component.ts | 4 +- apps/web/src/app/app.component.ts | 2 +- .../app/auth/accept-organization.component.ts | 15 +- apps/web/src/app/auth/lock.component.ts | 17 +- .../login-decryption-options.component.html | 105 ++ .../login-decryption-options.component.ts | 21 + .../login/login-with-device.component.html | 91 +- .../auth/login/login-with-device.component.ts | 10 +- .../web/src/app/auth/login/login.component.ts | 2 +- apps/web/src/app/auth/login/login.module.ts | 5 +- .../app/auth/recover-two-factor.component.ts | 2 +- .../settings/change-password.component.html | 10 +- .../settings/change-password.component.ts | 75 +- .../emergency-access-takeover.component.ts | 17 +- .../emergency-access-view.component.ts | 9 +- .../emergency-access.component.ts | 9 +- .../settings/two-factor-verify.component.html | 1 - .../user-verification.component.html | 4 +- apps/web/src/app/auth/sso.component.ts | 7 +- apps/web/src/app/auth/two-factor.component.ts | 19 +- .../settings/organization-plans.component.ts | 15 +- apps/web/src/app/core/event.service.ts | 17 + apps/web/src/app/core/init.service.ts | 7 +- apps/web/src/app/guards/home.guard.ts | 24 - .../web/src/app/layouts/navbar.component.html | 2 +- apps/web/src/app/layouts/navbar.component.ts | 9 +- apps/web/src/app/oss-routing.module.ts | 31 +- .../src/app/reports/reports-routing.module.ts | 2 +- .../web/src/app/settings/account.component.ts | 10 +- .../app/settings/change-email.component.ts | 24 +- .../change-kdf-confirmation.component.ts | 18 +- .../app/settings/preferences.component.html | 68 +- .../src/app/settings/preferences.component.ts | 13 +- .../app/settings/security-keys.component.ts | 6 +- .../app/settings/security-routing.module.ts | 2 +- .../src/app/settings/security.component.ts | 6 +- .../app/settings/update-key.component.html | 4 +- .../src/app/settings/update-key.component.ts | 21 +- .../vault-timeout-input.component.html | 4 +- .../src/app/shared/loose-components.module.ts | 2 +- .../components/link-sso.component.ts | 7 +- .../vault/individual-vault/vault.component.ts | 10 +- apps/web/src/locales/en/messages.json | 105 +- .../admin-auth-request-update.request.ts | 2 +- .../device-approvals.component.ts | 18 +- .../organizations-routing.module.ts | 2 +- .../manage/bulk/bulk-confirm.component.ts | 9 +- .../providers/providers-routing.module.ts | 2 +- .../providers/setup/setup.component.ts | 5 +- .../src/app/auth/sso/sso.component.html | 14 +- .../bit-web/src/app/auth/sso/sso.component.ts | 2 +- .../shared/header.component.html | 2 +- .../shared/header.component.ts | 7 + .../secrets-manager/shared/header.stories.ts | 9 + .../app/secrets-manager/sm-routing.module.ts | 2 +- .../src/app/secrets-manager/sm.guard.ts | 2 +- ...base-login-decryption-options.component.ts | 291 ++++ .../components/change-password.component.ts | 29 +- .../src/auth/components/lock.component.ts | 189 ++- .../components/login-with-device.component.ts | 433 ++++-- .../src/auth/components/login.component.ts | 2 +- .../src/auth/components/sso.component.spec.ts | 567 ++++++++ .../src/auth/components/sso.component.ts | 237 +++- .../components/two-factor.component.spec.ts | 451 +++++++ .../auth/components/two-factor.component.ts | 170 ++- .../components/update-password.component.ts | 16 +- .../update-temp-password.component.ts | 44 +- .../components/user-verification.component.ts | 16 +- libs/angular/src/auth/guards/index.ts | 5 + libs/angular/src/auth/guards/lock.guard.ts | 62 +- .../angular/src/auth/guards/redirect.guard.ts | 58 + .../guards/tde-decryption-required.guard.ts | 34 + .../src/components/register.component.ts | 12 +- .../src/components/set-password.component.ts | 42 +- .../src/components/set-pin.component.ts | 30 +- .../settings/vault-timeout-input.component.ts | 11 +- libs/angular/src/services/injection-tokens.ts | 8 +- .../src/services/jslib-services.module.ts | 92 +- .../vault/components/attachments.component.ts | 2 +- .../password-reprompt.service.spec.ts | 34 + .../services/password-reprompt.service.ts | 6 +- libs/common/src/abstractions/api.service.ts | 3 +- .../device-crypto.service.abstraction.ts | 8 - .../devices-api.service.abstraction.ts | 14 - .../devices/devices.service.abstraction.ts | 15 + .../devices/responses/device.response.ts | 13 +- .../abstractions/devices/views/device.view.ts | 17 + .../vault-timeout-settings.service.ts | 56 + .../vault-timeout.service.ts} | 0 .../vaultTimeoutSettings.service.ts | 13 - ...auth-request-crypto.service.abstraction.ts | 24 + .../src/auth/abstractions/auth.service.ts | 4 +- ...device-trust-crypto.service.abstraction.ts | 25 + .../devices-api.service.abstraction.ts | 27 + .../abstractions/key-connector.service.ts | 2 +- ...rd-reset-enrollment.service.abstraction.ts | 26 + .../user-verification.service.abstraction.ts | 12 + .../src/auth/enums/auth-request-type.ts | 1 + .../login-strategies/login.strategy.spec.ts | 91 +- .../auth/login-strategies/login.strategy.ts | 73 +- .../password-login.strategy.spec.ts | 40 +- .../password-login.strategy.ts | 47 +- .../passwordless-login.strategy.spec.ts | 138 ++ .../passwordless-login.strategy.ts | 68 +- .../sso-login.strategy.spec.ts | 219 ++- .../login-strategies/sso-login.strategy.ts | 174 ++- .../user-api-login.strategy.spec.ts | 39 +- .../user-api-login.strategy.ts | 34 +- .../models/domain/admin-auth-req-storable.ts | 41 + .../src/auth/models/domain/auth-result.ts | 7 + .../auth/models/domain/log-in-credentials.ts | 7 +- .../key-connector-user-decryption-option.ts | 3 + .../trusted-device-user-decryption-option.ts | 7 + .../request/update-devices-trust.request.ts | 15 + .../response/identity-token.response.ts | 9 + .../response/protected-device.response.ts | 39 + ...nnector-user-decryption-option.response.ts | 14 + ...-device-user-decryption-option.response.ts | 35 + .../user-decryption-options.response.ts | 39 + ...h-request-crypto.service.implementation.ts | 81 ++ .../auth-request-crypto.service.spec.ts | 165 +++ libs/common/src/auth/services/auth.service.ts | 85 +- ...ice-trust-crypto.service.implementation.ts | 215 +++ .../device-trust-crypto.service.spec.ts | 598 +++++++++ .../devices-api.service.implementation.ts | 96 ++ .../auth/services/key-connector.service.ts | 30 +- ...-enrollment.service.implementation.spec.ts | 123 ++ ...reset-enrollment.service.implementation.ts | 56 + .../user-verification.service.ts | 49 +- libs/common/src/enums/device-type.enum.ts | 13 + libs/common/src/enums/event-type.enum.ts | 3 + .../src/enums/key-suffix-options.enum.ts | 1 + .../platform/abstractions/crypto.service.ts | 454 ++++++- .../platform/abstractions/state.service.ts | 155 ++- .../models/domain/account-keys.spec.ts | 39 +- .../src/platform/models/domain/account.ts | 150 ++- .../platform/models/domain/enc-string.spec.ts | 16 +- .../src/platform/models/domain/enc-string.ts | 16 +- .../models/domain/symmetric-crypto-key.ts | 5 + .../services/config/config.service.ts | 23 +- .../platform/services/crypto.service.spec.ts | 178 +++ .../src/platform/services/crypto.service.ts | 1170 ++++++++++------- .../src/platform/services/state.service.ts | 398 +++++- .../src/platform/services/system.service.ts | 4 +- libs/common/src/services/api.service.ts | 9 +- .../device-crypto.service.implementation.ts | 85 -- .../services/device-crypto.service.spec.ts | 317 ----- .../devices-api.service.implementation.ts | 64 - .../devices/devices.service.implementation.ts | 68 + .../vault-timeout-settings.service.spec.ts | 146 ++ .../vault-timeout-settings.service.ts} | 101 +- .../vault-timeout.service.ts} | 42 +- .../password/password-generation.service.ts | 4 +- .../src/tools/send/services/send.service.ts | 6 +- .../vault/models/domain/attachment.spec.ts | 22 +- .../src/vault/models/domain/attachment.ts | 2 +- .../src/vault/models/domain/card.spec.ts | 14 +- .../src/vault/models/domain/field.spec.ts | 6 +- .../src/vault/models/domain/folder.spec.ts | 4 +- .../src/vault/models/domain/identity.spec.ts | 38 +- .../src/vault/models/domain/login.spec.ts | 8 +- .../src/vault/models/domain/password.spec.ts | 4 +- .../src/vault/services/cipher.service.spec.ts | 8 +- .../src/vault/services/cipher.service.ts | 37 +- .../src/vault/services/collection.service.ts | 2 +- .../vault/services/folder/folder.service.ts | 2 +- .../src/vault/services/sync/sync.service.ts | 4 +- .../services/vault-export.service.spec.ts | 8 +- 249 files changed, 10155 insertions(+), 2558 deletions(-) create mode 100644 apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts create mode 100644 apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts create mode 100644 apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts create mode 100644 apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts create mode 100644 apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html create mode 100644 apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts delete mode 100644 apps/browser/src/auth/popup/services/lock-guard.service.ts create mode 100644 apps/browser/src/background/service-factories/devices-api-service.factory.ts rename apps/browser/src/services/{vaultTimeout/vaultTimeout.service.ts => vault-timeout/vault-timeout.service.ts} (93%) create mode 100644 apps/desktop/src/auth/login/login-decryption-options/login-decryption-options.component.html create mode 100644 apps/desktop/src/auth/login/login-decryption-options/login-decryption-options.component.ts create mode 100644 apps/desktop/src/platform/services/electron-crypto.service.spec.ts create mode 100644 apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.html create mode 100644 apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.ts rename apps/web/src/app/{ => auth}/settings/change-password.component.html (94%) rename apps/web/src/app/{ => auth}/settings/change-password.component.ts (82%) delete mode 100644 apps/web/src/app/guards/home.guard.ts create mode 100644 libs/angular/src/auth/components/base-login-decryption-options.component.ts create mode 100644 libs/angular/src/auth/components/sso.component.spec.ts create mode 100644 libs/angular/src/auth/components/two-factor.component.spec.ts create mode 100644 libs/angular/src/auth/guards/index.ts create mode 100644 libs/angular/src/auth/guards/redirect.guard.ts create mode 100644 libs/angular/src/auth/guards/tde-decryption-required.guard.ts create mode 100644 libs/angular/src/vault/services/password-reprompt.service.spec.ts delete mode 100644 libs/common/src/abstractions/device-crypto.service.abstraction.ts delete mode 100644 libs/common/src/abstractions/devices/devices-api.service.abstraction.ts create mode 100644 libs/common/src/abstractions/devices/devices.service.abstraction.ts create mode 100644 libs/common/src/abstractions/devices/views/device.view.ts create mode 100644 libs/common/src/abstractions/vault-timeout/vault-timeout-settings.service.ts rename libs/common/src/abstractions/{vaultTimeout/vaultTimeout.service.ts => vault-timeout/vault-timeout.service.ts} (100%) delete mode 100644 libs/common/src/abstractions/vaultTimeout/vaultTimeoutSettings.service.ts create mode 100644 libs/common/src/auth/abstractions/auth-request-crypto.service.abstraction.ts create mode 100644 libs/common/src/auth/abstractions/device-trust-crypto.service.abstraction.ts create mode 100644 libs/common/src/auth/abstractions/devices-api.service.abstraction.ts create mode 100644 libs/common/src/auth/abstractions/password-reset-enrollment.service.abstraction.ts create mode 100644 libs/common/src/auth/login-strategies/passwordless-login.strategy.spec.ts create mode 100644 libs/common/src/auth/models/domain/admin-auth-req-storable.ts create mode 100644 libs/common/src/auth/models/domain/user-decryption-options/key-connector-user-decryption-option.ts create mode 100644 libs/common/src/auth/models/domain/user-decryption-options/trusted-device-user-decryption-option.ts create mode 100644 libs/common/src/auth/models/request/update-devices-trust.request.ts create mode 100644 libs/common/src/auth/models/response/protected-device.response.ts create mode 100644 libs/common/src/auth/models/response/user-decryption-options/key-connector-user-decryption-option.response.ts create mode 100644 libs/common/src/auth/models/response/user-decryption-options/trusted-device-user-decryption-option.response.ts create mode 100644 libs/common/src/auth/models/response/user-decryption-options/user-decryption-options.response.ts create mode 100644 libs/common/src/auth/services/auth-request-crypto.service.implementation.ts create mode 100644 libs/common/src/auth/services/auth-request-crypto.service.spec.ts create mode 100644 libs/common/src/auth/services/device-trust-crypto.service.implementation.ts create mode 100644 libs/common/src/auth/services/device-trust-crypto.service.spec.ts create mode 100644 libs/common/src/auth/services/devices-api.service.implementation.ts create mode 100644 libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts create mode 100644 libs/common/src/auth/services/password-reset-enrollment.service.implementation.ts delete mode 100644 libs/common/src/services/device-crypto.service.implementation.ts delete mode 100644 libs/common/src/services/device-crypto.service.spec.ts delete mode 100644 libs/common/src/services/devices/devices-api.service.implementation.ts create mode 100644 libs/common/src/services/devices/devices.service.implementation.ts create mode 100644 libs/common/src/services/vault-timeout/vault-timeout-settings.service.spec.ts rename libs/common/src/services/{vaultTimeout/vaultTimeoutSettings.service.ts => vault-timeout/vault-timeout-settings.service.ts} (50%) rename libs/common/src/services/{vaultTimeout/vaultTimeout.service.ts => vault-timeout/vault-timeout.service.ts} (79%) diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index 17047f4333d..a2ed46ce99b 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -2,10 +2,7 @@ ./apps/browser/src/safari/desktop/Assets.xcassets/AccentColor.colorset ./apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset ./apps/browser/src/safari/desktop/Base.lproj -./apps/browser/src/services/vaultTimeout ./apps/browser/store/windows/Assets -./libs/common/src/abstractions/vaultTimeout -./libs/common/src/services/vaultTimeout ./bitwarden_license/README.md ./libs/angular/src/directives/cipherListVirtualScroll.directive.ts ./libs/angular/src/scss/webfonts/Open_Sans-italic-700.woff @@ -25,11 +22,7 @@ ./libs/common/src/misc/linkedFieldOption.decorator.ts ./libs/common/src/misc/serviceUtils.ts ./libs/common/src/misc/serviceUtils.spec.ts -./libs/common/src/abstractions/vaultTimeout/vaultTimeoutSettings.service.ts -./libs/common/src/abstractions/vaultTimeout/vaultTimeout.service.ts ./libs/common/src/abstractions/anonymousHub.service.ts -./libs/common/src/services/vaultTimeout/vaultTimeoutSettings.service.ts -./libs/common/src/services/vaultTimeout/vaultTimeout.service.ts ./libs/common/src/services/anonymousHub.service.ts ./libs/auth/README.md ./README.md @@ -78,5 +71,4 @@ ./apps/browser/src/safari/safari/SafariWebExtensionHandler.swift ./apps/browser/src/safari/safari/Info.plist ./apps/browser/src/safari/desktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist -./apps/browser/src/services/vaultTimeout/vaultTimeout.service.ts ./SECURITY.md diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 400e75dd1b4..6de09d355aa 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -338,6 +338,9 @@ "other": { "message": "Other" }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, "rateExtension": { "message": "Rate the extension" }, @@ -1602,6 +1605,12 @@ "biometricsNotSupportedDesc": { "message": "Browser biometrics is not supported on this device." }, + "biometricsFailedTitle": { + "message": "Biometrics failed" + }, + "biometricsFailedDesc": { + "message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support." + }, "nativeMessaginPermissionErrorTitle": { "message": "Permission not provided" }, @@ -2143,8 +2152,8 @@ "notificationSentDevice": { "message": "A notification has been sent to your device." }, - "logInInitiated": { - "message": "Log in initiated" + "loginInitiated": { + "message": "Login initiated" }, "exposedMasterPassword": { "message": "Exposed Master Password" @@ -2230,6 +2239,31 @@ "opensInANewWindow": { "message": "Opens in a new window" }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "eu": { + "message": "EU", + "description": "European Union" + }, "usDomain": { "message": "bitwarden.com" }, @@ -2244,5 +2278,29 @@ }, "display": { "message": "Display" + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" } } diff --git a/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts new file mode 100644 index 00000000000..e1757f98129 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/auth-request-crypto-service.factory.ts @@ -0,0 +1,29 @@ +import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; +import { AuthRequestCryptoServiceImplementation } from "@bitwarden/common/auth/services/auth-request-crypto.service.implementation"; + +import { + CryptoServiceInitOptions, + cryptoServiceFactory, +} from "../../../platform/background/service-factories/crypto-service.factory"; +import { + CachedServices, + FactoryOptions, + factory, +} from "../../../platform/background/service-factories/factory-options"; + +type AuthRequestCryptoServiceFactoryOptions = FactoryOptions; + +export type AuthRequestCryptoServiceInitOptions = AuthRequestCryptoServiceFactoryOptions & + CryptoServiceInitOptions; + +export function authRequestCryptoServiceFactory( + cache: { authRequestCryptoService?: AuthRequestCryptoServiceAbstraction } & CachedServices, + opts: AuthRequestCryptoServiceInitOptions +): Promise { + return factory( + cache, + "authRequestCryptoService", + opts, + async () => new AuthRequestCryptoServiceImplementation(await cryptoServiceFactory(cache, opts)) + ); +} diff --git a/apps/browser/src/auth/background/service-factories/auth-service.factory.ts b/apps/browser/src/auth/background/service-factories/auth-service.factory.ts index 5612cedb91c..6aaeb476369 100644 --- a/apps/browser/src/auth/background/service-factories/auth-service.factory.ts +++ b/apps/browser/src/auth/background/service-factories/auth-service.factory.ts @@ -52,6 +52,14 @@ import { PasswordStrengthServiceInitOptions, } from "../../../tools/background/service_factories/password-strength-service.factory"; +import { + authRequestCryptoServiceFactory, + AuthRequestCryptoServiceInitOptions, +} from "./auth-request-crypto-service.factory"; +import { + deviceTrustCryptoServiceFactory, + DeviceTrustCryptoServiceInitOptions, +} from "./device-trust-crypto-service.factory"; import { keyConnectorServiceFactory, KeyConnectorServiceInitOptions, @@ -75,7 +83,9 @@ export type AuthServiceInitOptions = AuthServiceFactoyOptions & I18nServiceInitOptions & EncryptServiceInitOptions & PolicyServiceInitOptions & - PasswordStrengthServiceInitOptions; + PasswordStrengthServiceInitOptions & + DeviceTrustCryptoServiceInitOptions & + AuthRequestCryptoServiceInitOptions; export function authServiceFactory( cache: { authService?: AbstractAuthService } & CachedServices, @@ -101,7 +111,9 @@ export function authServiceFactory( await i18nServiceFactory(cache, opts), await encryptServiceFactory(cache, opts), await passwordStrengthServiceFactory(cache, opts), - await policyServiceFactory(cache, opts) + await policyServiceFactory(cache, opts), + await deviceTrustCryptoServiceFactory(cache, opts), + await authRequestCryptoServiceFactory(cache, opts) ) ); } diff --git a/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts b/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts new file mode 100644 index 00000000000..430d50fea75 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/device-trust-crypto-service.factory.ts @@ -0,0 +1,74 @@ +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; +import { DeviceTrustCryptoService } from "@bitwarden/common/auth/services/device-trust-crypto.service.implementation"; + +import { + DevicesApiServiceInitOptions, + devicesApiServiceFactory, +} from "../../../background/service-factories/devices-api-service.factory"; +import { + AppIdServiceInitOptions, + appIdServiceFactory, +} from "../../../platform/background/service-factories/app-id-service.factory"; +import { + CryptoFunctionServiceInitOptions, + cryptoFunctionServiceFactory, +} from "../../../platform/background/service-factories/crypto-function-service.factory"; +import { + CryptoServiceInitOptions, + cryptoServiceFactory, +} from "../../../platform/background/service-factories/crypto-service.factory"; +import { + EncryptServiceInitOptions, + encryptServiceFactory, +} from "../../../platform/background/service-factories/encrypt-service.factory"; +import { + CachedServices, + FactoryOptions, + factory, +} from "../../../platform/background/service-factories/factory-options"; +import { + I18nServiceInitOptions, + i18nServiceFactory, +} from "../../../platform/background/service-factories/i18n-service.factory"; +import { + PlatformUtilsServiceInitOptions, + platformUtilsServiceFactory, +} from "../../../platform/background/service-factories/platform-utils-service.factory"; +import { + StateServiceInitOptions, + stateServiceFactory, +} from "../../../platform/background/service-factories/state-service.factory"; + +type DeviceTrustCryptoServiceFactoryOptions = FactoryOptions; + +export type DeviceTrustCryptoServiceInitOptions = DeviceTrustCryptoServiceFactoryOptions & + CryptoFunctionServiceInitOptions & + CryptoServiceInitOptions & + EncryptServiceInitOptions & + StateServiceInitOptions & + AppIdServiceInitOptions & + DevicesApiServiceInitOptions & + I18nServiceInitOptions & + PlatformUtilsServiceInitOptions; + +export function deviceTrustCryptoServiceFactory( + cache: { deviceTrustCryptoService?: DeviceTrustCryptoServiceAbstraction } & CachedServices, + opts: DeviceTrustCryptoServiceInitOptions +): Promise { + return factory( + cache, + "deviceTrustCryptoService", + opts, + async () => + new DeviceTrustCryptoService( + await cryptoFunctionServiceFactory(cache, opts), + await cryptoServiceFactory(cache, opts), + await encryptServiceFactory(cache, opts), + await stateServiceFactory(cache, opts), + await appIdServiceFactory(cache, opts), + await devicesApiServiceFactory(cache, opts), + await i18nServiceFactory(cache, opts), + await platformUtilsServiceFactory(cache, opts) + ) + ); +} diff --git a/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts new file mode 100644 index 00000000000..01bfb0f13cb --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/user-verification-api-service.factory.ts @@ -0,0 +1,29 @@ +import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; +import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; + +import { + ApiServiceInitOptions, + apiServiceFactory, +} from "../../../platform/background/service-factories/api-service.factory"; +import { + FactoryOptions, + CachedServices, + factory, +} from "../../../platform/background/service-factories/factory-options"; + +type UserVerificationApiServiceFactoryOptions = FactoryOptions; + +export type UserVerificationApiServiceInitOptions = UserVerificationApiServiceFactoryOptions & + ApiServiceInitOptions; + +export function userVerificationApiServiceFactory( + cache: { userVerificationApiService?: UserVerificationApiServiceAbstraction } & CachedServices, + opts: UserVerificationApiServiceInitOptions +): Promise { + return factory( + cache, + "userVerificationApiService", + opts, + async () => new UserVerificationApiService(await apiServiceFactory(cache, opts)) + ); +} diff --git a/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts b/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts new file mode 100644 index 00000000000..79d327c9485 --- /dev/null +++ b/apps/browser/src/auth/background/service-factories/user-verification-service.factory.ts @@ -0,0 +1,51 @@ +import { UserVerificationService as AbstractUserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { UserVerificationService } from "@bitwarden/common/auth/services/user-verification/user-verification.service"; + +import { + CryptoServiceInitOptions, + cryptoServiceFactory, +} from "../../../platform/background/service-factories/crypto-service.factory"; +import { + FactoryOptions, + CachedServices, + factory, +} from "../../../platform/background/service-factories/factory-options"; +import { + I18nServiceInitOptions, + i18nServiceFactory, +} from "../../../platform/background/service-factories/i18n-service.factory"; +import { + StateServiceInitOptions, + stateServiceFactory, +} from "../../../platform/background/service-factories/state-service.factory"; + +import { + UserVerificationApiServiceInitOptions, + userVerificationApiServiceFactory, +} from "./user-verification-api-service.factory"; + +type UserVerificationServiceFactoryOptions = FactoryOptions; + +export type UserVerificationServiceInitOptions = UserVerificationServiceFactoryOptions & + StateServiceInitOptions & + CryptoServiceInitOptions & + I18nServiceInitOptions & + UserVerificationApiServiceInitOptions; + +export function userVerificationServiceFactory( + cache: { userVerificationService?: AbstractUserVerificationService } & CachedServices, + opts: UserVerificationServiceInitOptions +): Promise { + return factory( + cache, + "userVerificationService", + opts, + async () => + new UserVerificationService( + await stateServiceFactory(cache, opts), + await cryptoServiceFactory(cache, opts), + await i18nServiceFactory(cache, opts), + await userVerificationApiServiceFactory(cache, opts) + ) + ); +} diff --git a/apps/browser/src/auth/popup/lock.component.html b/apps/browser/src/auth/popup/lock.component.html index cf964c15646..e787e0106d1 100644 --- a/apps/browser/src/auth/popup/lock.component.html +++ b/apps/browser/src/auth/popup/lock.component.html @@ -5,14 +5,20 @@ {{ "verifyIdentity" | i18n }}
- +
-
-
+
+
-
+
{ - document.getElementById(this.pinLock ? "pin" : "masterPassword").focus(); + document.getElementById(this.pinEnabled ? "pin" : "masterPassword")?.focus(); if ( this.biometricLock && !disableAutoBiometricsPrompt && @@ -93,7 +96,7 @@ export class LockComponent extends BaseLockComponent { }, 100); } - async unlockBiometric(): Promise { + override async unlockBiometric(): Promise { if (!this.biometricLock) { return; } diff --git a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html new file mode 100644 index 00000000000..32e3ea0c598 --- /dev/null +++ b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.html @@ -0,0 +1,108 @@ +
+
+

+ {{ "loginInitiated" | i18n }} +

+
+ + +
diff --git a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts new file mode 100644 index 00000000000..7fac9a42b06 --- /dev/null +++ b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options.component.ts @@ -0,0 +1,18 @@ +import { Component } from "@angular/core"; + +import { BaseLoginDecryptionOptionsComponent } from "@bitwarden/angular/auth/components/base-login-decryption-options.component"; + +@Component({ + selector: "browser-login-decryption-options", + templateUrl: "login-decryption-options.component.html", +}) +export class LoginDecryptionOptionsComponent extends BaseLoginDecryptionOptionsComponent { + override async createUser(): Promise { + try { + await super.createUser(); + await this.router.navigate(["/tabs/vault"]); + } catch (error) { + this.validationService.showError(error); + } + } +} diff --git a/apps/browser/src/auth/popup/login-with-device.component.html b/apps/browser/src/auth/popup/login-with-device.component.html index d794b7d212b..127f7ec96fe 100644 --- a/apps/browser/src/auth/popup/login-with-device.component.html +++ b/apps/browser/src/auth/popup/login-with-device.component.html @@ -5,32 +5,57 @@
diff --git a/apps/browser/src/auth/popup/login-with-device.component.ts b/apps/browser/src/auth/popup/login-with-device.component.ts index cf0e57b5ee5..f3a1dfffaa0 100644 --- a/apps/browser/src/auth/popup/login-with-device.component.ts +++ b/apps/browser/src/auth/popup/login-with-device.component.ts @@ -1,10 +1,13 @@ +import { Location } from "@angular/common"; import { Component, OnDestroy, OnInit } from "@angular/core"; import { Router } from "@angular/router"; import { LoginWithDeviceComponent as BaseLoginWithDeviceComponent } from "@bitwarden/angular/auth/components/login-with-device.component"; import { AnonymousHubService } from "@bitwarden/common/abstractions/anonymousHub.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -42,7 +45,10 @@ export class LoginWithDeviceComponent validationService: ValidationService, stateService: StateService, loginService: LoginService, - syncService: SyncService + syncService: SyncService, + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, + authReqCryptoService: AuthRequestCryptoServiceAbstraction, + private location: Location ) { super( router, @@ -59,10 +65,16 @@ export class LoginWithDeviceComponent anonymousHubService, validationService, stateService, - loginService + loginService, + deviceTrustCryptoService, + authReqCryptoService ); super.onSuccessfulLogin = async () => { await syncService.fullSync(true); }; } + + protected back() { + this.location.back(); + } } diff --git a/apps/browser/src/auth/popup/login.component.ts b/apps/browser/src/auth/popup/login.component.ts index 776b792fa1d..d9b789e4d81 100644 --- a/apps/browser/src/auth/popup/login.component.ts +++ b/apps/browser/src/auth/popup/login.component.ts @@ -4,8 +4,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; diff --git a/apps/browser/src/auth/popup/services/index.ts b/apps/browser/src/auth/popup/services/index.ts index 06bfe0009bd..63563f61fd9 100644 --- a/apps/browser/src/auth/popup/services/index.ts +++ b/apps/browser/src/auth/popup/services/index.ts @@ -1,2 +1 @@ -export { LockGuardService } from "./lock-guard.service"; export { UnauthGuardService } from "./unauth-guard.service"; diff --git a/apps/browser/src/auth/popup/services/lock-guard.service.ts b/apps/browser/src/auth/popup/services/lock-guard.service.ts deleted file mode 100644 index ef6ebc73aca..00000000000 --- a/apps/browser/src/auth/popup/services/lock-guard.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from "@angular/core"; - -import { LockGuard as BaseLockGuardService } from "@bitwarden/angular/auth/guards/lock.guard"; - -@Injectable() -export class LockGuardService extends BaseLockGuardService { - protected homepage = "tabs/current"; -} diff --git a/apps/browser/src/auth/popup/services/unauth-guard.service.ts b/apps/browser/src/auth/popup/services/unauth-guard.service.ts index 4aa700b5568..062239a7d36 100644 --- a/apps/browser/src/auth/popup/services/unauth-guard.service.ts +++ b/apps/browser/src/auth/popup/services/unauth-guard.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@angular/core"; -import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/auth/guards/unauth.guard"; +import { UnauthGuard as BaseUnauthGuardService } from "@bitwarden/angular/auth/guards"; @Injectable() export class UnauthGuardService extends BaseUnauthGuardService { diff --git a/apps/browser/src/auth/popup/sso.component.ts b/apps/browser/src/auth/popup/sso.component.ts index 2214e91687a..9d04701680e 100644 --- a/apps/browser/src/auth/popup/sso.component.ts +++ b/apps/browser/src/auth/popup/sso.component.ts @@ -1,11 +1,12 @@ -import { Component } from "@angular/core"; +import { Component, Inject } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; +import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -35,7 +36,8 @@ export class SsoComponent extends BaseSsoComponent { syncService: SyncService, environmentService: EnvironmentService, logService: LogService, - private vaultTimeoutService: VaultTimeoutService + configService: ConfigServiceAbstraction, + @Inject(WINDOW) private win: Window ) { super( authService, @@ -48,7 +50,8 @@ export class SsoComponent extends BaseSsoComponent { cryptoFunctionService, environmentService, passwordGenerationService, - logService + logService, + configService ); const url = this.environmentService.getWebVaultUrl(); @@ -57,15 +60,22 @@ export class SsoComponent extends BaseSsoComponent { this.clientId = "browser"; super.onSuccessfulLogin = async () => { - await syncService.fullSync(true); + syncService.fullSync(true); // If the vault is unlocked then this will clear keys from memory, which we don't want to do if ((await this.authService.getAuthStatus()) !== AuthenticationStatus.Unlocked) { BrowserApi.reloadOpenWindows(); } - const thisWindow = window.open("", "_self"); - thisWindow.close(); + this.win.close(); + }; + + super.onSuccessfulLoginTde = async () => { + syncService.fullSync(true); + }; + + super.onSuccessfulLoginTdeNavigate = async () => { + this.win.close(); }; } } diff --git a/apps/browser/src/auth/popup/two-factor.component.ts b/apps/browser/src/auth/popup/two-factor.component.ts index 03821bb22f1..c0af31d25e5 100644 --- a/apps/browser/src/auth/popup/two-factor.component.ts +++ b/apps/browser/src/auth/popup/two-factor.component.ts @@ -1,8 +1,9 @@ -import { Component } from "@angular/core"; +import { Component, Inject } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; import { TwoFactorComponent as BaseTwoFactorComponent } from "@bitwarden/angular/auth/components/two-factor.component"; +import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; @@ -10,6 +11,7 @@ import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -48,7 +50,9 @@ export class TwoFactorComponent extends BaseTwoFactorComponent { twoFactorService: TwoFactorService, appIdService: AppIdService, loginService: LoginService, - private dialogService: DialogService + configService: ConfigServiceAbstraction, + private dialogService: DialogService, + @Inject(WINDOW) protected win: Window ) { super( authService, @@ -56,19 +60,28 @@ export class TwoFactorComponent extends BaseTwoFactorComponent { i18nService, apiService, platformUtilsService, - window, + win, environmentService, stateService, route, logService, twoFactorService, appIdService, - loginService + loginService, + configService ); - super.onSuccessfulLogin = () => { - this.loginService.clearValues(); - return syncService.fullSync(true); + super.onSuccessfulLogin = async () => { + syncService.fullSync(true); }; + + super.onSuccessfulLoginTde = async () => { + syncService.fullSync(true); + }; + + super.onSuccessfulLoginTdeNavigate = async () => { + this.win.close(); + }; + super.successRoute = "/tabs/vault"; // FIXME: Chromium 110 has broken WebAuthn support in extensions via an iframe this.webAuthnNewTab = true; @@ -117,11 +130,11 @@ export class TwoFactorComponent extends BaseTwoFactorComponent { // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe this.route.queryParams.pipe(first()).subscribe(async (qParams) => { if (qParams.sso === "true") { - super.onSuccessfulLogin = () => { + super.onSuccessfulLogin = async () => { // This is not awaited so we don't pause the application while the sync is happening. // This call is executed by the service that lives in the background script so it will continue // the sync even if this tab closes. - const syncPromise = this.syncService.fullSync(true); + this.syncService.fullSync(true); // Force sidebars (FF && Opera) to reload while exempting current window // because we are just going to close the current window. @@ -130,8 +143,6 @@ export class TwoFactorComponent extends BaseTwoFactorComponent { // We don't need this window anymore because the intent is for the user to be left // on the web vault screen which tells them to continue in the browser extension (sidebar or popup) BrowserApi.closeBitwardenExtensionTab(); - - return syncPromise; }; } }); diff --git a/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts b/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts index a802fd8cf1c..efa5bdcffbb 100644 --- a/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts +++ b/apps/browser/src/autofill/background/service_factories/autofill-service.factory.ts @@ -2,6 +2,10 @@ import { TotpServiceInitOptions, totpServiceFactory, } from "../../../auth/background/service-factories/totp-service.factory"; +import { + UserVerificationServiceInitOptions, + userVerificationServiceFactory, +} from "../../../auth/background/service-factories/user-verification-service.factory"; import { EventCollectionServiceInitOptions, eventCollectionServiceFactory, @@ -38,7 +42,8 @@ export type AutoFillServiceInitOptions = AutoFillServiceOptions & TotpServiceInitOptions & EventCollectionServiceInitOptions & LogServiceInitOptions & - SettingsServiceInitOptions; + SettingsServiceInitOptions & + UserVerificationServiceInitOptions; export function autofillServiceFactory( cache: { autofillService?: AbstractAutoFillService } & CachedServices, @@ -55,7 +60,8 @@ export function autofillServiceFactory( await totpServiceFactory(cache, opts), await eventCollectionServiceFactory(cache, opts), await logServiceFactory(cache, opts), - await settingsServiceFactory(cache, opts) + await settingsServiceFactory(cache, opts), + await userVerificationServiceFactory(cache, opts) ) ); } diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts index 9db6574aada..dbe391ce4ab 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.spec.ts @@ -1,6 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; @@ -13,6 +14,7 @@ describe("CipherContextMenuHandler", () => { let mainContextMenuHandler: MockProxy; let authService: MockProxy; let cipherService: MockProxy; + let userVerificationService: MockProxy; let sut: CipherContextMenuHandler; @@ -20,10 +22,17 @@ describe("CipherContextMenuHandler", () => { mainContextMenuHandler = mock(); authService = mock(); cipherService = mock(); + userVerificationService = mock(); + userVerificationService.hasMasterPassword.mockResolvedValue(true); jest.spyOn(MainContextMenuHandler, "removeAll").mockResolvedValue(); - sut = new CipherContextMenuHandler(mainContextMenuHandler, authService, cipherService); + sut = new CipherContextMenuHandler( + mainContextMenuHandler, + authService, + cipherService, + userVerificationService + ); }); afterEach(() => jest.resetAllMocks()); @@ -83,11 +92,11 @@ describe("CipherContextMenuHandler", () => { }; cipherService.getAllDecryptedForUrl.mockResolvedValue([ - null, - undefined, - { type: CipherType.Card }, - { type: CipherType.Login, reprompt: CipherRepromptType.Password }, - realCipher, + null, // invalid cipher + undefined, // invalid cipher + { type: CipherType.Card }, // invalid cipher + { type: CipherType.Login, reprompt: CipherRepromptType.Password }, // invalid cipher + realCipher, // valid cipher ] as any[]); await sut.update("https://test.com"); @@ -105,5 +114,61 @@ describe("CipherContextMenuHandler", () => { realCipher ); }); + + it("adds ciphers with master password reprompt if the user does not have a master password", async () => { + authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked); + + // User does not have a master password, or has one but hasn't logged in with it (key connector user or TDE user) + userVerificationService.hasMasterPasswordAndMasterKeyHash.mockResolvedValue(false); + + mainContextMenuHandler.init.mockResolvedValue(true); + + const realCipher = { + id: "5", + type: CipherType.Login, + reprompt: CipherRepromptType.None, + name: "Test Cipher", + login: { username: "Test Username" }, + }; + + const repromptCipher = { + id: "6", + type: CipherType.Login, + reprompt: CipherRepromptType.Password, + name: "Test Reprompt Cipher", + login: { username: "Test Username" }, + }; + + cipherService.getAllDecryptedForUrl.mockResolvedValue([ + null, // invalid cipher + undefined, // invalid cipher + { type: CipherType.Card }, // invalid cipher + repromptCipher, // valid cipher + realCipher, // valid cipher + ] as any[]); + + await sut.update("https://test.com"); + + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1); + + expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com"); + + // Should call this twice, once for each valid cipher + expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(2); + + expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith( + "Test Cipher (Test Username)", + "5", + "https://test.com", + realCipher + ); + + expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith( + "Test Reprompt Cipher (Test Username)", + "6", + "https://test.com", + repromptCipher + ); + }); }); }); diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts index fe6479aae51..1d1be8f8386 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -1,4 +1,5 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -11,6 +12,7 @@ import { authServiceFactory, AuthServiceInitOptions, } from "../../auth/background/service-factories/auth-service.factory"; +import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory"; import { Account } from "../../models/account"; import { CachedServices } from "../../platform/background/service-factories/factory-options"; import { BrowserApi } from "../../platform/browser/browser-api"; @@ -37,7 +39,8 @@ export class CipherContextMenuHandler { constructor( private mainContextMenuHandler: MainContextMenuHandler, private authService: AuthService, - private cipherService: CipherService + private cipherService: CipherService, + private userVerificationService: UserVerificationService ) {} static async create(cachedServices: CachedServices) { @@ -76,7 +79,8 @@ export class CipherContextMenuHandler { return new CipherContextMenuHandler( await MainContextMenuHandler.mv3Create(cachedServices), await authServiceFactory(cachedServices, serviceOptions), - await cipherServiceFactory(cachedServices, serviceOptions) + await cipherServiceFactory(cachedServices, serviceOptions), + await userVerificationServiceFactory(cachedServices, serviceOptions) ); } @@ -176,7 +180,11 @@ export class CipherContextMenuHandler { } private async updateForCipher(url: string, cipher: CipherView) { - if (cipher == null || cipher.type !== CipherType.Login) { + if ( + cipher == null || + cipher.type !== CipherType.Login || + (await this.userVerificationService.hasMasterPasswordAndMasterKeyHash()) + ) { return; } diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index 8b7ec916534..571b4af7213 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -1,6 +1,7 @@ import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { EventType, FieldType, UriMatchType } from "@bitwarden/common/enums"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -45,7 +46,8 @@ export default class AutofillService implements AutofillServiceInterface { private totpService: TotpService, private eventCollectionService: EventCollectionService, private logService: LogService, - private settingsService: SettingsService + private settingsService: SettingsService, + private userVerificationService: UserVerificationService ) {} getFormsWithPasswordFields(pageDetails: AutofillPageDetails): FormData[] { @@ -238,7 +240,10 @@ export default class AutofillService implements AutofillServiceInterface { return null; } - if (cipher.reprompt !== CipherRepromptType.None) { + if ( + cipher.reprompt !== CipherRepromptType.None && + (await this.userVerificationService.hasMasterPasswordAndMasterKeyHash()) + ) { await BrowserApi.tabSendMessageData(tab, "passwordReprompt", { cipherId: cipher.id, action: "autofill", diff --git a/apps/browser/src/background/commands.background.ts b/apps/browser/src/background/commands.background.ts index 118953b9da0..0cbf91c6666 100644 --- a/apps/browser/src/background/commands.background.ts +++ b/apps/browser/src/background/commands.background.ts @@ -1,4 +1,4 @@ -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/apps/browser/src/background/idle.background.ts b/apps/browser/src/background/idle.background.ts index 3854d2383b4..7200301c795 100644 --- a/apps/browser/src/background/idle.background.ts +++ b/apps/browser/src/background/idle.background.ts @@ -1,5 +1,5 @@ import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { BrowserStateService } from "../platform/services/abstractions/browser-state.service"; diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 59a1b444e09..617acc2bf78 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1,27 +1,33 @@ import { AvatarUpdateService as AvatarUpdateServiceAbstraction } from "@bitwarden/common/abstractions/account/avatar-update.service"; import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service"; import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstractions/audit.service"; +import { DevicesServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices.service.abstraction"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service"; import { NotificationsService as NotificationsServiceAbstraction } from "@bitwarden/common/abstractions/notifications.service"; import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; import { SettingsService as SettingsServiceAbstraction } from "@bitwarden/common/abstractions/settings.service"; import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/abstractions/totp.service"; -import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; -import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; +import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService as InternalPolicyServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { ProviderService as ProviderServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/provider.service"; import { PolicyApiService } from "@bitwarden/common/admin-console/services/policy/policy-api.service"; import { ProviderService } from "@bitwarden/common/admin-console/services/provider.service"; +import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { TokenService as TokenServiceAbstraction } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; import { UserVerificationService as UserVerificationServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { AuthRequestCryptoServiceImplementation } from "@bitwarden/common/auth/services/auth-request-crypto.service.implementation"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; +import { DeviceTrustCryptoService } from "@bitwarden/common/auth/services/device-trust-crypto.service.implementation"; +import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; import { TokenService } from "@bitwarden/common/auth/services/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service"; @@ -59,12 +65,13 @@ import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/we import { AvatarUpdateService } from "@bitwarden/common/services/account/avatar-update.service"; import { ApiService } from "@bitwarden/common/services/api.service"; import { AuditService } from "@bitwarden/common/services/audit.service"; +import { DevicesServiceImplementation } from "@bitwarden/common/services/devices/devices.service.implementation"; import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service"; import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; import { SearchService } from "@bitwarden/common/services/search.service"; import { TotpService } from "@bitwarden/common/services/totp.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vaultTimeout/vaultTimeoutSettings.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { PasswordGenerationService, PasswordGenerationServiceAbstraction, @@ -128,7 +135,7 @@ import { KeyGenerationService } from "../platform/services/key-generation.servic import { LocalBackedSessionStorageService } from "../platform/services/local-backed-session-storage.service"; import { BrowserSendService } from "../services/browser-send.service"; import { BrowserSettingsService } from "../services/browser-settings.service"; -import VaultTimeoutService from "../services/vaultTimeout/vaultTimeout.service"; +import VaultTimeoutService from "../services/vault-timeout/vault-timeout.service"; import { BrowserFolderService } from "../vault/services/browser-folder.service"; import { VaultFilterService } from "../vault/services/vault-filter.service"; @@ -156,7 +163,7 @@ export default class MainBackground { cipherService: CipherServiceAbstraction; folderService: InternalFolderServiceAbstraction; collectionService: CollectionServiceAbstraction; - vaultTimeoutService: VaultTimeoutServiceAbstraction; + vaultTimeoutService: VaultTimeoutService; vaultTimeoutSettingsService: VaultTimeoutSettingsServiceAbstraction; syncService: SyncServiceAbstraction; passwordGenerationService: PasswordGenerationServiceAbstraction; @@ -196,6 +203,10 @@ export default class MainBackground { cipherContextMenuHandler: CipherContextMenuHandler; configService: ConfigServiceAbstraction; configApiService: ConfigApiServiceAbstraction; + devicesApiService: DevicesApiServiceAbstraction; + devicesService: DevicesServiceAbstraction; + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction; + authRequestCryptoService: AuthRequestCryptoServiceAbstraction; browserPopoutWindowService: BrowserPopoutWindowService; // Passed to the popup for Safari to workaround issues with theming, downloading, etc. @@ -387,6 +398,23 @@ export default class MainBackground { that.runtimeBackground.processMessage(message, that as any, null); }; })(); + + this.devicesApiService = new DevicesApiServiceImplementation(this.apiService); + this.deviceTrustCryptoService = new DeviceTrustCryptoService( + this.cryptoFunctionService, + this.cryptoService, + this.encryptService, + this.stateService, + this.appIdService, + this.devicesApiService, + this.i18nService, + this.platformUtilsService + ); + + this.devicesService = new DevicesServiceImplementation(this.devicesApiService); + + this.authRequestCryptoService = new AuthRequestCryptoServiceImplementation(this.cryptoService); + this.authService = new AuthService( this.cryptoService, this.apiService, @@ -402,14 +430,26 @@ export default class MainBackground { this.i18nService, this.encryptService, this.passwordStrengthService, - this.policyService + this.policyService, + this.deviceTrustCryptoService, + this.authRequestCryptoService + ); + + this.userVerificationApiService = new UserVerificationApiService(this.apiService); + + this.userVerificationService = new UserVerificationService( + this.stateService, + this.cryptoService, + this.i18nService, + this.userVerificationApiService ); this.vaultTimeoutSettingsService = new VaultTimeoutSettingsService( this.cryptoService, this.tokenService, this.policyService, - this.stateService + this.stateService, + this.userVerificationService ); this.vaultTimeoutService = new VaultTimeoutService( @@ -420,7 +460,6 @@ export default class MainBackground { this.platformUtilsService, this.messagingService, this.searchService, - this.keyConnectorService, this.stateService, this.authService, this.vaultTimeoutSettingsService, @@ -471,13 +510,15 @@ export default class MainBackground { this.eventUploadService ); this.totpService = new TotpService(this.cryptoFunctionService, this.logService); + this.autofillService = new AutofillService( this.cipherService, this.stateService, this.totpService, this.eventCollectionService, this.logService, - this.settingsService + this.settingsService, + this.userVerificationService ); this.auditService = new AuditService(this.cryptoFunctionService, this.apiService); this.exportService = new VaultExportService( @@ -499,15 +540,6 @@ export default class MainBackground { this.authService, this.messagingService ); - - this.userVerificationApiService = new UserVerificationApiService(this.apiService); - - this.userVerificationService = new UserVerificationService( - this.cryptoService, - this.i18nService, - this.userVerificationApiService - ); - this.configService = new ConfigService( this.stateService, this.configApiService, @@ -638,7 +670,8 @@ export default class MainBackground { this.cipherContextMenuHandler = new CipherContextMenuHandler( this.mainContextMenuHandler, this.authService, - this.cipherService + this.cipherService, + this.userVerificationService ); } } @@ -648,7 +681,7 @@ export default class MainBackground { await this.stateService.init(); - await (this.vaultTimeoutService as VaultTimeoutService).init(true); + await this.vaultTimeoutService.init(true); await (this.i18nService as BrowserI18nService).init(); await (this.eventUploadService as EventUploadService).init(true); await this.runtimeBackground.init(); diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index e482c7cc83e..d393022b7b9 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -10,7 +10,11 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { + MasterKey, + SymmetricCryptoKey, + UserKey, +} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { BrowserApi } from "../platform/browser/browser-api"; @@ -42,6 +46,7 @@ type ReceiveMessage = { // Unlock key keyB64?: string; + userKeyB64?: string; }; type ReceiveMessageOuter = { @@ -320,16 +325,55 @@ export class NativeMessagingBackground { } if (message.response === "unlocked") { - await this.cryptoService.setKey( - new SymmetricCryptoKey(Utils.fromB64ToArray(message.keyB64)) - ); + try { + if (message.userKeyB64) { + const userKey = new SymmetricCryptoKey( + Utils.fromB64ToArray(message.userKeyB64) + ) as UserKey; + await this.cryptoService.setUserKey(userKey); + } else if (message.keyB64) { + // Backwards compatibility to support cases in which the user hasn't updated their desktop app + // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3472) + let encUserKey = await this.stateService.getEncryptedCryptoSymmetricKey(); + encUserKey ||= await this.stateService.getMasterKeyEncryptedUserKey(); + if (!encUserKey) { + throw new Error("No encrypted user key found"); + } + const masterKey = new SymmetricCryptoKey( + Utils.fromB64ToArray(message.keyB64) + ) as MasterKey; + const userKey = await this.cryptoService.decryptUserKeyWithMasterKey( + masterKey, + new EncString(encUserKey) + ); + await this.cryptoService.setMasterKey(masterKey); + await this.cryptoService.setUserKey(userKey); + } else { + throw new Error("No key received"); + } + } catch (e) { + this.logService.error("Unable to set key: " + e); + this.messagingService.send("showDialog", { + title: { key: "biometricsFailedTitle" }, + content: { key: "biometricsFailedDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "danger", + }); + + // Exit early + if (this.resolver) { + this.resolver(message); + } + return; + } // Verify key is correct by attempting to decrypt a secret try { await this.cryptoService.getFingerprint(await this.stateService.getUserId()); } catch (e) { this.logService.error("Unable to verify key: " + e); - await this.cryptoService.clearKey(); + await this.cryptoService.clearKeys(); this.showWrongUserDialog(); // Exit early diff --git a/apps/browser/src/background/service-factories/devices-api-service.factory.ts b/apps/browser/src/background/service-factories/devices-api-service.factory.ts new file mode 100644 index 00000000000..8999b7c2c72 --- /dev/null +++ b/apps/browser/src/background/service-factories/devices-api-service.factory.ts @@ -0,0 +1,28 @@ +import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; +import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; + +import { + ApiServiceInitOptions, + apiServiceFactory, +} from "../../platform/background/service-factories/api-service.factory"; +import { + FactoryOptions, + CachedServices, + factory, +} from "../../platform/background/service-factories/factory-options"; + +type DevicesApiServiceFactoryOptions = FactoryOptions; + +export type DevicesApiServiceInitOptions = DevicesApiServiceFactoryOptions & ApiServiceInitOptions; + +export function devicesApiServiceFactory( + cache: { devicesApiService?: DevicesApiServiceAbstraction } & CachedServices, + opts: DevicesApiServiceInitOptions +): Promise { + return factory( + cache, + "devicesApiService", + opts, + async () => new DevicesApiServiceImplementation(await apiServiceFactory(cache, opts)) + ); +} diff --git a/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts b/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts index 601867ad385..b019db3297d 100644 --- a/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts +++ b/apps/browser/src/background/service-factories/vault-timeout-service.factory.ts @@ -1,13 +1,9 @@ -import { VaultTimeoutService as AbstractVaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; +import { VaultTimeoutService as AbstractVaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { authServiceFactory, AuthServiceInitOptions, } from "../../auth/background/service-factories/auth-service.factory"; -import { - keyConnectorServiceFactory, - KeyConnectorServiceInitOptions, -} from "../../auth/background/service-factories/key-connector-service.factory"; import { CryptoServiceInitOptions, cryptoServiceFactory, @@ -29,7 +25,7 @@ import { StateServiceInitOptions, stateServiceFactory, } from "../../platform/background/service-factories/state-service.factory"; -import VaultTimeoutService from "../../services/vaultTimeout/vaultTimeout.service"; +import VaultTimeoutService from "../../services/vault-timeout/vault-timeout.service"; import { cipherServiceFactory, CipherServiceInitOptions, @@ -64,7 +60,6 @@ export type VaultTimeoutServiceInitOptions = VaultTimeoutServiceFactoryOptions & PlatformUtilsServiceInitOptions & MessagingServiceInitOptions & SearchServiceInitOptions & - KeyConnectorServiceInitOptions & StateServiceInitOptions & AuthServiceInitOptions & VaultTimeoutSettingsServiceInitOptions; @@ -86,7 +81,6 @@ export function vaultTimeoutServiceFactory( await platformUtilsServiceFactory(cache, opts), await messagingServiceFactory(cache, opts), await searchServiceFactory(cache, opts), - await keyConnectorServiceFactory(cache, opts), await stateServiceFactory(cache, opts), await authServiceFactory(cache, opts), await vaultTimeoutSettingsServiceFactory(cache, opts), diff --git a/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts b/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts index 724993127b7..eda86c0a156 100644 --- a/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts +++ b/apps/browser/src/background/service-factories/vault-timeout-settings-service.factory.ts @@ -1,5 +1,5 @@ -import { VaultTimeoutSettingsService as AbstractVaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vaultTimeout/vaultTimeoutSettings.service"; +import { VaultTimeoutSettingsService as AbstractVaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/services/vault-timeout/vault-timeout-settings.service"; import { policyServiceFactory, @@ -9,6 +9,10 @@ import { tokenServiceFactory, TokenServiceInitOptions, } from "../../auth/background/service-factories/token-service.factory"; +import { + userVerificationServiceFactory, + UserVerificationServiceInitOptions, +} from "../../auth/background/service-factories/user-verification-service.factory"; import { CryptoServiceInitOptions, cryptoServiceFactory, @@ -29,7 +33,8 @@ export type VaultTimeoutSettingsServiceInitOptions = VaultTimeoutSettingsService CryptoServiceInitOptions & TokenServiceInitOptions & PolicyServiceInitOptions & - StateServiceInitOptions; + StateServiceInitOptions & + UserVerificationServiceInitOptions; export function vaultTimeoutSettingsServiceFactory( cache: { vaultTimeoutSettingsService?: AbstractVaultTimeoutSettingsService } & CachedServices, @@ -44,7 +49,8 @@ export function vaultTimeoutSettingsServiceFactory( await cryptoServiceFactory(cache, opts), await tokenServiceFactory(cache, opts), await policyServiceFactory(cache, opts), - await stateServiceFactory(cache, opts) + await stateServiceFactory(cache, opts), + await userVerificationServiceFactory(cache, opts) ) ); } diff --git a/apps/browser/src/platform/services/browser-crypto.service.ts b/apps/browser/src/platform/services/browser-crypto.service.ts index 1018c270cb2..a6dce0f39e9 100644 --- a/apps/browser/src/platform/services/browser-crypto.service.ts +++ b/apps/browser/src/platform/services/browser-crypto.service.ts @@ -1,13 +1,32 @@ import { KeySuffixOptions } from "@bitwarden/common/enums"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { + SymmetricCryptoKey, + UserKey, +} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { CryptoService } from "@bitwarden/common/platform/services/crypto.service"; export class BrowserCryptoService extends CryptoService { - protected async retrieveKeyFromStorage(keySuffix: KeySuffixOptions) { - if (keySuffix === "biometric") { + override async hasUserKeyStored(keySuffix: KeySuffixOptions, userId?: string): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + return await this.stateService.getBiometricUnlock({ userId: userId }); + } + return super.hasUserKeyStored(keySuffix, userId); + } + + /** + * Browser doesn't store biometric keys, so we retrieve them from the desktop and return + * if we successfully saved it into memory as the User Key + */ + protected override async getKeyFromStorage(keySuffix: KeySuffixOptions): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { await this.platformUtilService.authenticateBiometric(); - return (await this.getKey())?.keyB64; + const userKey = await this.stateService.getUserKey(); + if (userKey) { + return new SymmetricCryptoKey(Utils.fromB64ToArray(userKey.keyB64)) as UserKey; + } } - return await super.retrieveKeyFromStorage(keySuffix); + return await super.getKeyFromStorage(keySuffix); } } diff --git a/apps/browser/src/platform/services/browser-state.service.spec.ts b/apps/browser/src/platform/services/browser-state.service.spec.ts index 874e13b7d8f..d6bb83f7fb5 100644 --- a/apps/browser/src/platform/services/browser-state.service.spec.ts +++ b/apps/browser/src/platform/services/browser-state.service.spec.ts @@ -41,7 +41,8 @@ describe("Browser State Service", () => { logService = mock(); stateMigrationService = mock(); stateFactory = mock(); - useAccountCache = true; + // turn off account cache for tests + useAccountCache = false; state = new State(new GlobalState()); state.accounts[userId] = new Account({ diff --git a/apps/browser/src/platform/services/browser-state.service.ts b/apps/browser/src/platform/services/browser-state.service.ts index 37f50d6dc77..34fa1a1d0f3 100644 --- a/apps/browser/src/platform/services/browser-state.service.ts +++ b/apps/browser/src/platform/services/browser-state.service.ts @@ -1,5 +1,12 @@ import { BehaviorSubject } from "rxjs"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { StateMigrationService } from "@bitwarden/common/platform/abstractions/state-migration.service"; +import { + AbstractStorageService, + AbstractMemoryStorageService, +} from "@bitwarden/common/platform/abstractions/storage.service"; +import { StateFactory } from "@bitwarden/common/platform/factories/state-factory"; import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state"; import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options"; import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service"; @@ -26,14 +33,44 @@ export class BrowserStateService protected activeAccountSubject: BehaviorSubject; @sessionSync({ initializer: (b: boolean) => b }) protected activeAccountUnlockedSubject: BehaviorSubject; - @sessionSync({ - initializer: Account.fromJSON as any, // TODO: Remove this any when all any types are removed from Account - initializeAs: "record", - }) - protected accountDiskCache: BehaviorSubject>; protected accountDeserializer = Account.fromJSON; + constructor( + storageService: AbstractStorageService, + secureStorageService: AbstractStorageService, + memoryStorageService: AbstractMemoryStorageService, + logService: LogService, + stateMigrationService: StateMigrationService, + stateFactory: StateFactory, + useAccountCache = true + ) { + super( + storageService, + secureStorageService, + memoryStorageService, + logService, + stateMigrationService, + stateFactory, + useAccountCache + ); + + // TODO: This is a hack to fix having a disk cache on both the popup and + // the background page that can get out of sync. We need to work out the + // best way to handle caching with multiple instances of the state service. + if (useAccountCache) { + chrome.storage.onChanged.addListener((changes, namespace) => { + if (namespace === "local") { + for (const key of Object.keys(changes)) { + if (key !== "accountActivity" && this.accountDiskCache.value[key]) { + this.deleteDiskCache(key); + } + } + } + }); + } + } + async addAccount(account: Account) { // Apply browser overrides to default account values account = new Account(account); @@ -132,4 +169,17 @@ export class BrowserStateService this.reconcileOptions(options, await this.defaultInMemoryOptions()) ); } + + // Overriding the base class to prevent deleting the cache on save. We register a storage listener + // to delete the cache in the constructor above. + protected override async saveAccountToDisk( + account: Account, + options: StorageOptions + ): Promise { + const storageLocation = options.useSecureStorage + ? this.secureStorageService + : this.storageService; + + await storageLocation.save(`${options.userId}`, account, options); + } } diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 7da3d3049f7..c15bf86f087 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -1,14 +1,21 @@ import { Injectable, NgModule } from "@angular/core"; import { ActivatedRouteSnapshot, RouteReuseStrategy, RouterModule, Routes } from "@angular/router"; -import { AuthGuard } from "@bitwarden/angular/auth/guards/auth.guard"; -import { LockGuard } from "@bitwarden/angular/auth/guards/lock.guard"; -import { UnauthGuard } from "@bitwarden/angular/auth/guards/unauth.guard"; +import { + redirectGuard, + AuthGuard, + lockGuard, + tdeDecryptionRequiredGuard, + UnauthGuard, +} from "@bitwarden/angular/auth/guards"; +import { canAccessFeature } from "@bitwarden/angular/guard/feature-flag.guard"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { EnvironmentComponent } from "../auth/popup/environment.component"; import { HintComponent } from "../auth/popup/hint.component"; import { HomeComponent } from "../auth/popup/home.component"; import { LockComponent } from "../auth/popup/lock.component"; +import { LoginDecryptionOptionsComponent } from "../auth/popup/login-decryption-options/login-decryption-options.component"; import { LoginWithDeviceComponent } from "../auth/popup/login-with-device.component"; import { LoginComponent } from "../auth/popup/login.component"; import { RegisterComponent } from "../auth/popup/register.component"; @@ -49,8 +56,9 @@ import { TabsComponent } from "./tabs.component"; const routes: Routes = [ { path: "", - redirectTo: "home", pathMatch: "full", + children: [], // Children lets us have an empty component. + canActivate: [redirectGuard({ loggedIn: "/tabs/vault", loggedOut: "/home", locked: "/lock" })], }, { path: "vault", @@ -72,13 +80,19 @@ const routes: Routes = [ { path: "login-with-device", component: LoginWithDeviceComponent, - canActivate: [UnauthGuard], + canActivate: [], + data: { state: "login-with-device" }, + }, + { + path: "admin-approval-requested", + component: LoginWithDeviceComponent, + canActivate: [], data: { state: "login-with-device" }, }, { path: "lock", component: LockComponent, - canActivate: [LockGuard], + canActivate: [lockGuard()], data: { state: "lock" }, }, { @@ -93,6 +107,14 @@ const routes: Routes = [ canActivate: [UnauthGuard], data: { state: "2fa-options" }, }, + { + path: "login-initiated", + component: LoginDecryptionOptionsComponent, + canActivate: [ + tdeDecryptionRequiredGuard(), + canAccessFeature(FeatureFlag.TrustedDeviceEncryption), + ], + }, { path: "sso", component: SsoComponent, diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index 3665df7decc..f7539d6fa6e 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -20,6 +20,7 @@ import { EnvironmentComponent } from "../auth/popup/environment.component"; import { HintComponent } from "../auth/popup/hint.component"; import { HomeComponent } from "../auth/popup/home.component"; import { LockComponent } from "../auth/popup/lock.component"; +import { LoginDecryptionOptionsComponent } from "../auth/popup/login-decryption-options/login-decryption-options.component"; import { LoginWithDeviceComponent } from "../auth/popup/login-with-device.component"; import { LoginComponent } from "../auth/popup/login.component"; import { RegisterComponent } from "../auth/popup/register.component"; @@ -121,6 +122,7 @@ import "../platform/popup/locales"; LockComponent, LoginComponent, LoginWithDeviceComponent, + LoginDecryptionOptionsComponent, OptionsComponent, GeneratorComponent, PasswordGeneratorHistoryComponent, diff --git a/apps/browser/src/popup/components/user-verification.component.html b/apps/browser/src/popup/components/user-verification.component.html index 8d7f1ed8706..25bd81cf394 100644 --- a/apps/browser/src/popup/components/user-verification.component.html +++ b/apps/browser/src/popup/components/user-verification.component.html @@ -1,4 +1,4 @@ - +
- +
- +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+

{{ "loggingInAs" | i18n }} {{ data.userEmail }}

+ {{ "notYou" | i18n }} +
+ +
+
diff --git a/apps/desktop/src/auth/login/login-decryption-options/login-decryption-options.component.ts b/apps/desktop/src/auth/login/login-decryption-options/login-decryption-options.component.ts new file mode 100644 index 00000000000..f64ec977ce7 --- /dev/null +++ b/apps/desktop/src/auth/login/login-decryption-options/login-decryption-options.component.ts @@ -0,0 +1,19 @@ +import { Component } from "@angular/core"; + +import { BaseLoginDecryptionOptionsComponent } from "@bitwarden/angular/auth/components/base-login-decryption-options.component"; + +@Component({ + selector: "desktop-login-decryption-options", + templateUrl: "login-decryption-options.component.html", +}) +export class LoginDecryptionOptionsComponent extends BaseLoginDecryptionOptionsComponent { + override async createUser(): Promise { + try { + await super.createUser(); + this.messagingService.send("redrawMenu"); + await this.router.navigate(["/vault"]); + } catch (error) { + this.validationService.showError(error); + } + } +} diff --git a/apps/desktop/src/auth/login/login-with-device.component.html b/apps/desktop/src/auth/login/login-with-device.component.html index 29fb1034942..a81c92ad1d1 100644 --- a/apps/desktop/src/auth/login/login-with-device.component.html +++ b/apps/desktop/src/auth/login/login-with-device.component.html @@ -1,40 +1,72 @@
Bitwarden -

{{ "logInInitiated" | i18n }}

-
-
-
-
-

{{ "notificationSentDevice" | i18n }}

-

- {{ "fingerprintMatchInfo" | i18n }} -

-
+ +

{{ "loginInitiated" | i18n }}

-
-

{{ "fingerprintPhraseHeader" | i18n }}

- {{ fingerprintPhrase }} -
+
+
+
+
+

{{ "notificationSentDevice" | i18n }}

+

+ {{ "fingerprintMatchInfo" | i18n }} +

+
- +
+

{{ "fingerprintPhraseHeader" | i18n }}

+ {{ fingerprintPhrase }} +
-
-

- {{ "needAnotherOption" | i18n }} - - {{ "viewAllLoginOptions" | i18n }} - -

+ + +
+

+ {{ "needAnotherOption" | i18n }} + + {{ "viewAllLoginOptions" | i18n }} + +

+
-
+
+ + +

{{ "adminApprovalRequested" | i18n }}

+ +
+
+
+
+

{{ "adminApprovalRequestSentToAdmins" | i18n }}

+

{{ "youWillBeNotifiedOnceApproved" | i18n }}

+
+ +
+

{{ "fingerprintPhraseHeader" | i18n }}

+ {{ fingerprintPhrase }} +
+ +
+

+ {{ "troubleLoggingIn" | i18n }} + + {{ "viewAllLoginOptions" | i18n }} + +

+
+
+
+
+
diff --git a/apps/desktop/src/auth/login/login-with-device.component.ts b/apps/desktop/src/auth/login/login-with-device.component.ts index 3b3ee83ae49..daca2d19936 100644 --- a/apps/desktop/src/auth/login/login-with-device.component.ts +++ b/apps/desktop/src/auth/login/login-with-device.component.ts @@ -1,3 +1,4 @@ +import { Location } from "@angular/common"; import { Component, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; import { Router } from "@angular/router"; @@ -5,7 +6,9 @@ import { LoginWithDeviceComponent as BaseLoginWithDeviceComponent } from "@bitwa import { ModalService } from "@bitwarden/angular/services/modal.service"; import { AnonymousHubService } from "@bitwarden/common/abstractions/anonymousHub.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -50,7 +53,10 @@ export class LoginWithDeviceComponent private modalService: ModalService, syncService: SyncService, stateService: StateService, - loginService: LoginService + loginService: LoginService, + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, + authReqCryptoService: AuthRequestCryptoServiceAbstraction, + private location: Location ) { super( router, @@ -67,7 +73,9 @@ export class LoginWithDeviceComponent anonymousHubService, validationService, stateService, - loginService + loginService, + deviceTrustCryptoService, + authReqCryptoService ); super.onSuccessfulLogin = () => { @@ -100,7 +108,7 @@ export class LoginWithDeviceComponent super.ngOnDestroy(); } - goToLogin() { - this.router.navigate(["/login"]); + back() { + this.location.back(); } } diff --git a/apps/desktop/src/auth/login/login.component.ts b/apps/desktop/src/auth/login/login.component.ts index 00aa0300f61..45b330f6dae 100644 --- a/apps/desktop/src/auth/login/login.component.ts +++ b/apps/desktop/src/auth/login/login.component.ts @@ -7,8 +7,8 @@ import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; diff --git a/apps/desktop/src/auth/login/login.module.ts b/apps/desktop/src/auth/login/login.module.ts index 35ad83e9db0..9fb2b28915a 100644 --- a/apps/desktop/src/auth/login/login.module.ts +++ b/apps/desktop/src/auth/login/login.module.ts @@ -5,12 +5,18 @@ import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components import { SharedModule } from "../../app/shared/shared.module"; +import { LoginDecryptionOptionsComponent } from "./login-decryption-options/login-decryption-options.component"; import { LoginWithDeviceComponent } from "./login-with-device.component"; import { LoginComponent } from "./login.component"; @NgModule({ imports: [SharedModule, RouterModule], - declarations: [LoginComponent, LoginWithDeviceComponent, EnvironmentSelectorComponent], + declarations: [ + LoginComponent, + LoginWithDeviceComponent, + EnvironmentSelectorComponent, + LoginDecryptionOptionsComponent, + ], exports: [LoginComponent, LoginWithDeviceComponent], }) export class LoginModule {} diff --git a/apps/desktop/src/auth/sso.component.ts b/apps/desktop/src/auth/sso.component.ts index 75f380b0ed3..22badf9d69d 100644 --- a/apps/desktop/src/auth/sso.component.ts +++ b/apps/desktop/src/auth/sso.component.ts @@ -4,6 +4,7 @@ import { ActivatedRoute, Router } from "@angular/router"; import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -30,7 +31,8 @@ export class SsoComponent extends BaseSsoComponent { cryptoFunctionService: CryptoFunctionService, environmentService: EnvironmentService, passwordGenerationService: PasswordGenerationServiceAbstraction, - logService: LogService + logService: LogService, + configService: ConfigServiceAbstraction ) { super( authService, @@ -43,11 +45,17 @@ export class SsoComponent extends BaseSsoComponent { cryptoFunctionService, environmentService, passwordGenerationService, - logService + logService, + configService ); - super.onSuccessfulLogin = () => { - return syncService.fullSync(true); + super.onSuccessfulLogin = async () => { + syncService.fullSync(true); }; + + super.onSuccessfulLoginTde = async () => { + syncService.fullSync(true); + }; + this.redirectUri = "bitwarden://sso-callback"; this.clientId = "desktop"; } diff --git a/apps/desktop/src/auth/two-factor.component.ts b/apps/desktop/src/auth/two-factor.component.ts index ee3764027a5..bf3545820b9 100644 --- a/apps/desktop/src/auth/two-factor.component.ts +++ b/apps/desktop/src/auth/two-factor.component.ts @@ -1,7 +1,8 @@ -import { Component, ViewChild, ViewContainerRef } from "@angular/core"; +import { Component, Inject, ViewChild, ViewContainerRef } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { TwoFactorComponent as BaseTwoFactorComponent } from "@bitwarden/angular/auth/components/two-factor.component"; +import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; @@ -9,6 +10,7 @@ import { LoginService } from "@bitwarden/common/auth/abstractions/login.service" import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -43,7 +45,9 @@ export class TwoFactorComponent extends BaseTwoFactorComponent { logService: LogService, twoFactorService: TwoFactorService, appIdService: AppIdService, - loginService: LoginService + loginService: LoginService, + configService: ConfigServiceAbstraction, + @Inject(WINDOW) protected win: Window ) { super( authService, @@ -51,18 +55,22 @@ export class TwoFactorComponent extends BaseTwoFactorComponent { i18nService, apiService, platformUtilsService, - window, + win, environmentService, stateService, route, logService, twoFactorService, appIdService, - loginService + loginService, + configService ); - super.onSuccessfulLogin = () => { - this.loginService.clearValues(); - return syncService.fullSync(true); + super.onSuccessfulLogin = async () => { + syncService.fullSync(true); + }; + + super.onSuccessfulLoginTde = async () => { + syncService.fullSync(true); }; } diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index ab8446ee465..eba53b45b38 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -1492,6 +1492,9 @@ "vaultTimeoutActionLogOutDesc": { "message": "Re-authentication is required to access your vault again." }, + "unlockMethodNeededToChangeTimeoutActionDesc": { + "message": "Set up an unlock method to change your vault timeout action." + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccesible by" @@ -2106,8 +2109,8 @@ "logInWithAnotherDevice": { "message": "Log in with another device" }, - "logInInitiated": { - "message": "Log in initiated" + "loginInitiated": { + "message": "Login initiated" }, "notificationSentDevice": { "message": "A notification has been sent to your device." @@ -2246,6 +2249,34 @@ "windowsBiometricUpdateWarningTitle": { "message": "Recommended Settings Update" }, + "deviceApprovalRequired": { + "message": "Device approval required. Select an approval option below:" + }, + "rememberThisDevice": { + "message": "Remember this device" + }, + "uncheckIfPublicDevice": { + "message": "Uncheck if using a public device" + }, + "approveFromYourOtherDevice": { + "message": "Approve from your other device" + }, + "requestAdminApproval": { + "message": "Request admin approval" + }, + "approveWithMasterPassword": { + "message": "Approve with master password" + }, + "region": { + "message": "Region" + }, + "ssoIdentifierRequired": { + "message": "Organization SSO identifier is required." + }, + "eu": { + "message": "EU", + "description": "European Union" + }, "loggingInOn": { "message": "Logging in on" }, @@ -2260,5 +2291,29 @@ }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." + }, + "accountSuccessfullyCreated": { + "message": "Account successfully created!" + }, + "adminApprovalRequested": { + "message": "Admin approval requested" + }, + "adminApprovalRequestSentToAdmins": { + "message": "Your request has been sent to your admin." + }, + "youWillBeNotifiedOnceApproved": { + "message": "You will be notified once approved." + }, + "troubleLoggingIn": { + "message": "Trouble logging in?" + }, + "loginApproved": { + "message": "Login approved" + }, + "userEmailMissing": { + "message": "User email missing" + }, + "deviceTrusted": { + "message": "Device trusted" } } diff --git a/apps/desktop/src/main/menu/menu.account.ts b/apps/desktop/src/main/menu/menu.account.ts index 10a6d6d77d5..5060a4934c5 100644 --- a/apps/desktop/src/main/menu/menu.account.ts +++ b/apps/desktop/src/main/menu/menu.account.ts @@ -15,14 +15,15 @@ export class AccountMenu implements IMenubarMenu { } get items(): MenuItemConstructorOptions[] { - return [ - this.premiumMembership, - this.changeMasterPassword, - this.twoStepLogin, - this.fingerprintPhrase, - this.separator, - this.deleteAccount, - ]; + const items = [this.premiumMembership]; + if (this._hasMasterPassword) { + items.push(this.changeMasterPassword); + } + items.push(this.twoStepLogin); + items.push(this.fingerprintPhrase); + items.push(this.separator); + items.push(this.deleteAccount); + return items; } private readonly _i18nService: I18nService; @@ -30,19 +31,22 @@ export class AccountMenu implements IMenubarMenu { private readonly _webVaultUrl: string; private readonly _window: BrowserWindow; private readonly _isLocked: boolean; + private readonly _hasMasterPassword: boolean; constructor( i18nService: I18nService, messagingService: MessagingService, webVaultUrl: string, window: BrowserWindow, - isLocked: boolean + isLocked: boolean, + hasMasterPassword: boolean ) { this._i18nService = i18nService; this._messagingService = messagingService; this._webVaultUrl = webVaultUrl; this._window = window; this._isLocked = isLocked; + this._hasMasterPassword = hasMasterPassword; } private get premiumMembership(): MenuItemConstructorOptions { diff --git a/apps/desktop/src/main/menu/menu.bitwarden.ts b/apps/desktop/src/main/menu/menu.bitwarden.ts index 3c3a16702ee..6873f679de7 100644 --- a/apps/desktop/src/main/menu/menu.bitwarden.ts +++ b/apps/desktop/src/main/menu/menu.bitwarden.ts @@ -52,9 +52,10 @@ export class BitwardenMenu extends FirstMenu implements IMenubarMenu { updater: UpdaterMain, window: BrowserWindow, accounts: { [userId: string]: MenuAccount }, - isLocked: boolean + isLocked: boolean, + isLockable: boolean ) { - super(i18nService, messagingService, updater, window, accounts, isLocked); + super(i18nService, messagingService, updater, window, accounts, isLocked, isLockable); } private get aboutBitwarden(): MenuItemConstructorOptions { diff --git a/apps/desktop/src/main/menu/menu.file.ts b/apps/desktop/src/main/menu/menu.file.ts index 618acdc7fe1..173b6066aba 100644 --- a/apps/desktop/src/main/menu/menu.file.ts +++ b/apps/desktop/src/main/menu/menu.file.ts @@ -51,9 +51,10 @@ export class FileMenu extends FirstMenu implements IMenubarMenu { updater: UpdaterMain, window: BrowserWindow, accounts: { [userId: string]: MenuAccount }, - isLocked: boolean + isLocked: boolean, + isLockable: boolean ) { - super(i18nService, messagingService, updater, window, accounts, isLocked); + super(i18nService, messagingService, updater, window, accounts, isLocked, isLockable); } private get addNewLogin(): MenuItemConstructorOptions { diff --git a/apps/desktop/src/main/menu/menu.first.ts b/apps/desktop/src/main/menu/menu.first.ts index 805956f2632..b164e280d0b 100644 --- a/apps/desktop/src/main/menu/menu.first.ts +++ b/apps/desktop/src/main/menu/menu.first.ts @@ -9,33 +9,24 @@ import { UpdaterMain } from "../updater.main"; import { MenuAccount } from "./menu.updater"; export class FirstMenu { - protected readonly _i18nService: I18nService; - protected readonly _updater: UpdaterMain; - protected readonly _messagingService: MessagingService; - protected readonly _accounts: { [userId: string]: MenuAccount }; - protected readonly _window: BrowserWindow; - protected readonly _isLocked: boolean; - constructor( - i18nService: I18nService, - messagingService: MessagingService, - updater: UpdaterMain, - window: BrowserWindow, - accounts: { [userId: string]: MenuAccount }, - isLocked: boolean - ) { - this._i18nService = i18nService; - this._updater = updater; - this._messagingService = messagingService; - this._window = window; - this._accounts = accounts; - this._isLocked = isLocked; - } + protected readonly _i18nService: I18nService, + protected readonly _messagingService: MessagingService, + protected readonly _updater: UpdaterMain, + protected readonly _window: BrowserWindow, + protected readonly _accounts: { [userId: string]: MenuAccount }, + protected readonly _isLocked: boolean, + protected readonly _isLockable: boolean + ) {} protected get hasAccounts(): boolean { return this._accounts != null && Object.keys(this._accounts).length > 0; } + protected get hasLockableAccounts(): boolean { + return this._accounts != null && Object.values(this._accounts).some((a) => a.isLockable); + } + protected get checkForUpdates(): MenuItemConstructorOptions { return { id: "checkForUpdates", @@ -66,23 +57,29 @@ export class FirstMenu { id: "lock", label: this.localize("lockVault"), submenu: this.lockSubmenu, - enabled: this.hasAccounts, + enabled: this.hasLockableAccounts, }; } protected get lockSubmenu(): MenuItemConstructorOptions[] { const value: MenuItemConstructorOptions[] = []; for (const userId in this._accounts) { - if (userId == null) { + if (!userId) { + continue; + } + + const account = this._accounts[userId]; + + if (account == null || !account.isLockable) { continue; } value.push({ - label: this._accounts[userId].email, - id: `lockNow_${this._accounts[userId].userId}`, - click: () => this.sendMessage("lockVault", { userId: this._accounts[userId].userId }), - enabled: !this._accounts[userId].isLocked, - visible: this._accounts[userId].isAuthenticated, + label: account.email, + id: `lockNow_${account.userId}`, + click: () => this.sendMessage("lockVault", { userId: account.userId }), + enabled: !account.isLocked, + visible: account.isAuthenticated, }); } return value; diff --git a/apps/desktop/src/main/menu/menu.updater.ts b/apps/desktop/src/main/menu/menu.updater.ts index 75454a56f86..170804cae25 100644 --- a/apps/desktop/src/main/menu/menu.updater.ts +++ b/apps/desktop/src/main/menu/menu.updater.ts @@ -1,5 +1,4 @@ export class MenuUpdateRequest { - hideChangeMasterPassword: boolean; activeUserId: string; accounts: { [userId: string]: MenuAccount }; } @@ -7,6 +6,8 @@ export class MenuUpdateRequest { export class MenuAccount { isAuthenticated: boolean; isLocked: boolean; + isLockable: boolean; userId: string; email: string; + hasMasterPassword: boolean; } diff --git a/apps/desktop/src/main/menu/menubar.ts b/apps/desktop/src/main/menu/menubar.ts index 6ac28a1c8db..c3f37ecbffb 100644 --- a/apps/desktop/src/main/menu/menubar.ts +++ b/apps/desktop/src/main/menu/menubar.ts @@ -62,6 +62,10 @@ export class Menubar { isLocked = updateRequest.accounts[updateRequest.activeUserId]?.isLocked ?? true; } + const isLockable = !isLocked && updateRequest?.accounts[updateRequest.activeUserId]?.isLockable; + const hasMasterPassword = + updateRequest?.accounts[updateRequest.activeUserId]?.hasMasterPassword ?? false; + this.items = [ new FileMenu( i18nService, @@ -69,11 +73,19 @@ export class Menubar { updaterMain, windowMain.win, updateRequest?.accounts, - isLocked + isLocked, + isLockable ), new EditMenu(i18nService, messagingService, isLocked), new ViewMenu(i18nService, messagingService, isLocked), - new AccountMenu(i18nService, messagingService, webVaultUrl, windowMain.win, isLocked), + new AccountMenu( + i18nService, + messagingService, + webVaultUrl, + windowMain.win, + isLocked, + hasMasterPassword + ), new WindowMenu(i18nService, messagingService, windowMain), new HelpMenu( i18nService, @@ -91,7 +103,8 @@ export class Menubar { updaterMain, windowMain.win, updateRequest?.accounts, - isLocked + isLocked, + isLockable ), ], ...this.items, diff --git a/apps/desktop/src/platform/services/electron-crypto.service.spec.ts b/apps/desktop/src/platform/services/electron-crypto.service.spec.ts new file mode 100644 index 00000000000..92f9391b131 --- /dev/null +++ b/apps/desktop/src/platform/services/electron-crypto.service.spec.ts @@ -0,0 +1,91 @@ +import { mock, mockReset } from "jest-mock-extended"; + +import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { + SymmetricCryptoKey, + UserKey, +} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { CsprngArray } from "@bitwarden/common/types/csprng"; + +import { ElectronCryptoService } from "./electron-crypto.service"; +import { ElectronStateService } from "./electron-state.service.abstraction"; + +describe("electronCryptoService", () => { + let electronCryptoService: ElectronCryptoService; + + const cryptoFunctionService = mock(); + const encryptService = mock(); + const platformUtilService = mock(); + const logService = mock(); + const stateService = mock(); + + const mockUserId = "mock user id"; + + beforeEach(() => { + mockReset(cryptoFunctionService); + mockReset(encryptService); + mockReset(platformUtilService); + mockReset(logService); + mockReset(stateService); + + electronCryptoService = new ElectronCryptoService( + cryptoFunctionService, + encryptService, + platformUtilService, + logService, + stateService + ); + }); + + it("instantiates", () => { + expect(electronCryptoService).not.toBeFalsy(); + }); + + describe("setUserKey", () => { + let mockUserKey: UserKey; + + beforeEach(() => { + const mockRandomBytes = new Uint8Array(64) as CsprngArray; + mockUserKey = new SymmetricCryptoKey(mockRandomBytes) as UserKey; + }); + + describe("Biometric Key refresh", () => { + it("sets an Biometric key if getBiometricUnlock is true and the platform supports secure storage", async () => { + stateService.getBiometricUnlock.mockResolvedValue(true); + platformUtilService.supportsSecureStorage.mockReturnValue(true); + stateService.getBiometricRequirePasswordOnStart.mockResolvedValue(false); + + await electronCryptoService.setUserKey(mockUserKey, mockUserId); + + expect(stateService.setUserKeyBiometric).toHaveBeenCalledWith( + expect.objectContaining({ key: expect.any(String), clientEncKeyHalf: null }), + { + userId: mockUserId, + } + ); + }); + + it("clears the Biometric key if getBiometricUnlock is false or the platform does not support secure storage", async () => { + stateService.getBiometricUnlock.mockResolvedValue(true); + platformUtilService.supportsSecureStorage.mockReturnValue(false); + + await electronCryptoService.setUserKey(mockUserKey, mockUserId); + + expect(stateService.setUserKeyBiometric).toHaveBeenCalledWith(null, { + userId: mockUserId, + }); + }); + + it("clears the old deprecated Biometric key whenever a User Key is set", async () => { + await electronCryptoService.setUserKey(mockUserKey, mockUserId); + + expect(stateService.setCryptoMasterKeyBiometric).toHaveBeenCalledWith(null, { + userId: mockUserId, + }); + }); + }); + }); +}); diff --git a/apps/desktop/src/platform/services/electron-crypto.service.ts b/apps/desktop/src/platform/services/electron-crypto.service.ts index 1fb90e52ca4..e21d2001977 100644 --- a/apps/desktop/src/platform/services/electron-crypto.service.ts +++ b/apps/desktop/src/platform/services/electron-crypto.service.ts @@ -4,7 +4,12 @@ import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt. import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { + MasterKey, + SymmetricCryptoKey, + UserKey, +} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { CryptoService } from "@bitwarden/common/platform/services/crypto.service"; import { CsprngString } from "@bitwarden/common/types/csprng"; @@ -21,36 +26,80 @@ export class ElectronCryptoService extends CryptoService { super(cryptoFunctionService, encryptService, platformUtilsService, logService, stateService); } - protected override async storeKey(key: SymmetricCryptoKey, userId?: string) { - await super.storeKey(key, userId); + override async hasUserKeyStored(keySuffix: KeySuffixOptions, userId?: string): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3474) + const oldKey = await this.stateService.hasCryptoMasterKeyBiometric({ userId: userId }); + return oldKey || (await this.stateService.hasUserKeyBiometric({ userId: userId })); + } + return super.hasUserKeyStored(keySuffix, userId); + } + + override async clearStoredUserKey(keySuffix: KeySuffixOptions, userId?: string): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + this.stateService.setUserKeyBiometric(null, { userId: userId }); + this.clearDeprecatedKeys(KeySuffixOptions.Biometric, userId); + return; + } + super.clearStoredUserKey(keySuffix, userId); + } + + protected override async storeAdditionalKeys(key: UserKey, userId?: string) { + await super.storeAdditionalKeys(key, userId); const storeBiometricKey = await this.shouldStoreKey(KeySuffixOptions.Biometric, userId); if (storeBiometricKey) { await this.storeBiometricKey(key, userId); } else { - await this.stateService.setCryptoMasterKeyBiometric(null, { userId: userId }); + await this.stateService.setUserKeyBiometric(null, { userId: userId }); } + await this.clearDeprecatedKeys(KeySuffixOptions.Biometric, userId); } - protected async storeBiometricKey(key: SymmetricCryptoKey, userId?: string): Promise { + protected override async getKeyFromStorage( + keySuffix: KeySuffixOptions, + userId?: string + ): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + await this.migrateBiometricKeyIfNeeded(userId); + const userKey = await this.stateService.getUserKeyBiometric({ userId: userId }); + return new SymmetricCryptoKey(Utils.fromB64ToArray(userKey)) as UserKey; + } + return await super.getKeyFromStorage(keySuffix, userId); + } + + protected async storeBiometricKey(key: UserKey, userId?: string): Promise { let clientEncKeyHalf: CsprngString = null; if (await this.stateService.getBiometricRequirePasswordOnStart({ userId })) { clientEncKeyHalf = await this.getBiometricEncryptionClientKeyHalf(userId); } - await this.stateService.setCryptoMasterKeyBiometric( + await this.stateService.setUserKeyBiometric( { key: key.keyB64, clientEncKeyHalf }, { userId: userId } ); } + protected async shouldStoreKey(keySuffix: KeySuffixOptions, userId?: string): Promise { + if (keySuffix === KeySuffixOptions.Biometric) { + const biometricUnlock = await this.stateService.getBiometricUnlock({ userId: userId }); + return biometricUnlock && this.platformUtilService.supportsSecureStorage(); + } + return await super.shouldStoreKey(keySuffix, userId); + } + + protected override async clearAllStoredUserKeys(userId?: string): Promise { + await this.stateService.setUserKeyBiometric(null, { userId: userId }); + super.clearAllStoredUserKeys(userId); + } + private async getBiometricEncryptionClientKeyHalf(userId?: string): Promise { try { let biometricKey = await this.stateService .getBiometricEncryptionClientKeyHalf({ userId }) .then((result) => result?.decrypt(null /* user encrypted */)) .then((result) => result as CsprngString); - const userKey = await this.getKeyForUserEncryption(); + const userKey = await this.getUserKeyWithLegacySupport(); if (biometricKey == null && userKey != null) { const keyBytes = await this.cryptoFunctionService.randomBytes(32); biometricKey = Utils.fromBufferToUtf8(keyBytes) as CsprngString; @@ -63,4 +112,34 @@ export class ElectronCryptoService extends CryptoService { return null; } } + + // --LEGACY METHODS-- + // We previously used the master key for additional keys, but now we use the user key. + // These methods support migrating the old keys to the new ones. + // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3475) + + override async clearDeprecatedKeys(keySuffix: KeySuffixOptions, userId?: string) { + if (keySuffix === KeySuffixOptions.Biometric) { + await this.stateService.setCryptoMasterKeyBiometric(null, { userId: userId }); + } + + super.clearDeprecatedKeys(keySuffix, userId); + } + + private async migrateBiometricKeyIfNeeded(userId?: string) { + if (await this.stateService.hasCryptoMasterKeyBiometric({ userId })) { + const oldBiometricKey = await this.stateService.getCryptoMasterKeyBiometric({ userId }); + // decrypt + const masterKey = new SymmetricCryptoKey(Utils.fromB64ToArray(oldBiometricKey)) as MasterKey; + let encUserKey = await this.stateService.getEncryptedCryptoSymmetricKey(); + encUserKey = encUserKey ?? (await this.stateService.getMasterKeyEncryptedUserKey()); + if (!encUserKey) { + throw new Error("No user key found during biometric migration"); + } + const userKey = await this.decryptUserKeyWithMasterKey(masterKey, new EncString(encUserKey)); + // migrate + await this.storeBiometricKey(userKey, userId); + await this.stateService.setCryptoMasterKeyBiometric(null, { userId }); + } + } } diff --git a/apps/desktop/src/platform/services/electron-state.service.ts b/apps/desktop/src/platform/services/electron-state.service.ts index 334cab96698..0503aeb52a3 100644 --- a/apps/desktop/src/platform/services/electron-state.service.ts +++ b/apps/desktop/src/platform/services/electron-state.service.ts @@ -98,6 +98,10 @@ export class ElectronStateService options ); + if (b64DeviceKey == null) { + return null; + } + return new SymmetricCryptoKey(Utils.fromB64ToArray(b64DeviceKey)) as DeviceKey; } diff --git a/apps/desktop/src/scss/pages.scss b/apps/desktop/src/scss/pages.scss index 5b3ad4a8583..fda75e834f3 100644 --- a/apps/desktop/src/scss/pages.scss +++ b/apps/desktop/src/scss/pages.scss @@ -5,7 +5,8 @@ #lock-page, #sso-page, #set-password-page, -#remove-password-page { +#remove-password-page, +#login-decryption-options-page { display: flex; justify-content: center; align-items: center; @@ -53,7 +54,8 @@ #hint-page, #two-factor-page, #lock-page, -#update-temp-password-page { +#update-temp-password-page, +#login-decryption-options-page { .content { width: 325px; transition: width 0.25s linear; @@ -189,7 +191,8 @@ } #login-page, -#login-with-device-page { +#login-with-device-page, +#login-decryption-options-page { flex-direction: column; justify-content: unset; padding-top: 20px; @@ -273,3 +276,14 @@ } } } + +#login-decryption-options-page { + .standard-bottom-margin { + margin-bottom: 20px; + } + + #rememberThisDeviceHintText { + font-size: $font-size-small; + color: $text-muted; + } +} diff --git a/apps/desktop/src/services/native-message-handler.service.ts b/apps/desktop/src/services/native-message-handler.service.ts index 644dfe8f906..9f5f1d460df 100644 --- a/apps/desktop/src/services/native-message-handler.service.ts +++ b/apps/desktop/src/services/native-message-handler.service.ts @@ -8,7 +8,7 @@ import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.se import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { StateService } from "@bitwarden/common/platform/services/state.service"; @@ -144,7 +144,9 @@ export class NativeMessageHandlerService { } private async handleEncryptedMessage(message: EncryptedMessage) { - message.encryptedCommand = EncString.fromJSON(message.encryptedCommand.toString()); + message.encryptedCommand = EncString.fromJSON( + message.encryptedCommand.toString() as EncryptedString + ); const decryptedCommandData = await this.decryptPayload(message); const { command } = decryptedCommandData; diff --git a/apps/desktop/src/services/native-messaging.service.ts b/apps/desktop/src/services/native-messaging.service.ts index 7647410fd75..3928778f313 100644 --- a/apps/desktop/src/services/native-messaging.service.ts +++ b/apps/desktop/src/services/native-messaging.service.ts @@ -136,14 +136,23 @@ export class NativeMessagingService { }); } - const key = await this.cryptoService.getKeyFromStorage( + const userKey = await this.cryptoService.getUserKeyFromStorage( KeySuffixOptions.Biometric, message.userId ); + const masterKey = await this.cryptoService.getMasterKey(message.userId); - if (key != null) { + if (userKey != null) { + // we send the master key still for backwards compatibility + // with older browser extensions + // TODO: Remove after 2023.10 release (https://bitwarden.atlassian.net/browse/PM-3472) this.send( - { command: "biometricUnlock", response: "unlocked", keyB64: key.keyB64 }, + { + command: "biometricUnlock", + response: "unlocked", + keyB64: masterKey?.keyB64, + userKeyB64: userKey.keyB64, + }, appId ); } else { diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.ts index 31ced8aee10..ae754faabe7 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm.component.ts @@ -7,6 +7,7 @@ import { OrganizationUserStatusType } from "@bitwarden/common/admin-console/enum import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { BulkUserDetails } from "./bulk-status.component"; @@ -98,7 +99,7 @@ export class BulkConfirmComponent implements OnInit { ); } - protected getCryptoKey() { + protected getCryptoKey(): Promise { return this.cryptoService.getOrgKey(this.organizationId); } diff --git a/apps/web/src/app/admin-console/organizations/members/components/reset-password.component.ts b/apps/web/src/app/admin-console/organizations/members/components/reset-password.component.ts index 5d2a5f54bad..7d0fae37e0a 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/reset-password.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/reset-password.component.ts @@ -22,7 +22,10 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { + SymmetricCryptoKey, + UserKey, +} from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { DialogService } from "@bitwarden/components"; @@ -171,26 +174,32 @@ export class ResetPasswordComponent implements OnInit, OnDestroy { orgSymKey ); - // Decrypt User's Reset Password Key to get EncKey + // Decrypt User's Reset Password Key to get UserKey const decValue = await this.cryptoService.rsaDecrypt(resetPasswordKey, decPrivateKey); - const userEncKey = new SymmetricCryptoKey(decValue); + const existingUserKey = new SymmetricCryptoKey(decValue) as UserKey; - // Create new key and hash new password - const newKey = await this.cryptoService.makeKey( + // Create new master key and hash new password + const newMasterKey = await this.cryptoService.makeMasterKey( this.newPassword, this.email.trim().toLowerCase(), kdfType, new KdfConfig(kdfIterations, kdfMemory, kdfParallelism) ); - const newPasswordHash = await this.cryptoService.hashPassword(this.newPassword, newKey); + const newMasterKeyHash = await this.cryptoService.hashMasterKey( + this.newPassword, + newMasterKey + ); - // Create new encKey for the User - const newEncKey = await this.cryptoService.remakeEncKey(newKey, userEncKey); + // Create new encrypted user key for the User + const newUserKey = await this.cryptoService.encryptUserKeyWithMasterKey( + newMasterKey, + existingUserKey + ); // Create request const request = new OrganizationUserResetPasswordRequest(); - request.key = newEncKey[1].encryptedString; - request.newMasterPasswordHash = newPasswordHash; + request.key = newUserKey[1].encryptedString; + request.newMasterPasswordHash = newMasterKeyHash; // Change user's password return this.organizationUserService.putOrganizationUserResetPassword( diff --git a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts index dca1b18530a..c4ca1dc241f 100644 --- a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts +++ b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts @@ -1,7 +1,7 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; -import { AuthGuard } from "@bitwarden/angular/auth/guards/auth.guard"; +import { AuthGuard } from "@bitwarden/angular/auth/guards"; import { canAccessOrgAdmin, canAccessGroupsTab, diff --git a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts index a533967d8f5..535d7d375ab 100644 --- a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts +++ b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts @@ -58,8 +58,8 @@ export class EnrollMasterPasswordReset { const publicKey = Utils.fromB64ToArray(orgKeys.publicKey); // RSA Encrypt user's encKey.key with organization public key - const encKey = await this.cryptoService.getEncKey(); - const encryptedKey = await this.cryptoService.rsaEncrypt(encKey.key, publicKey); + const userKey = await this.cryptoService.getUserKey(); + const encryptedKey = await this.cryptoService.rsaEncrypt(userKey.key, publicKey); keyString = encryptedKey.encryptedString; toastStringRef = "enrollPasswordResetSuccess"; diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index 8ce51df9e6f..3066dbe093c 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -11,7 +11,7 @@ import { EventUploadService } from "@bitwarden/common/abstractions/event/event-u import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; diff --git a/apps/web/src/app/auth/accept-organization.component.ts b/apps/web/src/app/auth/accept-organization.component.ts index bdc3511f760..ef2dda138dd 100644 --- a/apps/web/src/app/auth/accept-organization.component.ts +++ b/apps/web/src/app/auth/accept-organization.component.ts @@ -18,6 +18,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { OrgKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { BaseAcceptComponent } from "../common/base.accept.component"; @@ -108,16 +109,14 @@ export class AcceptOrganizationComponent extends BaseAcceptComponent { const request = new OrganizationUserAcceptInitRequest(); request.token = qParams.token; - const [encryptedOrgShareKey, orgShareKey] = await this.cryptoService.makeShareKey(); - const [orgPublicKey, encryptedOrgPrivateKey] = await this.cryptoService.makeKeyPair( - orgShareKey - ); + const [encryptedOrgKey, orgKey] = await this.cryptoService.makeOrgKey(); + const [orgPublicKey, encryptedOrgPrivateKey] = await this.cryptoService.makeKeyPair(orgKey); const collection = await this.cryptoService.encrypt( this.i18nService.t("defaultCollection"), - orgShareKey + orgKey ); - request.key = encryptedOrgShareKey.encryptedString; + request.key = encryptedOrgKey.encryptedString; request.keys = new OrganizationKeysRequest( orgPublicKey, encryptedOrgPrivateKey.encryptedString @@ -141,8 +140,8 @@ export class AcceptOrganizationComponent extends BaseAcceptComponent { const publicKey = Utils.fromB64ToArray(response.publicKey); // RSA Encrypt user's encKey.key with organization public key - const encKey = await this.cryptoService.getEncKey(); - const encryptedKey = await this.cryptoService.rsaEncrypt(encKey.key, publicKey); + const userKey = await this.cryptoService.getUserKey(); + const encryptedKey = await this.cryptoService.rsaEncrypt(userKey.key, publicKey); // Add reset password key to accept request request.resetPasswordKey = encryptedKey.encryptedString; diff --git a/apps/web/src/app/auth/lock.component.ts b/apps/web/src/app/auth/lock.component.ts index 185ce241d42..1cb97fbd558 100644 --- a/apps/web/src/app/auth/lock.component.ts +++ b/apps/web/src/app/auth/lock.component.ts @@ -3,11 +3,12 @@ import { Router } from "@angular/router"; import { LockComponent as BaseLockComponent } from "@bitwarden/angular/auth/components/lock.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -38,12 +39,13 @@ export class LockComponent extends BaseLockComponent { stateService: StateService, apiService: ApiService, logService: LogService, - keyConnectorService: KeyConnectorService, ngZone: NgZone, policyApiService: PolicyApiServiceAbstraction, policyService: InternalPolicyService, passwordStrengthService: PasswordStrengthServiceAbstraction, - dialogService: DialogService + dialogService: DialogService, + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, + userVerificationService: UserVerificationService ) { super( router, @@ -57,12 +59,13 @@ export class LockComponent extends BaseLockComponent { stateService, apiService, logService, - keyConnectorService, ngZone, policyApiService, policyService, passwordStrengthService, - dialogService + dialogService, + deviceTrustCryptoService, + userVerificationService ); } diff --git a/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.html b/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.html new file mode 100644 index 00000000000..ed59cc12388 --- /dev/null +++ b/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.html @@ -0,0 +1,105 @@ +
+
+
+ +
+ + +

+ + {{ "loading" | i18n }} +

+
+ +
+ +

{{ "loginInitiated" | i18n }}

+ +

+ {{ "deviceApprovalRequired" | i18n }} +

+ +
+ + + {{ "rememberThisDevice" | i18n }} + {{ "uncheckIfPublicDevice" | i18n }} + +
+ +
+ + + + + +
+
+ + +

{{ "loggedInExclamation" | i18n }}

+ +
+ + + {{ "rememberThisDevice" | i18n }} + {{ "uncheckIfPublicDevice" | i18n }} + +
+ + +
+ +
+ +
+

{{ "loggingInAs" | i18n }} {{ data.userEmail }}

+ {{ "notYou" | i18n }} +
+
+
+
diff --git a/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.ts b/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.ts new file mode 100644 index 00000000000..2c97bd227f9 --- /dev/null +++ b/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options.component.ts @@ -0,0 +1,21 @@ +import { Component } from "@angular/core"; + +import { BaseLoginDecryptionOptionsComponent } from "@bitwarden/angular/auth/components/base-login-decryption-options.component"; +@Component({ + selector: "web-login-decryption-options", + templateUrl: "login-decryption-options.component.html", +}) +export class LoginDecryptionOptionsComponent extends BaseLoginDecryptionOptionsComponent { + override async createUser(): Promise { + try { + await super.createUser(); + await this.router.navigate(["/vault"]); + } catch (error) { + this.validationService.showError(error); + } + } + + createUserAction = async (): Promise => { + return this.createUser(); + }; +} diff --git a/apps/web/src/app/auth/login/login-with-device.component.html b/apps/web/src/app/auth/login/login-with-device.component.html index f190f8f5c6e..80811ac8b64 100644 --- a/apps/web/src/app/auth/login/login-with-device.component.html +++ b/apps/web/src/app/auth/login/login-with-device.component.html @@ -5,42 +5,71 @@ >
-

- {{ "loginOrCreateNewAccount" | i18n }} -

-
-

{{ "logInInitiated" | i18n }}

+ +

+ {{ "loginOrCreateNewAccount" | i18n }} +

-
-

{{ "notificationSentDevice" | i18n }}

+
+

{{ "loginInitiated" | i18n }}

-

- {{ "fingerprintMatchInfo" | i18n }} -

+
+

{{ "notificationSentDevice" | i18n }}

+ +

+ {{ "fingerprintMatchInfo" | i18n }} +

+
+ +
+

{{ "fingerprintPhraseHeader" | i18n }}

+

+ {{ fingerprintPhrase }} +

+
+ + + +
+ +
+ {{ "loginWithDeviceEnabledNote" | i18n }} + {{ "viewAllLoginOptions" | i18n }} +
+ + +
+

{{ "adminApprovalRequested" | i18n }}

-
-

{{ "fingerprintPhraseHeader" | i18n }}

-

- {{ fingerprintPhrase }} -

+
+

{{ "adminApprovalRequestSentToAdmins" | i18n }}

+

{{ "youWillBeNotifiedOnceApproved" | i18n }}

+
+ +
+

{{ "fingerprintPhraseHeader" | i18n }}

+

+ {{ fingerprintPhrase }} +

+
+ +
+ +
+ {{ "troubleLoggingIn" | i18n }} + {{ "viewAllLoginOptions" | i18n }} +
- - - -
- -
- {{ "loginWithDeviceEnabledNote" | i18n }} - {{ "viewAllLoginOptions" | i18n }} -
-
+
diff --git a/apps/web/src/app/auth/login/login-with-device.component.ts b/apps/web/src/app/auth/login/login-with-device.component.ts index c5e73bf04b1..ff66bdb886b 100644 --- a/apps/web/src/app/auth/login/login-with-device.component.ts +++ b/apps/web/src/app/auth/login/login-with-device.component.ts @@ -4,7 +4,9 @@ import { Router } from "@angular/router"; import { LoginWithDeviceComponent as BaseLoginWithDeviceComponent } from "@bitwarden/angular/auth/components/login-with-device.component"; import { AnonymousHubService } from "@bitwarden/common/abstractions/anonymousHub.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { AuthRequestCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-crypto.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DeviceTrustCryptoServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust-crypto.service.abstraction"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -41,7 +43,9 @@ export class LoginWithDeviceComponent anonymousHubService: AnonymousHubService, validationService: ValidationService, stateService: StateService, - loginService: LoginService + loginService: LoginService, + deviceTrustCryptoService: DeviceTrustCryptoServiceAbstraction, + authReqCryptoService: AuthRequestCryptoServiceAbstraction ) { super( router, @@ -58,7 +62,9 @@ export class LoginWithDeviceComponent anonymousHubService, validationService, stateService, - loginService + loginService, + deviceTrustCryptoService, + authReqCryptoService ); } } diff --git a/apps/web/src/app/auth/login/login.component.ts b/apps/web/src/app/auth/login/login.component.ts index 316b353c490..3bc65542b73 100644 --- a/apps/web/src/app/auth/login/login.component.ts +++ b/apps/web/src/app/auth/login/login.component.ts @@ -6,7 +6,6 @@ import { first } from "rxjs/operators"; import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component"; import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/abstractions/devices/devices-api.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyData } from "@bitwarden/common/admin-console/models/data/policy.data"; @@ -14,6 +13,7 @@ import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/mod import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { PolicyResponse } from "@bitwarden/common/admin-console/models/response/policy.response"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; import { LoginService } from "@bitwarden/common/auth/abstractions/login.service"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; diff --git a/apps/web/src/app/auth/login/login.module.ts b/apps/web/src/app/auth/login/login.module.ts index b01fa015888..2a074ca2a61 100644 --- a/apps/web/src/app/auth/login/login.module.ts +++ b/apps/web/src/app/auth/login/login.module.ts @@ -4,12 +4,13 @@ import { CheckboxModule } from "@bitwarden/components"; import { SharedModule } from "../../../app/shared"; +import { LoginDecryptionOptionsComponent } from "./login-decryption-options/login-decryption-options.component"; import { LoginWithDeviceComponent } from "./login-with-device.component"; import { LoginComponent } from "./login.component"; @NgModule({ imports: [SharedModule, CheckboxModule], - declarations: [LoginComponent, LoginWithDeviceComponent], - exports: [LoginComponent, LoginWithDeviceComponent], + declarations: [LoginComponent, LoginWithDeviceComponent, LoginDecryptionOptionsComponent], + exports: [LoginComponent, LoginWithDeviceComponent, LoginDecryptionOptionsComponent], }) export class LoginModule {} diff --git a/apps/web/src/app/auth/recover-two-factor.component.ts b/apps/web/src/app/auth/recover-two-factor.component.ts index 06816d85460..2d6140780a0 100644 --- a/apps/web/src/app/auth/recover-two-factor.component.ts +++ b/apps/web/src/app/auth/recover-two-factor.component.ts @@ -35,7 +35,7 @@ export class RecoverTwoFactorComponent { request.recoveryCode = this.recoveryCode.replace(/\s/g, "").toLowerCase(); request.email = this.email.trim().toLowerCase(); const key = await this.authService.makePreloginKey(this.masterPassword, request.email); - request.masterPasswordHash = await this.cryptoService.hashPassword(this.masterPassword, key); + request.masterPasswordHash = await this.cryptoService.hashMasterKey(this.masterPassword, key); this.formPromise = this.apiService.postTwoFactorRecover(request); await this.formPromise; this.platformUtilsService.showToast( diff --git a/apps/web/src/app/settings/change-password.component.html b/apps/web/src/app/auth/settings/change-password.component.html similarity index 94% rename from apps/web/src/app/settings/change-password.component.html rename to apps/web/src/app/auth/settings/change-password.component.html index 3321b8f9dfe..7088cb5a686 100644 --- a/apps/web/src/app/settings/change-password.component.html +++ b/apps/web/src/app/auth/settings/change-password.component.html @@ -89,12 +89,12 @@ -
-
- -
- - + +
+ +
+ + +
+
+ + +
-
- - -
-
+
diff --git a/apps/web/src/app/settings/preferences.component.ts b/apps/web/src/app/settings/preferences.component.ts index 973aed0f5f7..9412a3e8b66 100644 --- a/apps/web/src/app/settings/preferences.component.ts +++ b/apps/web/src/app/settings/preferences.component.ts @@ -1,10 +1,10 @@ import { Component, OnInit } from "@angular/core"; import { FormBuilder } from "@angular/forms"; -import { concatMap, filter, map, Observable, Subject, takeUntil, tap } from "rxjs"; +import { concatMap, filter, firstValueFrom, map, Observable, Subject, takeUntil, tap } from "rxjs"; import { AbstractThemingService } from "@bitwarden/angular/services/theming/theming.service.abstraction"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; -import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { ThemeType } from "@bitwarden/common/enums"; @@ -24,6 +24,8 @@ export class PreferencesComponent implements OnInit { // For use in template protected readonly VaultTimeoutAction = VaultTimeoutAction; + protected availableVaultTimeoutActions$: Observable; + vaultTimeoutPolicyCallout: Observable<{ timeout: { hours: number; minutes: number }; action: VaultTimeoutAction; @@ -89,6 +91,9 @@ export class PreferencesComponent implements OnInit { } async ngOnInit() { + this.availableVaultTimeoutActions$ = + this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(); + this.vaultTimeoutPolicyCallout = this.policyService.get$(PolicyType.MaximumVaultTimeout).pipe( filter((policy) => policy != null), map((policy) => { @@ -133,7 +138,9 @@ export class PreferencesComponent implements OnInit { .subscribe(); const initialFormValues = { vaultTimeout: await this.vaultTimeoutSettingsService.getVaultTimeout(), - vaultTimeoutAction: await this.vaultTimeoutSettingsService.getVaultTimeoutAction(), + vaultTimeoutAction: await firstValueFrom( + this.vaultTimeoutSettingsService.vaultTimeoutAction$() + ), enableFavicons: !(await this.settingsService.getDisableFavicon()), enableFullWidth: await this.stateService.getEnableFullWidth(), theme: await this.stateService.getTheme(), diff --git a/apps/web/src/app/settings/security-keys.component.ts b/apps/web/src/app/settings/security-keys.component.ts index 887ba3d5879..2a01f6d0106 100644 --- a/apps/web/src/app/settings/security-keys.component.ts +++ b/apps/web/src/app/settings/security-keys.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { ApiKeyComponent } from "./api-key.component"; @@ -20,14 +20,14 @@ export class SecurityKeysComponent implements OnInit { showChangeKdf = true; constructor( - private keyConnectorService: KeyConnectorService, + private userVerificationService: UserVerificationService, private stateService: StateService, private modalService: ModalService, private apiService: ApiService ) {} async ngOnInit() { - this.showChangeKdf = !(await this.keyConnectorService.getUsesKeyConnector()); + this.showChangeKdf = await this.userVerificationService.hasMasterPassword(); } async viewUserApiKey() { diff --git a/apps/web/src/app/settings/security-routing.module.ts b/apps/web/src/app/settings/security-routing.module.ts index 1d47a0d7750..d08d4be16fb 100644 --- a/apps/web/src/app/settings/security-routing.module.ts +++ b/apps/web/src/app/settings/security-routing.module.ts @@ -1,9 +1,9 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; +import { ChangePasswordComponent } from "../auth/settings/change-password.component"; import { TwoFactorSetupComponent } from "../auth/settings/two-factor-setup.component"; -import { ChangePasswordComponent } from "./change-password.component"; import { SecurityKeysComponent } from "./security-keys.component"; import { SecurityComponent } from "./security.component"; diff --git a/apps/web/src/app/settings/security.component.ts b/apps/web/src/app/settings/security.component.ts index 1c70f85edaf..3237a2e6a28 100644 --- a/apps/web/src/app/settings/security.component.ts +++ b/apps/web/src/app/settings/security.component.ts @@ -1,6 +1,6 @@ import { Component } from "@angular/core"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; @Component({ selector: "app-security", @@ -9,9 +9,9 @@ import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-con export class SecurityComponent { showChangePassword = true; - constructor(private keyConnectorService: KeyConnectorService) {} + constructor(private userVerificationService: UserVerificationService) {} async ngOnInit() { - this.showChangePassword = !(await this.keyConnectorService.getUsesKeyConnector()); + this.showChangePassword = await this.userVerificationService.hasMasterPassword(); } } diff --git a/apps/web/src/app/settings/update-key.component.html b/apps/web/src/app/settings/update-key.component.html index b39a5eb7e1a..7b94a6dca04 100644 --- a/apps/web/src/app/settings/update-key.component.html +++ b/apps/web/src/app/settings/update-key.component.html @@ -1,4 +1,4 @@ -