From b713e18b1ab19c981f1d7af444798ef9242fc78f Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Fri, 13 Sep 2024 10:46:31 -0700 Subject: [PATCH 001/104] remove duplicate route (#11034) --- apps/desktop/src/app/app-routing.module.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/desktop/src/app/app-routing.module.ts b/apps/desktop/src/app/app-routing.module.ts index 2e44d2213e3..f208da73559 100644 --- a/apps/desktop/src/app/app-routing.module.ts +++ b/apps/desktop/src/app/app-routing.module.ts @@ -155,14 +155,6 @@ const routes: Routes = [ path: "", component: AnonLayoutWrapperComponent, children: [ - { - path: "hint", - component: PasswordHintComponent, - data: { - pageTitle: "requestPasswordHint", - pageSubtitle: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", - }, - }, { path: "signup", canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()], From f816e8031442b80429fd931f7b688cb57db7e619 Mon Sep 17 00:00:00 2001 From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:14:46 +0100 Subject: [PATCH 002/104] [AC-3023] Resolve the capitalization here (#11019) * Resolve the capitalization here * Resolve the returned issue on A11y * Fix the storage bug --- .../change-plan-dialog.component.html | 13 ++++- .../change-plan-dialog.component.ts | 56 ++++++++++++++++++- apps/web/src/locales/en/messages.json | 2 +- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html index 766646003ba..8420916c8e0 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html @@ -53,10 +53,19 @@ [class]="'tw-grid-cols-' + selectableProducts.length" >
{ + const card = cardElements[newIndex]; + if ( + !( + card.classList.contains("tw-bg-secondary-100") && + card.classList.contains("tw-text-muted") + ) + ) { + card?.focus(); + } + }, 0); + } + } + + onFocus(index: number) { + this.focusedIndex = index; + this.selectPlan(this.selectableProducts[index]); + } + + isCardDisabled(index: number): boolean { + const card = this.selectableProducts[index]; + return card === (this.currentPlan || this.isCardStateDisabled); + } + + manageSelectableProduct(index: number) { + return index; + } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index d1d10dc9676..340acc8efb5 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -9062,7 +9062,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" From 74ee0315c061507cd4f755ec07ef8c6ed79ba371 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:37:58 +0200 Subject: [PATCH 003/104] [deps]: Update @yao-pkg/pkg to v5.14.0 (#11068) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cc733665a9..09cea6cacc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -119,7 +119,7 @@ "@typescript-eslint/eslint-plugin": "7.16.1", "@typescript-eslint/parser": "7.16.1", "@webcomponents/custom-elements": "1.6.0", - "@yao-pkg/pkg": "5.12.1", + "@yao-pkg/pkg": "5.14.0", "autoprefixer": "10.4.20", "babel-loader": "9.1.3", "base64-loader": "1.0.0", @@ -10828,16 +10828,16 @@ "license": "Apache-2.0" }, "node_modules/@yao-pkg/pkg": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-5.12.1.tgz", - "integrity": "sha512-vqp8Z9o39LDKTpjfeDjJsLf4mi0zS4jkbTTZbptfc/K1KKDU2hosex64TaattPO9NLkibc6EJldmSjVmc63ooA==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-5.14.0.tgz", + "integrity": "sha512-34oflUyAOI64a4cc4AF3ckvS8Qqnk/ISvZ1bDBa1/JAYaaFtzAO+RlhPaU+wCHzhk6VXvZwEywJpb+SlVDTgdA==", "dev": true, "license": "MIT", "dependencies": { "@babel/generator": "7.23.0", "@babel/parser": "7.23.0", "@babel/types": "7.23.0", - "@yao-pkg/pkg-fetch": "3.5.9", + "@yao-pkg/pkg-fetch": "3.5.11", "chalk": "^4.1.2", "fs-extra": "^9.1.0", "globby": "^11.1.0", @@ -10854,9 +10854,9 @@ } }, "node_modules/@yao-pkg/pkg-fetch": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.9.tgz", - "integrity": "sha512-usMwwqFCd2B7k+V87u6kiTesyDSlw+3LpiuYBWe+UgryvSOk/NXjx3XVCub8hQoi0bCREbdQ6NDBqminyHJJrg==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.11.tgz", + "integrity": "sha512-2tQ/1n7BLTptW6lL0pfTCnVMIxls8Jiw0/ClK1J2Fja9z2S2j4uzNL5dwGRqtvPJPn/q9i8X+Y+c4dwnMb+NOA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 365508e31ef..1f73d180e1f 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@typescript-eslint/eslint-plugin": "7.16.1", "@typescript-eslint/parser": "7.16.1", "@webcomponents/custom-elements": "1.6.0", - "@yao-pkg/pkg": "5.12.1", + "@yao-pkg/pkg": "5.14.0", "autoprefixer": "10.4.20", "babel-loader": "9.1.3", "base64-loader": "1.0.0", From 20d83ab198fe9074455425622fd1f9bd6523e8c5 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Mon, 16 Sep 2024 15:16:28 +0200 Subject: [PATCH 004/104] [PM-2718] Set nspasteboard.ConcealedType for clipboard on MacOS (#11025) Enables the use of `exclude_from_clipboard` for macos, introduced in recent version of arboard --- apps/desktop/desktop_native/core/src/clipboard.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/desktop/desktop_native/core/src/clipboard.rs b/apps/desktop/desktop_native/core/src/clipboard.rs index cecf2478656..bb3e3a43149 100644 --- a/apps/desktop/desktop_native/core/src/clipboard.rs +++ b/apps/desktop/desktop_native/core/src/clipboard.rs @@ -37,8 +37,14 @@ fn clipboard_set(set: Set, _password: bool) -> Set { } #[cfg(target_os = "macos")] -fn clipboard_set(set: Set, _password: bool) -> Set { - set +fn clipboard_set(set: Set, password: bool) -> Set { + use arboard::SetExtApple; + + if password { + set.exclude_from_history() + } else { + set + } } #[cfg(test)] From c64477034a9bc513b9e4936e1fbc9f40cf63b491 Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Mon, 16 Sep 2024 08:33:23 -0500 Subject: [PATCH 005/104] set `extensionRefreshEnabled` to be undefined so the "new" button isn't shown until the feature flag is resolved (#11038) --- .../individual-vault/vault-header/vault-header.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts index 403dbd2f675..44e523abe61 100644 --- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts @@ -49,7 +49,7 @@ export class VaultHeaderComponent implements OnInit { protected All = All; protected CollectionDialogTabType = CollectionDialogTabType; protected CipherType = CipherType; - protected extensionRefreshEnabled = false; + protected extensionRefreshEnabled: boolean; /** * Boolean to determine the loading state of the header. From 62ee447c36d99c44ef2eccf7c55545ecbe5089b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:34:33 -0400 Subject: [PATCH 006/104] [deps] Autofill: Update tldts to v6.1.46 (#11054) 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 bf60020b523..b5317794c35 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -80,7 +80,7 @@ "papaparse": "5.4.1", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", - "tldts": "6.1.41", + "tldts": "6.1.46", "zxcvbn": "4.4.2" } } diff --git a/package-lock.json b/package-lock.json index 09cea6cacc1..f3e8b78fc87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,7 @@ "qrious": "4.0.2", "rxjs": "7.8.1", "tabbable": "6.2.0", - "tldts": "6.1.41", + "tldts": "6.1.46", "utf-8-validate": "6.0.4", "zone.js": "0.13.3", "zxcvbn": "4.4.2" @@ -223,7 +223,7 @@ "papaparse": "5.4.1", "proper-lockfile": "4.1.2", "rxjs": "7.8.1", - "tldts": "6.1.41", + "tldts": "6.1.46", "zxcvbn": "4.4.2" }, "bin": { @@ -36258,21 +36258,21 @@ } }, "node_modules/tldts": { - "version": "6.1.41", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.41.tgz", - "integrity": "sha512-RNpUkL5fYD2DTQQCdr8QMDp6UL0ThtpXT3q3+qPE05dIT+RK2I3M0VByVbQN1dEhLUGzimivVwxK2By9epLk6w==", + "version": "6.1.46", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.46.tgz", + "integrity": "sha512-fw81lXV2CijkNrZAZvee7wegs+EOlTyIuVl/z4q6OUzZHQ1jGL2xQzKXq9geYf/1tzo9LZQLrkcko2m8HLh+rg==", "license": "MIT", "dependencies": { - "tldts-core": "^6.1.41" + "tldts-core": "^6.1.46" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.41", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.41.tgz", - "integrity": "sha512-SkwZgo1ZzMp2ziMBwci5VBnLR9VywCi02jSgMX5TO5kf9fdaBsxZkblLff3NlJNTcH0vfvEsgw2B7jVR556Vgw==", + "version": "6.1.46", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.46.tgz", + "integrity": "sha512-zA3ai/j4aFcmbqTvTONkSBuWs0Q4X4tJxa0gV9sp6kDbq5dAhQDSg0WUkReEm0fBAKAGNj+wPKCCsR8MYOYmwA==", "license": "MIT" }, "node_modules/tmp": { diff --git a/package.json b/package.json index 1f73d180e1f..85ccf459b40 100644 --- a/package.json +++ b/package.json @@ -199,7 +199,7 @@ "qrious": "4.0.2", "rxjs": "7.8.1", "tabbable": "6.2.0", - "tldts": "6.1.41", + "tldts": "6.1.46", "utf-8-validate": "6.0.4", "zone.js": "0.13.3", "zxcvbn": "4.4.2" From b0e0e71974d93b16df9f06fd5daf37e8470219f8 Mon Sep 17 00:00:00 2001 From: Cesar Gonzalez Date: Mon, 16 Sep 2024 08:35:56 -0500 Subject: [PATCH 007/104] [PM-11517] Improve autofill collection of page details performance (#10816) * Testing out a rework of the performance improvements introduced into extension * Working through improvements * Implementing max_depth methodology for the deepQuery approach used when querying elements * Refactoring implementation * Refactoring implementation * Fixing jest tests * Incorporating documenation within domQueryService * [PM-11519] `browser` global reference triggering an error when sending an extension message * [PM-11517] Working through refactoring and jest testing of the domQueryService * [PM-11517] Working through refactoring and jest testing of the domQueryService * [PM-11517] Incorporating tests for the debounce util method * [PM-11517] Incorporating tests for the debounce util method * [PM-11517] Removing unnecessary property * [PM-11517] Starting to work through an idea regarding querying without the shadowDom on pages that definitively do not contain a ShadowDOM element * [PM-11419] Adjusting implementation to ensure we clear any active requests when the passkeys setting is modified * [PM-11517] Removing unnecessary comments --- .../content/auto-submit-login.spec.ts | 19 +- .../src/autofill/content/auto-submit-login.ts | 39 ++- .../src/autofill/content/autofill-init.ts | 2 +- .../abstractions/dom-query.service.ts | 11 +- .../autofill-overlay-content.service.ts | 24 +- .../collect-autofill-content.service.spec.ts | 58 ++-- .../collect-autofill-content.service.ts | 281 +++++++----------- .../services/dom-query.service.spec.ts | 86 +++++- .../autofill/services/dom-query.service.ts | 132 ++++++-- .../insert-autofill-content.service.spec.ts | 2 +- .../src/autofill/spec/testing-utils.ts | 2 +- apps/browser/src/autofill/utils/index.spec.ts | 33 ++ apps/browser/src/autofill/utils/index.ts | 26 ++ libs/common/src/autofill/constants/index.ts | 2 + 14 files changed, 437 insertions(+), 280 deletions(-) diff --git a/apps/browser/src/autofill/content/auto-submit-login.spec.ts b/apps/browser/src/autofill/content/auto-submit-login.spec.ts index 98caee3d363..ff1dbd4e945 100644 --- a/apps/browser/src/autofill/content/auto-submit-login.spec.ts +++ b/apps/browser/src/autofill/content/auto-submit-login.spec.ts @@ -5,23 +5,17 @@ import { createAutofillPageDetailsMock, createAutofillScriptMock, } from "../spec/autofill-mocks"; -import { flushPromises, sendMockExtensionMessage } from "../spec/testing-utils"; +import { + flushPromises, + mockQuerySelectorAllDefinedCall, + sendMockExtensionMessage, +} from "../spec/testing-utils"; import { FormFieldElement } from "../types"; let pageDetailsMock: AutofillPageDetails; let fillScriptMock: AutofillScript; let autofillFieldElementByOpidMock: FormFieldElement; -jest.mock("../services/dom-query.service", () => { - const module = jest.requireActual("../services/dom-query.service"); - return { - DomQueryService: class extends module.DomQueryService { - deepQueryElements(element: HTMLElement, queryString: string): T[] { - return Array.from(element.querySelectorAll(queryString)) as T[]; - } - }, - }; -}); jest.mock("../services/collect-autofill-content.service", () => { const module = jest.requireActual("../services/collect-autofill-content.service"); return { @@ -47,6 +41,8 @@ jest.mock("../services/collect-autofill-content.service", () => { jest.mock("../services/insert-autofill-content.service"); describe("AutoSubmitLogin content script", () => { + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); + beforeEach(() => { jest.useFakeTimers(); setupEnvironmentDefaults(); @@ -60,6 +56,7 @@ describe("AutoSubmitLogin content script", () => { afterAll(() => { jest.clearAllMocks(); + mockQuerySelectorAll.mockRestore(); }); it("ends the auto-submit login workflow if the page does not contain any fields", async () => { diff --git a/apps/browser/src/autofill/content/auto-submit-login.ts b/apps/browser/src/autofill/content/auto-submit-login.ts index ab7f09f804d..e304247a66a 100644 --- a/apps/browser/src/autofill/content/auto-submit-login.ts +++ b/apps/browser/src/autofill/content/auto-submit-login.ts @@ -10,7 +10,9 @@ import InsertAutofillContentService from "../services/insert-autofill-content.se import { elementIsInputElement, getSubmitButtonKeywordsSet, + nodeIsButtonElement, nodeIsFormElement, + nodeIsTypeSubmitElement, sendExtensionMessage, } from "../utils"; @@ -189,13 +191,21 @@ import { element: HTMLElement, lastFieldIsPasswordInput = false, ): boolean { - const genericSubmitElement = querySubmitButtonElement(element, "[type='submit']"); + const genericSubmitElement = querySubmitButtonElement( + element, + "[type='submit']", + (node: Node) => nodeIsTypeSubmitElement(node), + ); if (genericSubmitElement) { clickSubmitElement(genericSubmitElement, lastFieldIsPasswordInput); return true; } - const buttonElement = querySubmitButtonElement(element, "button, [type='button']"); + const buttonElement = querySubmitButtonElement( + element, + "button, [type='button']", + (node: Node) => nodeIsButtonElement(node), + ); if (buttonElement) { clickSubmitElement(buttonElement, lastFieldIsPasswordInput); return true; @@ -210,11 +220,17 @@ import { * * @param element - The element to query for submit buttons * @param selector - The selector to query for submit buttons + * @param treeWalkerFilter - The callback used to filter treeWalker results */ - function querySubmitButtonElement(element: HTMLElement, selector: string) { - const submitButtonElements = domQueryService.deepQueryElements( + function querySubmitButtonElement( + element: HTMLElement, + selector: string, + treeWalkerFilter: CallableFunction, + ) { + const submitButtonElements = domQueryService.query( element, selector, + treeWalkerFilter, ); for (let index = 0; index < submitButtonElements.length; index++) { const submitElement = submitButtonElements[index]; @@ -272,20 +288,11 @@ import { * Gets all form elements on the page. */ function getAutofillFormElements(): HTMLFormElement[] { - const formElements: HTMLFormElement[] = []; - domQueryService.queryAllTreeWalkerNodes( + return domQueryService.query( globalContext.document.documentElement, - (node: Node) => { - if (nodeIsFormElement(node)) { - formElements.push(node); - return true; - } - - return false; - }, + "form", + (node: Node) => nodeIsFormElement(node), ); - - return formElements; } /** diff --git a/apps/browser/src/autofill/content/autofill-init.ts b/apps/browser/src/autofill/content/autofill-init.ts index c0cbac3ae67..e901000dbb9 100644 --- a/apps/browser/src/autofill/content/autofill-init.ts +++ b/apps/browser/src/autofill/content/autofill-init.ts @@ -38,7 +38,7 @@ class AutofillInit implements AutofillInitInterface { * @param overlayNotificationsContentService - The overlay notifications content service, potentially undefined. */ constructor( - private domQueryService: DomQueryService, + domQueryService: DomQueryService, private autofillOverlayContentService?: AutofillOverlayContentService, private autofillInlineMenuContentService?: AutofillInlineMenuContentService, private overlayNotificationsContentService?: OverlayNotificationsContentService, diff --git a/apps/browser/src/autofill/services/abstractions/dom-query.service.ts b/apps/browser/src/autofill/services/abstractions/dom-query.service.ts index 8b0b2f5dbdd..3e0242bc74b 100644 --- a/apps/browser/src/autofill/services/abstractions/dom-query.service.ts +++ b/apps/browser/src/autofill/services/abstractions/dom-query.service.ts @@ -1,12 +1,11 @@ export interface DomQueryService { - deepQueryElements( + query( root: Document | ShadowRoot | Element, queryString: string, + treeWalkerFilter: CallableFunction, mutationObserver?: MutationObserver, + forceDeepQueryAttempt?: boolean, ): T[]; - queryAllTreeWalkerNodes( - rootNode: Node, - filterCallback: CallableFunction, - mutationObserver?: MutationObserver, - ): Node[]; + checkPageContainsShadowDom(): void; + pageContainsShadowDomElements(): boolean; } diff --git a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts index 23a4fc27000..2e85fa22819 100644 --- a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts +++ b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts @@ -32,6 +32,8 @@ import { elementIsFillableFormField, elementIsSelectElement, getAttributeBoolean, + nodeIsButtonElement, + nodeIsTypeSubmitElement, sendExtensionMessage, throttle, } from "../utils"; @@ -508,12 +510,20 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ * @param element - The element to find the submit button within. */ private findSubmitButton(element: HTMLElement): HTMLElement | null { - const genericSubmitElement = this.querySubmitButtonElement(element, "[type='submit']"); + const genericSubmitElement = this.querySubmitButtonElement( + element, + "[type='submit']", + (node: Node) => nodeIsTypeSubmitElement(node), + ); if (genericSubmitElement) { return genericSubmitElement; } - const submitButtonElement = this.querySubmitButtonElement(element, "button, [type='button']"); + const submitButtonElement = this.querySubmitButtonElement( + element, + "button, [type='button']", + (node: Node) => nodeIsButtonElement(node), + ); if (submitButtonElement) { return submitButtonElement; } @@ -524,11 +534,17 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ * * @param element - The element to query for a submit button. * @param selector - The selector to use to query the element for a submit button. + * @param treeWalkerFilter - The tree walker filter to use when querying the element. */ - private querySubmitButtonElement(element: HTMLElement, selector: string) { - const submitButtonElements = this.domQueryService.deepQueryElements( + private querySubmitButtonElement( + element: HTMLElement, + selector: string, + treeWalkerFilter: CallableFunction, + ) { + const submitButtonElements = this.domQueryService.query( element, selector, + treeWalkerFilter, ); for (let index = 0; index < submitButtonElements.length; index++) { const submitElement = submitButtonElements[index]; diff --git a/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts b/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts index 97b231a1dac..441a2ea17a8 100644 --- a/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts +++ b/apps/browser/src/autofill/services/collect-autofill-content.service.spec.ts @@ -17,6 +17,14 @@ import { CollectAutofillContentService } from "./collect-autofill-content.servic import DomElementVisibilityService from "./dom-element-visibility.service"; import { DomQueryService } from "./dom-query.service"; +jest.mock("../utils", () => { + const utils = jest.requireActual("../utils"); + return { + ...utils, + debounce: jest.fn((fn) => fn), + }; +}); + const mockLoginForm = `
@@ -29,6 +37,7 @@ const mockLoginForm = ` const waitForIdleCallback = () => new Promise((resolve) => globalThis.requestIdleCallback(resolve)); describe("CollectAutofillContentService", () => { + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); const domElementVisibilityService = new DomElementVisibilityService(); const inlineMenuFieldQualificationService = mock(); const domQueryService = new DomQueryService(); @@ -38,7 +47,6 @@ describe("CollectAutofillContentService", () => { ); let collectAutofillContentService: CollectAutofillContentService; const mockIntersectionObserver = mock(); - const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); beforeEach(() => { globalThis.requestIdleCallback = jest.fn((cb, options) => setTimeout(cb, 100)); @@ -55,6 +63,7 @@ describe("CollectAutofillContentService", () => { afterEach(() => { jest.clearAllMocks(); jest.restoreAllMocks(); + jest.clearAllTimers(); document.body.innerHTML = ""; }); @@ -2001,41 +2010,6 @@ describe("CollectAutofillContentService", () => { }); }); - describe("getShadowRoot", () => { - beforeEach(() => { - // eslint-disable-next-line - // @ts-ignore - globalThis.chrome.dom = { - openOrClosedShadowRoot: jest.fn(), - }; - }); - - it("returns null if the passed node is not an HTMLElement instance", () => { - const textNode = document.createTextNode("Hello, world!"); - const shadowRoot = collectAutofillContentService["getShadowRoot"](textNode); - - expect(shadowRoot).toEqual(null); - }); - - it("returns an open shadow root if the passed node has a shadowDOM element", () => { - const element = document.createElement("div"); - element.attachShadow({ mode: "open" }); - - const shadowRoot = collectAutofillContentService["getShadowRoot"](element); - - expect(shadowRoot).toBeInstanceOf(ShadowRoot); - }); - - it("returns a value provided by Chrome's openOrClosedShadowRoot API", () => { - const element = document.createElement("div"); - collectAutofillContentService["getShadowRoot"](element); - - // eslint-disable-next-line - // @ts-ignore - expect(chrome.dom.openOrClosedShadowRoot).toBeCalled(); - }); - }); - describe("setupMutationObserver", () => { it("sets up a mutation observer and observes the document element", () => { jest.spyOn(MutationObserver.prototype, "observe"); @@ -2048,6 +2022,12 @@ describe("CollectAutofillContentService", () => { }); describe("handleMutationObserverMutation", () => { + const waitForAllMutationsToComplete = async () => { + await waitForIdleCallback(); + await waitForIdleCallback(); + await waitForIdleCallback(); + }; + it("will set the domRecentlyMutated value to true and the noFieldsFound value to false if a form or field node has been added ", async () => { const form = document.createElement("form"); document.body.appendChild(form); @@ -2071,7 +2051,7 @@ describe("CollectAutofillContentService", () => { jest.spyOn(collectAutofillContentService as any, "isAutofillElementNodeMutated"); collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); - await waitForIdleCallback(); + await waitForAllMutationsToComplete(); expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(true); expect(collectAutofillContentService["noFieldsFound"]).toEqual(false); @@ -2115,7 +2095,7 @@ describe("CollectAutofillContentService", () => { target: document.body, }, ]); - await waitForIdleCallback(); + await waitForAllMutationsToComplete(); expect(collectAutofillContentService["_autofillFormElements"].size).toEqual(0); expect(collectAutofillContentService["autofillFieldElements"].size).toEqual(0); @@ -2140,7 +2120,7 @@ describe("CollectAutofillContentService", () => { jest.spyOn(collectAutofillContentService as any, "handleAutofillElementAttributeMutation"); collectAutofillContentService["handleMutationObserverMutation"]([mutationRecord]); - await waitForIdleCallback(); + await waitForAllMutationsToComplete(); expect(collectAutofillContentService["domRecentlyMutated"]).toEqual(false); expect(collectAutofillContentService["noFieldsFound"]).toEqual(true); diff --git a/apps/browser/src/autofill/services/collect-autofill-content.service.ts b/apps/browser/src/autofill/services/collect-autofill-content.service.ts index efacafbe88e..7da1d6aa6ba 100644 --- a/apps/browser/src/autofill/services/collect-autofill-content.service.ts +++ b/apps/browser/src/autofill/services/collect-autofill-content.service.ts @@ -20,6 +20,7 @@ import { getPropertyOrAttribute, requestIdleCallbackPolyfill, cancelIdleCallbackPolyfill, + debounce, } from "../utils"; import { AutofillOverlayContentService } from "./abstractions/autofill-overlay-content.service"; @@ -57,7 +58,6 @@ export class CollectAutofillContentService implements CollectAutofillContentServ "image", "file", ]); - private useTreeWalkerStrategyFlagSet = true; constructor( private domElementVisibilityService: DomElementVisibilityService, @@ -69,11 +69,6 @@ export class CollectAutofillContentService implements CollectAutofillContentServ inputQuery += `:not([type="${type}"])`; } this.formFieldQueryString = `${inputQuery}, textarea:not([data-bwignore]), select:not([data-bwignore]), span[data-bwautofill]`; - - // void sendExtensionMessage("getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag").then( - // (useTreeWalkerStrategyFlag) => - // (this.useTreeWalkerStrategyFlagSet = !!useTreeWalkerStrategyFlag?.result), - // ); } get autofillFormElements(): AutofillFormElements { @@ -297,13 +292,12 @@ export class CollectAutofillContentService implements CollectAutofillContentServ ): FormFieldElement[] { let formFieldElements = previouslyFoundFormFieldElements; if (!formFieldElements) { - formFieldElements = this.useTreeWalkerStrategyFlagSet - ? this.queryTreeWalkerForAutofillFormFieldElements() - : this.domQueryService.deepQueryElements( - document, - this.formFieldQueryString, - this.mutationObserver, - ); + formFieldElements = this.domQueryService.query( + globalThis.document.documentElement, + this.formFieldQueryString, + (node: Node) => this.isNodeFormFieldElement(node), + this.mutationObserver, + ); } if (!fieldsLimit || formFieldElements.length <= fieldsLimit) { @@ -836,17 +830,32 @@ export class CollectAutofillContentService implements CollectAutofillContentServ formElements: HTMLFormElement[]; formFieldElements: FormFieldElement[]; } { - if (this.useTreeWalkerStrategyFlagSet) { - return this.queryTreeWalkerForAutofillFormAndFieldElements(); - } - - const queriedElements = this.domQueryService.deepQueryElements( - document, - `form, ${this.formFieldQueryString}`, - this.mutationObserver, - ); const formElements: HTMLFormElement[] = []; const formFieldElements: FormFieldElement[] = []; + + const queriedElements = this.domQueryService.query( + globalThis.document.documentElement, + `form, ${this.formFieldQueryString}`, + (node: Node) => { + if (nodeIsFormElement(node)) { + formElements.push(node); + return true; + } + + if (this.isNodeFormFieldElement(node)) { + formFieldElements.push(node as FormFieldElement); + return true; + } + + return false; + }, + this.mutationObserver, + ); + + if (formElements.length || formFieldElements.length) { + return { formElements, formFieldElements }; + } + for (let index = 0; index < queriedElements.length; index++) { const element = queriedElements[index]; if (elementIsFormElement(element)) { @@ -891,34 +900,6 @@ export class CollectAutofillContentService implements CollectAutofillContentServ return this.nonInputFormFieldTags.has(nodeTagName) && !nodeHasBwIgnoreAttribute; } - /** - * Attempts to get the ShadowRoot of the passed node. If support for the - * extension based openOrClosedShadowRoot API is available, it will be used. - * Will return null if the node is not an HTMLElement or if the node has - * child nodes. - * - * @param {Node} node - */ - private getShadowRoot(node: Node): ShadowRoot | null { - if (!nodeIsElement(node)) { - return null; - } - - if (node.shadowRoot) { - return node.shadowRoot; - } - - if ((chrome as any).dom?.openOrClosedShadowRoot) { - try { - return (chrome as any).dom.openOrClosedShadowRoot(node); - } catch (error) { - return null; - } - } - - return (node as any).openOrClosedShadowRoot; - } - /** * Sets up a mutation observer on the body of the document. Observes changes to * DOM elements to ensure we have an updated set of autofill field data. @@ -948,7 +929,7 @@ export class CollectAutofillContentService implements CollectAutofillContentServ } if (!this.mutationsQueue.length) { - requestIdleCallbackPolyfill(this.processMutations, { timeout: 500 }); + requestIdleCallbackPolyfill(debounce(this.processMutations, 100), { timeout: 500 }); } this.mutationsQueue.push(mutations); }; @@ -979,41 +960,62 @@ export class CollectAutofillContentService implements CollectAutofillContentServ * within an idle callback to help with performance and prevent excessive updates. */ private processMutations = () => { - for (let queueIndex = 0; queueIndex < this.mutationsQueue.length; queueIndex++) { - this.processMutationRecord(this.mutationsQueue[queueIndex]); + const queueLength = this.mutationsQueue.length; + + if (!this.domQueryService.pageContainsShadowDomElements()) { + this.domQueryService.checkPageContainsShadowDom(); } - if (this.domRecentlyMutated) { - this.updateAutofillElementsAfterMutation(); + for (let queueIndex = 0; queueIndex < queueLength; queueIndex++) { + const mutations = this.mutationsQueue[queueIndex]; + const processMutationRecords = () => { + this.processMutationRecords(mutations); + + if (queueIndex === queueLength - 1 && this.domRecentlyMutated) { + this.updateAutofillElementsAfterMutation(); + } + }; + + requestIdleCallbackPolyfill(processMutationRecords, { timeout: 500 }); } this.mutationsQueue = []; }; /** - * Processes a mutation record and updates the autofill elements if necessary. + * Processes all mutation records encountered by the mutation observer. * * @param mutations - The mutation record to process */ - private processMutationRecord(mutations: MutationRecord[]) { + private processMutationRecords(mutations: MutationRecord[]) { for (let mutationIndex = 0; mutationIndex < mutations.length; mutationIndex++) { - const mutation = mutations[mutationIndex]; - if ( - mutation.type === "childList" && - (this.isAutofillElementNodeMutated(mutation.removedNodes, true) || - this.isAutofillElementNodeMutated(mutation.addedNodes)) - ) { - this.domRecentlyMutated = true; - if (this.autofillOverlayContentService) { - this.autofillOverlayContentService.pageDetailsUpdateRequired = true; - } - this.noFieldsFound = false; - continue; - } + const mutation: MutationRecord = mutations[mutationIndex]; + const processMutationRecord = () => this.processMutationRecord(mutation); + requestIdleCallbackPolyfill(processMutationRecord, { timeout: 500 }); + } + } - if (mutation.type === "attributes") { - this.handleAutofillElementAttributeMutation(mutation); + /** + * Processes a single mutation record and updates the autofill elements if necessary. + * @param mutation + * @private + */ + private processMutationRecord(mutation: MutationRecord) { + if ( + mutation.type === "childList" && + (this.isAutofillElementNodeMutated(mutation.removedNodes, true) || + this.isAutofillElementNodeMutated(mutation.addedNodes)) + ) { + this.domRecentlyMutated = true; + if (this.autofillOverlayContentService) { + this.autofillOverlayContentService.pageDetailsUpdateRequired = true; } + this.noFieldsFound = false; + return; + } + + if (mutation.type === "attributes") { + this.handleAutofillElementAttributeMutation(mutation); } } @@ -1036,20 +1038,19 @@ export class CollectAutofillContentService implements CollectAutofillContentServ continue; } - if ( - !this.useTreeWalkerStrategyFlagSet && - (nodeIsFormElement(node) || this.isNodeFormFieldElement(node)) - ) { + if (nodeIsFormElement(node) || this.isNodeFormFieldElement(node)) { mutatedElements.push(node as HTMLElement); } - const autofillElements = this.useTreeWalkerStrategyFlagSet - ? this.queryTreeWalkerForMutatedElements(node) - : this.domQueryService.deepQueryElements( - node, - `form, ${this.formFieldQueryString}`, - this.mutationObserver, - ); + const autofillElements = this.domQueryService.query( + node, + `form, ${this.formFieldQueryString}`, + (walkerNode: Node) => + nodeIsFormElement(walkerNode) || this.isNodeFormFieldElement(walkerNode), + this.mutationObserver, + true, + ); + if (autofillElements.length) { mutatedElements = mutatedElements.concat(autofillElements); } @@ -1083,19 +1084,20 @@ export class CollectAutofillContentService implements CollectAutofillContentServ private setupOverlayListenersOnMutatedElements(mutatedElements: Node[]) { for (let elementIndex = 0; elementIndex < mutatedElements.length; elementIndex++) { const node = mutatedElements[elementIndex]; - if ( - !this.isNodeFormFieldElement(node) || - this.autofillFieldElements.get(node as ElementWithOpId) - ) { - continue; - } + const buildAutofillFieldItem = () => { + if ( + !this.isNodeFormFieldElement(node) || + this.autofillFieldElements.get(node as ElementWithOpId) + ) { + return; + } - requestIdleCallbackPolyfill( // We are setting this item to a -1 index because we do not know its position in the DOM. // This value should be updated with the next call to collect page details. - () => void this.buildAutofillFieldItem(node as ElementWithOpId, -1), - { timeout: 1000 }, - ); + void this.buildAutofillFieldItem(node as ElementWithOpId, -1); + }; + + requestIdleCallbackPolyfill(buildAutofillFieldItem, { timeout: 1000 }); } } @@ -1367,6 +1369,19 @@ export class CollectAutofillContentService implements CollectAutofillContentServ } } + /** + * Validates whether a password field is within the document. + */ + isPasswordFieldWithinDocument(): boolean { + return ( + this.domQueryService.query( + globalThis.document.documentElement, + `input[type="password"]`, + (node: Node) => nodeIsInputElement(node) && node.type === "password", + )?.length > 0 + ); + } + /** * Destroys the CollectAutofillContentService. Clears all * timeouts and disconnects the mutation observer. @@ -1378,84 +1393,4 @@ export class CollectAutofillContentService implements CollectAutofillContentServ this.mutationObserver?.disconnect(); this.intersectionObserver?.disconnect(); } - - /** - * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. - */ - private queryTreeWalkerForAutofillFormAndFieldElements(): { - formElements: HTMLFormElement[]; - formFieldElements: FormFieldElement[]; - } { - const formElements: HTMLFormElement[] = []; - const formFieldElements: FormFieldElement[] = []; - this.domQueryService.queryAllTreeWalkerNodes( - document.documentElement, - (node: Node) => { - if (nodeIsFormElement(node)) { - formElements.push(node); - return true; - } - - if (this.isNodeFormFieldElement(node)) { - formFieldElements.push(node as FormFieldElement); - return true; - } - - return false; - }, - this.mutationObserver, - ); - - return { formElements, formFieldElements }; - } - - /** - * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. - */ - private queryTreeWalkerForAutofillFormFieldElements(): FormFieldElement[] { - return this.domQueryService.queryAllTreeWalkerNodes( - document.documentElement, - (node: Node) => this.isNodeFormFieldElement(node), - this.mutationObserver, - ) as FormFieldElement[]; - } - - /** - * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. - * - * @param node - The node to query - */ - private queryTreeWalkerForMutatedElements(node: Node): HTMLElement[] { - return this.domQueryService.queryAllTreeWalkerNodes( - node, - (walkerNode: Node) => - nodeIsFormElement(walkerNode) || this.isNodeFormFieldElement(walkerNode), - this.mutationObserver, - ) as HTMLElement[]; - } - - /** - * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. - */ - private queryTreeWalkerForPasswordElements(): HTMLElement[] { - return this.domQueryService.queryAllTreeWalkerNodes( - document.documentElement, - (node: Node) => nodeIsInputElement(node) && node.type === "password", - ) as HTMLElement[]; - } - - /** - * This is a temporary method to maintain a fallback strategy for the tree walker API - * - * @deprecated - This method remains as a fallback in the case that the deepQuery implementation fails. - */ - isPasswordFieldWithinDocument(): boolean { - if (this.useTreeWalkerStrategyFlagSet) { - return Boolean(this.queryTreeWalkerForPasswordElements()?.length); - } - - return Boolean( - this.domQueryService.deepQueryElements(document, `input[type="password"]`)?.length, - ); - } } diff --git a/apps/browser/src/autofill/services/dom-query.service.spec.ts b/apps/browser/src/autofill/services/dom-query.service.spec.ts index 22212333fc8..8071a464f44 100644 --- a/apps/browser/src/autofill/services/dom-query.service.spec.ts +++ b/apps/browser/src/autofill/services/dom-query.service.spec.ts @@ -1,21 +1,60 @@ -import { mockQuerySelectorAllDefinedCall } from "../spec/testing-utils"; +import { flushPromises, mockQuerySelectorAllDefinedCall } from "../spec/testing-utils"; import { DomQueryService } from "./dom-query.service"; +jest.mock("../utils", () => { + const actualUtils = jest.requireActual("../utils"); + return { + ...actualUtils, + sendExtensionMessage: jest.fn((command, options) => { + if (command === "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag") { + return Promise.resolve({ result: false }); + } + + return chrome.runtime.sendMessage(Object.assign({ command }, options)); + }), + }; +}); + describe("DomQueryService", () => { + const originalDocumentReadyState = document.readyState; let domQueryService: DomQueryService; let mutationObserver: MutationObserver; const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); - beforeEach(() => { - domQueryService = new DomQueryService(); + beforeEach(async () => { mutationObserver = new MutationObserver(() => {}); + domQueryService = new DomQueryService(); + await flushPromises(); + }); + + afterEach(() => { + Object.defineProperty(document, "readyState", { + value: originalDocumentReadyState, + writable: true, + }); }); afterAll(() => { mockQuerySelectorAll.mockRestore(); }); + it("checks the page content for shadow DOM elements after the page has completed loading", async () => { + Object.defineProperty(document, "readyState", { + value: "loading", + writable: true, + }); + jest.spyOn(globalThis, "addEventListener"); + + const domQueryService = new DomQueryService(); + await flushPromises(); + + expect(globalThis.addEventListener).toHaveBeenCalledWith( + "load", + domQueryService["checkPageContainsShadowDom"], + ); + }); + describe("deepQueryElements", () => { it("queries form field elements that are nested within a ShadowDOM", () => { const root = document.createElement("div"); @@ -26,9 +65,10 @@ describe("DomQueryService", () => { form.appendChild(input); shadowRoot.appendChild(form); - const formFieldElements = domQueryService.deepQueryElements( + const formFieldElements = domQueryService.query( shadowRoot, "input", + (element: Element) => element.tagName === "INPUT", mutationObserver, ); @@ -36,6 +76,7 @@ describe("DomQueryService", () => { }); it("queries form field elements that are nested within multiple ShadowDOM elements", () => { + domQueryService["pageContainsShadowDom"] = true; const root = document.createElement("div"); const shadowRoot1 = root.attachShadow({ mode: "open" }); const root2 = document.createElement("div"); @@ -47,18 +88,50 @@ describe("DomQueryService", () => { shadowRoot2.appendChild(form); shadowRoot1.appendChild(root2); - const formFieldElements = domQueryService.deepQueryElements( + const formFieldElements = domQueryService.query( shadowRoot1, "input", + (element: Element) => element.tagName === "INPUT", mutationObserver, ); expect(formFieldElements).toStrictEqual([input]); }); + + it("will fallback to using the TreeWalker API if a depth larger than 4 ShadowDOM elements is encountered", () => { + domQueryService["pageContainsShadowDom"] = true; + const root = document.createElement("div"); + const shadowRoot1 = root.attachShadow({ mode: "open" }); + const root2 = document.createElement("div"); + const shadowRoot2 = root2.attachShadow({ mode: "open" }); + const root3 = document.createElement("div"); + const shadowRoot3 = root3.attachShadow({ mode: "open" }); + const root4 = document.createElement("div"); + const shadowRoot4 = root4.attachShadow({ mode: "open" }); + const root5 = document.createElement("div"); + const shadowRoot5 = root5.attachShadow({ mode: "open" }); + const form = document.createElement("form"); + const input = document.createElement("input"); + input.type = "text"; + form.appendChild(input); + shadowRoot5.appendChild(form); + shadowRoot4.appendChild(root5); + shadowRoot3.appendChild(root4); + shadowRoot2.appendChild(root3); + shadowRoot1.appendChild(root2); + const treeWalkerCallback = jest + .fn() + .mockImplementation(() => (element: Element) => element.tagName === "INPUT"); + + domQueryService.query(shadowRoot1, "input", treeWalkerCallback, mutationObserver); + + expect(treeWalkerCallback).toHaveBeenCalled(); + }); }); describe("queryAllTreeWalkerNodes", () => { it("queries form field elements that are nested within multiple ShadowDOM elements", () => { + domQueryService["pageContainsShadowDom"] = true; const root = document.createElement("div"); const shadowRoot1 = root.attachShadow({ mode: "open" }); const root2 = document.createElement("div"); @@ -70,8 +143,9 @@ describe("DomQueryService", () => { shadowRoot2.appendChild(form); shadowRoot1.appendChild(root2); - const formFieldElements = domQueryService.queryAllTreeWalkerNodes( + const formFieldElements = domQueryService.query( shadowRoot1, + "input", (element: Element) => element.tagName === "INPUT", mutationObserver, ); diff --git a/apps/browser/src/autofill/services/dom-query.service.ts b/apps/browser/src/autofill/services/dom-query.service.ts index 0d766ea3ba0..570027b2d12 100644 --- a/apps/browser/src/autofill/services/dom-query.service.ts +++ b/apps/browser/src/autofill/services/dom-query.service.ts @@ -1,8 +1,77 @@ -import { nodeIsElement } from "../utils"; +import { EVENTS, MAX_DEEP_QUERY_RECURSION_DEPTH } from "@bitwarden/common/autofill/constants"; + +import { nodeIsElement, sendExtensionMessage } from "../utils"; import { DomQueryService as DomQueryServiceInterface } from "./abstractions/dom-query.service"; export class DomQueryService implements DomQueryServiceInterface { + private pageContainsShadowDom: boolean; + private useTreeWalkerStrategyFlagSet = true; + + constructor() { + void this.init(); + } + + /** + * Sets up a query that will trigger a deepQuery of the DOM, querying all elements that match the given query string. + * If the deepQuery fails or reaches a max recursion depth, it will fall back to a treeWalker query. + * + * @param root - The root element to start the query from + * @param queryString - The query string to match elements against + * @param treeWalkerFilter - The filter callback to use for the treeWalker query + * @param mutationObserver - The MutationObserver to use for observing shadow roots + * @param forceDeepQueryAttempt - Whether to force a deep query attempt + */ + query( + root: Document | ShadowRoot | Element, + queryString: string, + treeWalkerFilter: CallableFunction, + mutationObserver?: MutationObserver, + forceDeepQueryAttempt?: boolean, + ): T[] { + if (!forceDeepQueryAttempt && this.pageContainsShadowDomElements()) { + return this.queryAllTreeWalkerNodes(root, treeWalkerFilter, mutationObserver); + } + + try { + return this.deepQueryElements(root, queryString, mutationObserver); + } catch { + return this.queryAllTreeWalkerNodes(root, treeWalkerFilter, mutationObserver); + } + } + + /** + * Checks if the page contains any shadow DOM elements. + */ + checkPageContainsShadowDom = (): void => { + this.pageContainsShadowDom = this.queryShadowRoots(globalThis.document.body, true).length > 0; + }; + + /** + * Determines whether to use the treeWalker strategy for querying the DOM. + */ + pageContainsShadowDomElements(): boolean { + return this.useTreeWalkerStrategyFlagSet || this.pageContainsShadowDom; + } + + /** + * Initializes the DomQueryService, checking for the presence of shadow DOM elements on the page. + */ + private async init() { + const useTreeWalkerStrategyFlag = await sendExtensionMessage( + "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag", + ); + if (useTreeWalkerStrategyFlag && typeof useTreeWalkerStrategyFlag.result === "boolean") { + this.useTreeWalkerStrategyFlagSet = useTreeWalkerStrategyFlag.result; + } + + if (globalThis.document.readyState === "complete") { + this.checkPageContainsShadowDom(); + return; + } + globalThis.addEventListener(EVENTS.LOAD, this.checkPageContainsShadowDom); + } + /** * Queries all elements in the DOM that match the given query string. * Also, recursively queries all shadow roots for the element. @@ -11,16 +80,25 @@ export class DomQueryService implements DomQueryServiceInterface { * @param queryString - The query string to match elements against * @param mutationObserver - The MutationObserver to use for observing shadow roots */ - deepQueryElements( + private deepQueryElements( root: Document | ShadowRoot | Element, queryString: string, mutationObserver?: MutationObserver, ): T[] { let elements = this.queryElements(root, queryString); - const shadowRoots = this.recursivelyQueryShadowRoots(root, mutationObserver); + + const shadowRoots = this.recursivelyQueryShadowRoots(root); for (let index = 0; index < shadowRoots.length; index++) { const shadowRoot = shadowRoots[index]; elements = elements.concat(this.queryElements(shadowRoot, queryString)); + + if (mutationObserver) { + mutationObserver.observe(shadowRoot, { + attributes: true, + childList: true, + subtree: true, + }); + } } return elements; @@ -46,23 +124,24 @@ export class DomQueryService implements DomQueryServiceInterface { * `isObservingShadowRoot` parameter is set to true. * * @param root - The root element to start the query from - * @param mutationObserver - The MutationObserver to use for observing shadow roots + * @param depth - The depth of the recursion */ private recursivelyQueryShadowRoots( root: Document | ShadowRoot | Element, - mutationObserver?: MutationObserver, + depth: number = 0, ): ShadowRoot[] { + if (!this.pageContainsShadowDom) { + return []; + } + + if (depth >= MAX_DEEP_QUERY_RECURSION_DEPTH) { + throw new Error("Max recursion depth reached"); + } + let shadowRoots = this.queryShadowRoots(root); for (let index = 0; index < shadowRoots.length; index++) { const shadowRoot = shadowRoots[index]; - shadowRoots = shadowRoots.concat(this.recursivelyQueryShadowRoots(shadowRoot)); - if (mutationObserver) { - mutationObserver.observe(shadowRoot, { - attributes: true, - childList: true, - subtree: true, - }); - } + shadowRoots = shadowRoots.concat(this.recursivelyQueryShadowRoots(shadowRoot, depth + 1)); } return shadowRoots; @@ -72,14 +151,23 @@ export class DomQueryService implements DomQueryServiceInterface { * Queries any immediate shadow roots found within the given root element. * * @param root - The root element to start the query from + * @param returnSingleShadowRoot - Whether to return a single shadow root or an array of shadow roots */ - private queryShadowRoots(root: Document | ShadowRoot | Element): ShadowRoot[] { + private queryShadowRoots( + root: Document | ShadowRoot | Element, + returnSingleShadowRoot = false, + ): ShadowRoot[] { const shadowRoots: ShadowRoot[] = []; const potentialShadowRoots = root.querySelectorAll(":defined"); for (let index = 0; index < potentialShadowRoots.length; index++) { const shadowRoot = this.getShadowRoot(potentialShadowRoots[index]); - if (shadowRoot) { - shadowRoots.push(shadowRoot); + if (!shadowRoot) { + continue; + } + + shadowRoots.push(shadowRoot); + if (returnSingleShadowRoot) { + break; } } @@ -121,12 +209,12 @@ export class DomQueryService implements DomQueryServiceInterface { * @param filterCallback * @param mutationObserver */ - queryAllTreeWalkerNodes( + private queryAllTreeWalkerNodes( rootNode: Node, filterCallback: CallableFunction, mutationObserver?: MutationObserver, - ): Node[] { - const treeWalkerQueryResults: Node[] = []; + ): T[] { + const treeWalkerQueryResults: T[] = []; this.buildTreeWalkerNodesQueryResults( rootNode, @@ -147,9 +235,9 @@ export class DomQueryService implements DomQueryServiceInterface { * @param filterCallback * @param mutationObserver */ - private buildTreeWalkerNodesQueryResults( + private buildTreeWalkerNodesQueryResults( rootNode: Node, - treeWalkerQueryResults: Node[], + treeWalkerQueryResults: T[], filterCallback: CallableFunction, mutationObserver?: MutationObserver, ) { @@ -158,7 +246,7 @@ export class DomQueryService implements DomQueryServiceInterface { while (currentNode) { if (filterCallback(currentNode)) { - treeWalkerQueryResults.push(currentNode); + treeWalkerQueryResults.push(currentNode as T); } const nodeShadowRoot = this.getShadowRoot(currentNode); diff --git a/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts b/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts index e5e21c4b021..3541656f4e6 100644 --- a/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts +++ b/apps/browser/src/autofill/services/insert-autofill-content.service.spec.ts @@ -68,6 +68,7 @@ function setMockWindowLocation({ } describe("InsertAutofillContentService", () => { + const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); const inlineMenuFieldQualificationService = mock(); const domQueryService = new DomQueryService(); const domElementVisibilityService = new DomElementVisibilityService(); @@ -82,7 +83,6 @@ describe("InsertAutofillContentService", () => { ); let insertAutofillContentService: InsertAutofillContentService; let fillScript: AutofillScript; - const mockQuerySelectorAll = mockQuerySelectorAllDefinedCall(); beforeEach(() => { document.body.innerHTML = mockLoginForm; diff --git a/apps/browser/src/autofill/spec/testing-utils.ts b/apps/browser/src/autofill/spec/testing-utils.ts index 4bbcd72dda2..a4e7a42eb21 100644 --- a/apps/browser/src/autofill/spec/testing-utils.ts +++ b/apps/browser/src/autofill/spec/testing-utils.ts @@ -176,7 +176,7 @@ export function triggerWebRequestOnCompletedEvent(details: chrome.webRequest.Web export function mockQuerySelectorAllDefinedCall() { const originalDocumentQuerySelectorAll = document.querySelectorAll; - document.querySelectorAll = function (selector: string) { + globalThis.document.querySelectorAll = function (selector: string) { return originalDocumentQuerySelectorAll.call( document, selector === ":defined" ? "*" : selector, diff --git a/apps/browser/src/autofill/utils/index.spec.ts b/apps/browser/src/autofill/utils/index.spec.ts index 36d22ed0cd3..62a707860c3 100644 --- a/apps/browser/src/autofill/utils/index.spec.ts +++ b/apps/browser/src/autofill/utils/index.spec.ts @@ -10,6 +10,7 @@ import { setElementStyles, setupExtensionDisconnectAction, setupAutofillInitDisconnectAction, + debounce, } from "./index"; describe("buildSvgDomElement", () => { @@ -211,3 +212,35 @@ describe("setupAutofillInitDisconnectAction", () => { expect(window.bitwardenAutofillInit).toBeUndefined(); }); }); + +describe("debounce", () => { + const debouncedFunction = jest.fn(); + const debounced = debounce(debouncedFunction, 100); + + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it("does not call the method until the delay is complete", () => { + debounced(); + jest.advanceTimersByTime(50); + expect(debouncedFunction).not.toHaveBeenCalled(); + }); + + it("calls the method a single time when the debounce is triggered multiple times", () => { + debounced(); + debounced(); + debounced(); + jest.advanceTimersByTime(100); + + expect(debouncedFunction).toHaveBeenCalledTimes(1); + }); +}); diff --git a/apps/browser/src/autofill/utils/index.ts b/apps/browser/src/autofill/utils/index.ts index 7c18e7fd127..98c0a97ac56 100644 --- a/apps/browser/src/autofill/utils/index.ts +++ b/apps/browser/src/autofill/utils/index.ts @@ -311,6 +311,18 @@ export function nodeIsFormElement(node: Node): node is HTMLFormElement { return nodeIsElement(node) && elementIsFormElement(node); } +export function nodeIsTypeSubmitElement(node: Node): node is HTMLElement { + return nodeIsElement(node) && getPropertyOrAttribute(node as HTMLElement, "type") === "submit"; +} + +export function nodeIsButtonElement(node: Node): node is HTMLButtonElement { + return ( + nodeIsElement(node) && + (elementIsInstanceOf(node, "button") || + getPropertyOrAttribute(node as HTMLElement, "type") === "button") + ); +} + /** * Returns a boolean representing the attribute value of an element. * @@ -361,6 +373,20 @@ export function throttle(callback: (_args: any) => any, limit: number) { }; } +/** + * Debounces a callback function to run after a delay of `delay` milliseconds. + * + * @param callback - The callback function to debounce. + * @param delay - The time in milliseconds to debounce the callback. + */ +export function debounce(callback: (_args: any) => any, delay: number) { + let timeout: NodeJS.Timeout; + return function (...args: unknown[]) { + globalThis.clearTimeout(timeout); + timeout = globalThis.setTimeout(() => callback.apply(this, args), delay); + }; +} + /** * Gathers and normalizes keywords from a potential submit button element. Used * to verify if the element submits a login or change password form. diff --git a/libs/common/src/autofill/constants/index.ts b/libs/common/src/autofill/constants/index.ts index 4b0ea53ad0d..15005691d29 100644 --- a/libs/common/src/autofill/constants/index.ts +++ b/libs/common/src/autofill/constants/index.ts @@ -107,3 +107,5 @@ export const ExtensionCommand = { export type ExtensionCommandType = (typeof ExtensionCommand)[keyof typeof ExtensionCommand]; export const CLEAR_NOTIFICATION_LOGIN_DATA_DURATION = 60 * 1000; // 1 minute + +export const MAX_DEEP_QUERY_RECURSION_DEPTH = 4; From 16651214ac623fe7e4bddc3707b82599ee7419fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:47:56 -0400 Subject: [PATCH 008/104] [deps] Platform: Update @types/node to v20.16.5 (#11058) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../native-messaging-test-runner/package-lock.json | 8 ++++---- apps/desktop/native-messaging-test-runner/package.json | 2 +- package-lock.json | 8 ++++---- package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/desktop/native-messaging-test-runner/package-lock.json b/apps/desktop/native-messaging-test-runner/package-lock.json index 3343b4b6024..c9bc710b537 100644 --- a/apps/desktop/native-messaging-test-runner/package-lock.json +++ b/apps/desktop/native-messaging-test-runner/package-lock.json @@ -18,7 +18,7 @@ "yargs": "17.7.2" }, "devDependencies": { - "@types/node": "20.16.4", + "@types/node": "20.16.5", "@types/node-ipc": "9.2.3", "typescript": "4.7.4" } @@ -106,9 +106,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.16.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.4.tgz", - "integrity": "sha512-ioyQ1zK9aGEomJ45zz8S8IdzElyxhvP1RVWnPrXDf6wFaUb+kk1tEcVVJkF7RPGM0VWI7cp5U57oCPIn5iN1qg==", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" diff --git a/apps/desktop/native-messaging-test-runner/package.json b/apps/desktop/native-messaging-test-runner/package.json index 595cb9c2e0e..549ffe78fbd 100644 --- a/apps/desktop/native-messaging-test-runner/package.json +++ b/apps/desktop/native-messaging-test-runner/package.json @@ -23,7 +23,7 @@ "yargs": "17.7.2" }, "devDependencies": { - "@types/node": "20.16.4", + "@types/node": "20.16.5", "@types/node-ipc": "9.2.3", "typescript": "4.7.4" }, diff --git a/package-lock.json b/package-lock.json index f3e8b78fc87..1c74fa0cc96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -108,7 +108,7 @@ "@types/koa-json": "2.0.23", "@types/lowdb": "1.0.15", "@types/lunr": "2.3.7", - "@types/node": "20.16.4", + "@types/node": "20.16.5", "@types/node-fetch": "2.6.4", "@types/node-forge": "1.3.11", "@types/node-ipc": "9.2.3", @@ -9401,9 +9401,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.16.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.4.tgz", - "integrity": "sha512-ioyQ1zK9aGEomJ45zz8S8IdzElyxhvP1RVWnPrXDf6wFaUb+kk1tEcVVJkF7RPGM0VWI7cp5U57oCPIn5iN1qg==", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 85ccf459b40..03fcb04b926 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@types/koa-json": "2.0.23", "@types/lowdb": "1.0.15", "@types/lunr": "2.3.7", - "@types/node": "20.16.4", + "@types/node": "20.16.5", "@types/node-fetch": "2.6.4", "@types/node-forge": "1.3.11", "@types/node-ipc": "9.2.3", From 63b6c01a655e1a70c6d56376165f58f5093a287c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:58:04 -0400 Subject: [PATCH 009/104] [deps] Autofill: Update wait-on to v8.0.1 (#11055) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c74fa0cc96..00a0e890bf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -179,7 +179,7 @@ "typescript": "5.1.6", "url": "0.11.3", "util": "0.12.5", - "wait-on": "8.0.0", + "wait-on": "8.0.1", "webpack": "5.94.0", "webpack-cli": "5.1.4", "webpack-dev-server": "5.0.4", @@ -38266,13 +38266,13 @@ } }, "node_modules/wait-on": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.0.tgz", - "integrity": "sha512-fNE5SXinLr2Bt7cJvjvLg2PcXfqznlqRvtE3f8AqYdRZ9BhE+XpsCp1mwQbRoO7s1q7uhAuCw0Ro3mG/KdZjEw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz", + "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.7.4", + "axios": "^1.7.7", "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", diff --git a/package.json b/package.json index 03fcb04b926..3783af2c61d 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "typescript": "5.1.6", "url": "0.11.3", "util": "0.12.5", - "wait-on": "8.0.0", + "wait-on": "8.0.1", "webpack": "5.94.0", "webpack-cli": "5.1.4", "webpack-dev-server": "5.0.4", From 096a2563bb6eb4af8aad95320212c34d9b5c0aba Mon Sep 17 00:00:00 2001 From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com> Date: Mon, 16 Sep 2024 10:23:10 -0400 Subject: [PATCH 010/104] Piped submit text to i18n (#11078) --- .../adjust-payment-dialog-v2.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html index fb1ff3e0d00..e41d3d961cd 100644 --- a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html +++ b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html @@ -9,7 +9,7 @@ +
+

+ {{ "accountSecurity" | i18n }} +

+
+ +
+ +
+
+

{{ "unlockMethods" | i18n }}

+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+

{{ "sessionTimeoutHeader" | i18n }}

+
+ + + {{ + "vaultTimeoutPolicyWithActionInEffect" + | i18n: policy.timeout.hours : policy.timeout.minutes : (policy.action | i18n) + }} + + + {{ "vaultTimeoutPolicyInEffect" | i18n: policy.timeout.hours : policy.timeout.minutes }} + + + {{ "vaultTimeoutActionPolicyInEffect" | i18n: (policy.action | i18n) }} + + + + +
+ + +
+ +
+
+
+

{{ "otherOptions" | i18n }}

+
+ + + + + +
+
+
diff --git a/apps/browser/src/auth/popup/settings/account-security-v1.component.ts b/apps/browser/src/auth/popup/settings/account-security-v1.component.ts new file mode 100644 index 00000000000..4975ba5f7a2 --- /dev/null +++ b/apps/browser/src/auth/popup/settings/account-security-v1.component.ts @@ -0,0 +1,501 @@ +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; +import { FormBuilder } from "@angular/forms"; +import { + BehaviorSubject, + combineLatest, + concatMap, + distinctUntilChanged, + filter, + firstValueFrom, + map, + Observable, + pairwise, + startWith, + Subject, + switchMap, + takeUntil, +} from "rxjs"; + +import { FingerprintDialogComponent } from "@bitwarden/auth/angular"; +import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; +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"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service"; +import { BiometricsService } from "@bitwarden/common/platform/biometrics/biometric.service"; +import { + VaultTimeout, + VaultTimeoutOption, + VaultTimeoutStringType, +} from "@bitwarden/common/types/vault-timeout.type"; +import { DialogService } from "@bitwarden/components"; + +import { BiometricErrors, BiometricErrorTypes } from "../../../models/biometricErrors"; +import { BrowserApi } from "../../../platform/browser/browser-api"; +import { enableAccountSwitching } from "../../../platform/flags"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { SetPinComponent } from "../components/set-pin.component"; + +import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component"; + +@Component({ + selector: "auth-account-security", + templateUrl: "account-security-v1.component.html", +}) +// eslint-disable-next-line rxjs-angular/prefer-takeuntil +export class AccountSecurityComponent implements OnInit, OnDestroy { + protected readonly VaultTimeoutAction = VaultTimeoutAction; + + availableVaultTimeoutActions: VaultTimeoutAction[] = []; + vaultTimeoutOptions: VaultTimeoutOption[]; + vaultTimeoutPolicyCallout: Observable<{ + timeout: { hours: number; minutes: number }; + action: VaultTimeoutAction; + }>; + supportsBiometric: boolean; + showChangeMasterPass = true; + accountSwitcherEnabled = false; + + form = this.formBuilder.group({ + vaultTimeout: [null as VaultTimeout | null], + vaultTimeoutAction: [VaultTimeoutAction.Lock], + pin: [null as boolean | null], + biometric: false, + enableAutoBiometricsPrompt: true, + }); + + private refreshTimeoutSettings$ = new BehaviorSubject(undefined); + private destroy$ = new Subject(); + + constructor( + private accountService: AccountService, + private pinService: PinServiceAbstraction, + private policyService: PolicyService, + private formBuilder: FormBuilder, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService, + private vaultTimeoutService: VaultTimeoutService, + private vaultTimeoutSettingsService: VaultTimeoutSettingsService, + public messagingService: MessagingService, + private environmentService: EnvironmentService, + private cryptoService: CryptoService, + private stateService: StateService, + private userVerificationService: UserVerificationService, + private dialogService: DialogService, + private changeDetectorRef: ChangeDetectorRef, + private biometricStateService: BiometricStateService, + private biometricsService: BiometricsService, + ) { + this.accountSwitcherEnabled = enableAccountSwitching(); + } + + async ngOnInit() { + const maximumVaultTimeoutPolicy = this.policyService.get$(PolicyType.MaximumVaultTimeout); + this.vaultTimeoutPolicyCallout = maximumVaultTimeoutPolicy.pipe( + filter((policy) => policy != null), + map((policy) => { + let timeout; + if (policy.data?.minutes) { + timeout = { + hours: Math.floor(policy.data?.minutes / 60), + minutes: policy.data?.minutes % 60, + }; + } + return { timeout: timeout, action: policy.data?.action }; + }), + ); + + const showOnLocked = + !this.platformUtilsService.isFirefox() && !this.platformUtilsService.isSafari(); + + this.vaultTimeoutOptions = [ + { name: this.i18nService.t("immediately"), value: 0 }, + { name: this.i18nService.t("oneMinute"), value: 1 }, + { name: this.i18nService.t("fiveMinutes"), value: 5 }, + { name: this.i18nService.t("fifteenMinutes"), value: 15 }, + { name: this.i18nService.t("thirtyMinutes"), value: 30 }, + { name: this.i18nService.t("oneHour"), value: 60 }, + { name: this.i18nService.t("fourHours"), value: 240 }, + ]; + + if (showOnLocked) { + this.vaultTimeoutOptions.push({ + name: this.i18nService.t("onLocked"), + value: VaultTimeoutStringType.OnLocked, + }); + } + + this.vaultTimeoutOptions.push({ + name: this.i18nService.t("onRestart"), + value: VaultTimeoutStringType.OnRestart, + }); + this.vaultTimeoutOptions.push({ + name: this.i18nService.t("never"), + value: VaultTimeoutStringType.Never, + }); + + const activeAccount = await firstValueFrom(this.accountService.activeAccount$); + + let timeout = await firstValueFrom( + this.vaultTimeoutSettingsService.getVaultTimeoutByUserId$(activeAccount.id), + ); + if (timeout === VaultTimeoutStringType.OnLocked && !showOnLocked) { + timeout = VaultTimeoutStringType.OnRestart; + } + + const initialValues = { + vaultTimeout: timeout, + vaultTimeoutAction: await firstValueFrom( + this.vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$(activeAccount.id), + ), + pin: await this.pinService.isPinSet(activeAccount.id), + biometric: await this.vaultTimeoutSettingsService.isBiometricLockSet(), + enableAutoBiometricsPrompt: await firstValueFrom( + this.biometricStateService.promptAutomatically$, + ), + }; + this.form.patchValue(initialValues, { emitEvent: false }); + + this.supportsBiometric = await this.biometricsService.supportsBiometric(); + this.showChangeMasterPass = await this.userVerificationService.hasMasterPassword(); + + this.form.controls.vaultTimeout.valueChanges + .pipe( + startWith(initialValues.vaultTimeout), // emit to init pairwise + pairwise(), + concatMap(async ([previousValue, newValue]) => { + await this.saveVaultTimeout(previousValue, newValue); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + + this.form.controls.vaultTimeoutAction.valueChanges + .pipe( + startWith(initialValues.vaultTimeoutAction), // emit to init pairwise + pairwise(), + concatMap(async ([previousValue, newValue]) => { + await this.saveVaultTimeoutAction(previousValue, newValue); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + + this.form.controls.pin.valueChanges + .pipe( + concatMap(async (value) => { + await this.updatePin(value); + this.refreshTimeoutSettings$.next(); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + + this.form.controls.biometric.valueChanges + .pipe( + distinctUntilChanged(), + concatMap(async (enabled) => { + await this.updateBiometric(enabled); + if (enabled) { + this.form.controls.enableAutoBiometricsPrompt.enable(); + } else { + this.form.controls.enableAutoBiometricsPrompt.disable(); + } + this.refreshTimeoutSettings$.next(); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + + this.refreshTimeoutSettings$ + .pipe( + switchMap(() => + combineLatest([ + this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(), + this.vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$(activeAccount.id), + ]), + ), + takeUntil(this.destroy$), + ) + .subscribe(([availableActions, action]) => { + this.availableVaultTimeoutActions = availableActions; + this.form.controls.vaultTimeoutAction.setValue(action, { emitEvent: false }); + // NOTE: The UI doesn't properly update without detect changes. + // I've even tried using an async pipe, but it still doesn't work. I'm not sure why. + // Using an async pipe means that we can't call `detectChanges` AFTER the data has change + // meaning that we are forced to use regular class variables instead of observables. + this.changeDetectorRef.detectChanges(); + }); + + this.refreshTimeoutSettings$ + .pipe( + switchMap(() => + combineLatest([ + this.vaultTimeoutSettingsService.availableVaultTimeoutActions$(), + maximumVaultTimeoutPolicy, + ]), + ), + takeUntil(this.destroy$), + ) + .subscribe(([availableActions, policy]) => { + if (policy?.data?.action || availableActions.length <= 1) { + this.form.controls.vaultTimeoutAction.disable({ emitEvent: false }); + } else { + this.form.controls.vaultTimeoutAction.enable({ emitEvent: false }); + } + }); + } + + async saveVaultTimeout(previousValue: VaultTimeout, newValue: VaultTimeout) { + if (newValue === VaultTimeoutStringType.Never) { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "warning" }, + content: { key: "neverLockWarning" }, + type: "warning", + }); + + if (!confirmed) { + this.form.controls.vaultTimeout.setValue(previousValue, { emitEvent: false }); + return; + } + } + + // The minTimeoutError does not apply to browser because it supports Immediately + // So only check for the policyError + if (this.form.controls.vaultTimeout.hasError("policyError")) { + this.platformUtilsService.showToast( + "error", + null, + this.i18nService.t("vaultTimeoutTooLarge"), + ); + return; + } + + const activeAccount = await firstValueFrom(this.accountService.activeAccount$); + + const vaultTimeoutAction = await firstValueFrom( + this.vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$(activeAccount.id), + ); + + await this.vaultTimeoutSettingsService.setVaultTimeoutOptions( + activeAccount.id, + newValue, + vaultTimeoutAction, + ); + if (newValue === VaultTimeoutStringType.Never) { + this.messagingService.send("bgReseedStorage"); + } + } + + async saveVaultTimeoutAction(previousValue: VaultTimeoutAction, newValue: VaultTimeoutAction) { + if (newValue === VaultTimeoutAction.LogOut) { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "vaultTimeoutLogOutConfirmationTitle" }, + content: { key: "vaultTimeoutLogOutConfirmation" }, + type: "warning", + }); + + if (!confirmed) { + this.form.controls.vaultTimeoutAction.setValue(previousValue, { + emitEvent: false, + }); + return; + } + } + + if (this.form.controls.vaultTimeout.hasError("policyError")) { + this.platformUtilsService.showToast( + "error", + null, + this.i18nService.t("vaultTimeoutTooLarge"), + ); + return; + } + + const activeAccount = await firstValueFrom(this.accountService.activeAccount$); + + await this.vaultTimeoutSettingsService.setVaultTimeoutOptions( + activeAccount.id, + this.form.value.vaultTimeout, + newValue, + ); + this.refreshTimeoutSettings$.next(); + } + + async updatePin(value: boolean) { + if (value) { + const dialogRef = SetPinComponent.open(this.dialogService); + + if (dialogRef == null) { + this.form.controls.pin.setValue(false, { emitEvent: false }); + return; + } + + const userHasPinSet = await firstValueFrom(dialogRef.closed); + this.form.controls.pin.setValue(userHasPinSet, { emitEvent: false }); + } else { + await this.vaultTimeoutSettingsService.clear(); + } + } + + async updateBiometric(enabled: boolean) { + if (enabled && this.supportsBiometric) { + let granted; + try { + granted = await BrowserApi.requestPermission({ permissions: ["nativeMessaging"] }); + } catch (e) { + // eslint-disable-next-line + console.error(e); + + if (this.platformUtilsService.isFirefox() && BrowserPopupUtils.inSidebar(window)) { + await this.dialogService.openSimpleDialog({ + title: { key: "nativeMessaginPermissionSidebarTitle" }, + content: { key: "nativeMessaginPermissionSidebarDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "info", + }); + + this.form.controls.biometric.setValue(false); + return; + } + } + + if (!granted) { + await this.dialogService.openSimpleDialog({ + title: { key: "nativeMessaginPermissionErrorTitle" }, + content: { key: "nativeMessaginPermissionErrorDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "danger", + }); + + this.form.controls.biometric.setValue(false); + return; + } + + const awaitDesktopDialogRef = AwaitDesktopDialogComponent.open(this.dialogService); + const awaitDesktopDialogClosed = firstValueFrom(awaitDesktopDialogRef.closed); + + await this.cryptoService.refreshAdditionalKeys(); + + await Promise.race([ + awaitDesktopDialogClosed.then(async (result) => { + if (result !== true) { + this.form.controls.biometric.setValue(false); + } + }), + this.biometricsService + .authenticateBiometric() + .then((result) => { + this.form.controls.biometric.setValue(result); + if (!result) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorEnableBiometricTitle"), + this.i18nService.t("errorEnableBiometricDesc"), + ); + } + }) + .catch((e) => { + // Handle connection errors + this.form.controls.biometric.setValue(false); + + const error = BiometricErrors[e.message as BiometricErrorTypes]; + + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.dialogService.openSimpleDialog({ + title: { key: error.title }, + content: { key: error.description }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "danger", + }); + }) + .finally(() => { + awaitDesktopDialogRef.close(true); + }), + ]); + } else { + await this.biometricStateService.setBiometricUnlockEnabled(false); + await this.biometricStateService.setFingerprintValidated(false); + } + } + + async updateAutoBiometricsPrompt() { + await this.biometricStateService.setPromptAutomatically( + this.form.value.enableAutoBiometricsPrompt, + ); + } + + async changePassword() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "continueToWebApp" }, + content: { key: "changeMasterPasswordOnWebConfirmation" }, + type: "info", + acceptButtonText: { key: "continue" }, + }); + if (confirmed) { + const env = await firstValueFrom(this.environmentService.environment$); + await BrowserApi.createNewTab(env.getWebVaultUrl()); + } + } + + async twoStep() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "twoStepLogin" }, + content: { key: "twoStepLoginConfirmation" }, + type: "info", + }); + if (confirmed) { + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + BrowserApi.createNewTab("https://bitwarden.com/help/setup-two-step-login/"); + } + } + + async fingerprint() { + const fingerprint = await this.cryptoService.getFingerprint( + await this.stateService.getUserId(), + ); + + const dialogRef = FingerprintDialogComponent.open(this.dialogService, { + fingerprint, + }); + + return firstValueFrom(dialogRef.closed); + } + + async lock() { + await this.vaultTimeoutService.lock(); + } + + async logOut() { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "logOut" }, + content: { key: "logOutConfirmation" }, + type: "info", + }); + + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + if (confirmed) { + this.messagingService.send("logout", { userId: userId }); + } + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/apps/browser/src/auth/popup/settings/account-security.component.html b/apps/browser/src/auth/popup/settings/account-security.component.html index dff9675743f..af6525daa8a 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.html +++ b/apps/browser/src/auth/popup/settings/account-security.component.html @@ -1,140 +1,126 @@ - -
- -
-

- {{ "accountSecurity" | i18n }} -

-
- -
-
-
-
-

{{ "unlockMethods" | i18n }}

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

{{ "sessionTimeoutHeader" | i18n }}

-
- - - {{ - "vaultTimeoutPolicyWithActionInEffect" - | i18n: policy.timeout.hours : policy.timeout.minutes : (policy.action | i18n) - }} - - - {{ "vaultTimeoutPolicyInEffect" | i18n: policy.timeout.hours : policy.timeout.minutes }} - - - {{ "vaultTimeoutActionPolicyInEffect" | i18n: (policy.action | i18n) }} - - - - -
- - + {{ + "unlockWithBiometrics" | i18n + }} + + + + {{ + "enableAutoBiometricsPrompt" | i18n + }} + + - - -
- -
-
-
-

{{ "otherOptions" | i18n }}

-
- - - - + + + + + + + + +
{{ "lockNow" | i18n }}
- - -
{{ "logOut" | i18n }}
- - -
+ +
-
+ diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 25401f06f38..8e0acc7d641 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -1,15 +1,15 @@ import { DialogRef } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; -import { FormBuilder } from "@angular/forms"; +import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { RouterModule } from "@angular/router"; import { BehaviorSubject, combineLatest, concatMap, distinctUntilChanged, - filter, firstValueFrom, map, - Observable, pairwise, startWith, Subject, @@ -17,7 +17,8 @@ import { takeUntil, } from "rxjs"; -import { FingerprintDialogComponent } from "@bitwarden/auth/angular"; +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { FingerprintDialogComponent, VaultTimeoutInputComponent } from "@bitwarden/auth/angular"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; @@ -39,30 +40,67 @@ import { VaultTimeoutOption, VaultTimeoutStringType, } from "@bitwarden/common/types/vault-timeout.type"; -import { DialogService, ToastService } from "@bitwarden/components"; +import { + CardComponent, + CheckboxModule, + DialogService, + FormFieldModule, + IconButtonModule, + ItemModule, + LinkModule, + SectionComponent, + SectionHeaderComponent, + SelectModule, + TypographyModule, + ToastService, +} from "@bitwarden/components"; import { BiometricErrors, BiometricErrorTypes } from "../../../models/biometricErrors"; import { BrowserApi } from "../../../platform/browser/browser-api"; import { enableAccountSwitching } from "../../../platform/flags"; import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; import { SetPinComponent } from "../components/set-pin.component"; import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component"; @Component({ - selector: "auth-account-security", templateUrl: "account-security.component.html", + standalone: true, + imports: [ + CardComponent, + CheckboxModule, + CommonModule, + FormFieldModule, + FormsModule, + ReactiveFormsModule, + IconButtonModule, + ItemModule, + JslibModule, + LinkModule, + PopOutComponent, + PopupFooterComponent, + PopupHeaderComponent, + PopupPageComponent, + RouterModule, + SectionComponent, + SectionHeaderComponent, + SelectModule, + TypographyModule, + VaultTimeoutInputComponent, + ], }) // eslint-disable-next-line rxjs-angular/prefer-takeuntil export class AccountSecurityComponent implements OnInit, OnDestroy { protected readonly VaultTimeoutAction = VaultTimeoutAction; + showMasterPasswordOnClientRestartOption = true; availableVaultTimeoutActions: VaultTimeoutAction[] = []; - vaultTimeoutOptions: VaultTimeoutOption[]; - vaultTimeoutPolicyCallout: Observable<{ - timeout: { hours: number; minutes: number }; - action: VaultTimeoutAction; - }>; + vaultTimeoutOptions: VaultTimeoutOption[] = []; + hasVaultTimeoutPolicy = false; supportsBiometric: boolean; showChangeMasterPass = true; accountSwitcherEnabled = false; @@ -71,6 +109,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { vaultTimeout: [null as VaultTimeout | null], vaultTimeoutAction: [VaultTimeoutAction.Lock], pin: [null as boolean | null], + pinLockWithMasterPassword: false, biometric: false, enableAutoBiometricsPrompt: true, }); @@ -102,20 +141,12 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { } async ngOnInit() { + const hasMasterPassword = await this.userVerificationService.hasMasterPassword(); + this.showMasterPasswordOnClientRestartOption = hasMasterPassword; const maximumVaultTimeoutPolicy = this.policyService.get$(PolicyType.MaximumVaultTimeout); - this.vaultTimeoutPolicyCallout = maximumVaultTimeoutPolicy.pipe( - filter((policy) => policy != null), - map((policy) => { - let timeout; - if (policy.data?.minutes) { - timeout = { - hours: Math.floor(policy.data?.minutes / 60), - minutes: policy.data?.minutes % 60, - }; - } - return { timeout: timeout, action: policy.data?.action }; - }), - ); + if ((await firstValueFrom(this.policyService.get$(PolicyType.MaximumVaultTimeout))) != null) { + this.hasVaultTimeoutPolicy = true; + } const showOnLocked = !this.platformUtilsService.isFirefox() && !this.platformUtilsService.isSafari(); @@ -161,6 +192,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { this.vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$(activeAccount.id), ), pin: await this.pinService.isPinSet(activeAccount.id), + pinLockWithMasterPassword: + (await this.pinService.getPinLockType(activeAccount.id)) == "EPHEMERAL", biometric: await this.vaultTimeoutSettingsService.isBiometricLockSet(), enableAutoBiometricsPrompt: await firstValueFrom( this.biometricStateService.promptAutomatically$, @@ -185,9 +218,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { this.form.controls.vaultTimeoutAction.valueChanges .pipe( startWith(initialValues.vaultTimeoutAction), // emit to init pairwise - pairwise(), - concatMap(async ([previousValue, newValue]) => { - await this.saveVaultTimeoutAction(previousValue, newValue); + map(async (value) => { + await this.saveVaultTimeoutAction(value); }), takeUntil(this.destroy$), ) @@ -203,6 +235,22 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { ) .subscribe(); + this.form.controls.pinLockWithMasterPassword.valueChanges + .pipe( + concatMap(async (value) => { + const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const pinKeyEncryptedUserKey = + (await this.pinService.getPinKeyEncryptedUserKeyPersistent(userId)) || + (await this.pinService.getPinKeyEncryptedUserKeyEphemeral(userId)); + await this.pinService.clearPinKeyEncryptedUserKeyPersistent(userId); + await this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); + await this.pinService.storePinKeyEncryptedUserKey(pinKeyEncryptedUserKey, value, userId); + this.refreshTimeoutSettings$.next(); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + this.form.controls.biometric.valueChanges .pipe( distinctUntilChanged(), @@ -219,6 +267,15 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { ) .subscribe(); + this.form.controls.enableAutoBiometricsPrompt.valueChanges + .pipe( + concatMap(async (enabled) => { + await this.biometricStateService.setPromptAutomatically(enabled); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + this.refreshTimeoutSettings$ .pipe( switchMap(() => @@ -272,17 +329,6 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { } } - // The minTimeoutError does not apply to browser because it supports Immediately - // So only check for the policyError - if (this.form.controls.vaultTimeout.hasError("policyError")) { - this.toastService.showToast({ - variant: "error", - title: null, - message: this.i18nService.t("vaultTimeoutTooLarge"), - }); - return; - } - const activeAccount = await firstValueFrom(this.accountService.activeAccount$); const vaultTimeoutAction = await firstValueFrom( @@ -299,8 +345,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { } } - async saveVaultTimeoutAction(previousValue: VaultTimeoutAction, newValue: VaultTimeoutAction) { - if (newValue === VaultTimeoutAction.LogOut) { + async saveVaultTimeoutAction(value: VaultTimeoutAction) { + if (value === VaultTimeoutAction.LogOut) { const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "vaultTimeoutLogOutConfirmationTitle" }, content: { key: "vaultTimeoutLogOutConfirmation" }, @@ -308,7 +354,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { }); if (!confirmed) { - this.form.controls.vaultTimeoutAction.setValue(previousValue, { + this.form.controls.vaultTimeoutAction.setValue(VaultTimeoutAction.Lock, { emitEvent: false, }); return; @@ -329,7 +375,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { await this.vaultTimeoutSettingsService.setVaultTimeoutOptions( activeAccount.id, this.form.value.vaultTimeout, - newValue, + value, ); this.refreshTimeoutSettings$.next(); } @@ -343,8 +389,13 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { return; } + const userId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((account) => account.id)), + ); const userHasPinSet = await firstValueFrom(dialogRef.closed); this.form.controls.pin.setValue(userHasPinSet, { emitEvent: false }); + const requireReprompt = (await this.pinService.getPinLockType(userId)) == "EPHEMERAL"; + this.form.controls.pinLockWithMasterPassword.setValue(requireReprompt, { emitEvent: false }); } else { await this.vaultTimeoutSettingsService.clear(); } @@ -386,77 +437,91 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { return; } - let awaitDesktopDialogRef: DialogRef | undefined; - let biometricsResponseReceived = false; - await this.cryptoService.refreshAdditionalKeys(); - const waitForUserDialogPromise = async () => { - // only show waiting dialog if we have waited for 200 msec to prevent double dialog - // the os will respond instantly if the dialog shows successfully, and the desktop app will respond instantly if something is wrong - await new Promise((resolve) => setTimeout(resolve, 200)); - if (biometricsResponseReceived) { + const successful = await this.trySetupBiometrics(); + this.form.controls.biometric.setValue(successful); + if (!successful) { + await this.biometricStateService.setBiometricUnlockEnabled(false); + await this.biometricStateService.setFingerprintValidated(false); + } + } + } + + async trySetupBiometrics(): Promise { + let awaitDesktopDialogRef: DialogRef | undefined; + let biometricsResponseReceived = false; + let setupResult = false; + + const waitForUserDialogPromise = async () => { + // only show waiting dialog if we have waited for 500 msec to prevent double dialog + // the os will respond instantly if the dialog shows successfully, and the desktop app will respond instantly if something is wrong + await new Promise((resolve) => setTimeout(resolve, 500)); + if (biometricsResponseReceived) { + return; + } + + awaitDesktopDialogRef = AwaitDesktopDialogComponent.open(this.dialogService); + await firstValueFrom(awaitDesktopDialogRef.closed); + if (!biometricsResponseReceived) { + setupResult = false; + } + return; + }; + + const biometricsPromise = async () => { + try { + const result = await this.biometricsService.authenticateBiometric(); + + // prevent duplicate dialog + biometricsResponseReceived = true; + if (awaitDesktopDialogRef) { + awaitDesktopDialogRef.close(result); + } + + if (!result) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorEnableBiometricTitle"), + this.i18nService.t("errorEnableBiometricDesc"), + ); + } + setupResult = true; + } catch (e) { + // prevent duplicate dialog + biometricsResponseReceived = true; + if (awaitDesktopDialogRef) { + awaitDesktopDialogRef.close(true); + } + + if (e.message == "canceled") { + setupResult = false; return; } - awaitDesktopDialogRef = AwaitDesktopDialogComponent.open(this.dialogService); - const result = await firstValueFrom(awaitDesktopDialogRef.closed); - if (result !== true) { - this.form.controls.biometric.setValue(false); + const error = BiometricErrors[e.message as BiometricErrorTypes]; + const shouldRetry = await this.dialogService.openSimpleDialog({ + title: { key: error.title }, + content: { key: error.description }, + acceptButtonText: { key: "retry" }, + cancelButtonText: null, + type: "danger", + }); + if (shouldRetry) { + setupResult = await this.trySetupBiometrics(); + } else { + setupResult = false; + return; } - }; - - const biometricsPromise = async () => { - try { - const result = await this.biometricsService.authenticateBiometric(); - - // prevent duplicate dialog - biometricsResponseReceived = true; - if (awaitDesktopDialogRef) { - awaitDesktopDialogRef.close(true); - } - - this.form.controls.biometric.setValue(result); - if (!result) { - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorEnableBiometricTitle"), - message: this.i18nService.t("errorEnableBiometricDesc"), - }); - } - } catch (e) { - // prevent duplicate dialog - biometricsResponseReceived = true; - if (awaitDesktopDialogRef) { - awaitDesktopDialogRef.close(true); - } - - this.form.controls.biometric.setValue(false); - - if (e.message == "canceled") { - return; - } - - const error = BiometricErrors[e.message as BiometricErrorTypes]; - await this.dialogService.openSimpleDialog({ - title: { key: error.title }, - content: { key: error.description }, - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - type: "danger", - }); - } finally { - if (awaitDesktopDialogRef) { - awaitDesktopDialogRef.close(true); - } + } finally { + if (awaitDesktopDialogRef) { + awaitDesktopDialogRef.close(true); } - }; + } + }; - await Promise.race([waitForUserDialogPromise(), biometricsPromise()]); - } else { - await this.biometricStateService.setBiometricUnlockEnabled(false); - await this.biometricStateService.setFingerprintValidated(false); - } + await Promise.all([waitForUserDialogPromise(), biometricsPromise()]); + return setupResult; } async updateAutoBiometricsPrompt() { @@ -471,6 +536,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { content: { key: "changeMasterPasswordOnWebConfirmation" }, type: "info", acceptButtonText: { key: "continue" }, + cancelButtonText: { key: "cancel" }, }); if (confirmed) { const env = await firstValueFrom(this.environmentService.environment$); @@ -480,9 +546,11 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { async twoStep() { const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "twoStepLogin" }, - content: { key: "twoStepLoginConfirmation" }, + title: { key: "twoStepLoginConfirmationTitle" }, + content: { key: "twoStepLoginConfirmationContent" }, type: "info", + acceptButtonText: { key: "continue" }, + cancelButtonText: { key: "cancel" }, }); if (confirmed) { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 0f6a9d9248d..14f35a78fb3 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -41,6 +41,7 @@ import { LoginComponent } from "../auth/popup/login.component"; import { RegisterComponent } from "../auth/popup/register.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; +import { AccountSecurityComponent as AccountSecurityV1Component } from "../auth/popup/settings/account-security-v1.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; import { SsoComponent } from "../auth/popup/sso.component"; import { TwoFactorAuthComponent } from "../auth/popup/two-factor-auth.component"; @@ -296,12 +297,11 @@ const routes: Routes = [ canActivate: [authGuard], data: { state: "autofill" }, }), - { + ...extensionRefreshSwap(AccountSecurityV1Component, AccountSecurityComponent, { path: "account-security", - component: AccountSecurityComponent, canActivate: [authGuard], data: { state: "account-security" }, - }, + }), ...extensionRefreshSwap(NotificationsSettingsV1Component, NotificationsSettingsComponent, { path: "notifications", canActivate: [authGuard], diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index f14dafacb70..d5777215b19 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -15,7 +15,7 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; import { ColorPasswordCountPipe } from "@bitwarden/angular/pipes/color-password-count.pipe"; import { ColorPasswordPipe } from "@bitwarden/angular/pipes/color-password.pipe"; import { UserVerificationDialogComponent } from "@bitwarden/auth/angular"; -import { AvatarModule, ButtonModule, ToastModule } from "@bitwarden/components"; +import { AvatarModule, ButtonModule, FormFieldModule, ToastModule } from "@bitwarden/components"; import { AccountComponent } from "../auth/popup/account-switching/account.component"; import { CurrentAccountComponent } from "../auth/popup/account-switching/current-account.component"; @@ -30,6 +30,7 @@ import { LoginComponent } from "../auth/popup/login.component"; import { RegisterComponent } from "../auth/popup/register.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; +import { AccountSecurityComponent as AccountSecurityComponentV1 } from "../auth/popup/settings/account-security-v1.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; import { VaultTimeoutInputComponent } from "../auth/popup/settings/vault-timeout-input.component"; import { SsoComponent } from "../auth/popup/sso.component"; @@ -98,6 +99,7 @@ import "../platform/popup/locales"; A11yModule, AppRoutingModule, AutofillComponent, + AccountSecurityComponent, ToastModule.forRoot({ maxOpened: 2, autoDismiss: true, @@ -132,6 +134,7 @@ import "../platform/popup/locales"; HeaderComponent, UserVerificationDialogComponent, CurrentAccountComponent, + FormFieldModule, ExtensionAnonLayoutWrapperComponent, ], declarations: [ @@ -171,7 +174,6 @@ import "../platform/popup/locales"; SendListComponent, SendTypeComponent, SetPasswordComponent, - AccountSecurityComponent, SettingsComponent, VaultSettingsComponent, ShareComponent, @@ -183,6 +185,7 @@ import "../platform/popup/locales"; TwoFactorOptionsComponent, UpdateTempPasswordComponent, UserVerificationComponent, + AccountSecurityComponentV1, VaultTimeoutInputComponent, ViewComponent, ViewCustomFieldsComponent, diff --git a/apps/desktop/src/auth/components/set-pin.component.html b/apps/desktop/src/auth/components/set-pin.component.html index 50e7aca75f3..cadd5340bb2 100644 --- a/apps/desktop/src/auth/components/set-pin.component.html +++ b/apps/desktop/src/auth/components/set-pin.component.html @@ -22,7 +22,7 @@ bitCheckbox formControlName="requireMasterPasswordOnClientRestart" /> - {{ "lockWithMasterPassOnRestart" | i18n }} + {{ "lockWithMasterPassOnRestart1" | i18n }}
diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 721faa25675..bd9ad5075b4 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -942,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1567,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -2099,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 340acc8efb5..7b518e4899d 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -1024,8 +1024,8 @@ "unexpectedError": { "message": "An unexpected error has occurred." }, - "expirationDateError" : { - "message":"Please select an expiration date that is in the future." + "expirationDateError": { + "message": "Please select an expiration date that is in the future." }, "emailAddress": { "message": "Email address" @@ -1033,8 +1033,8 @@ "yourVaultIsLockedV2": { "message": "Your vault is locked" }, - "uuid":{ - "message" : "UUID" + "uuid": { + "message": "UUID" }, "unlock": { "message": "Unlock" @@ -1270,10 +1270,10 @@ "copyUuid": { "message": "Copy UUID" }, - "errorRefreshingAccessToken":{ + "errorRefreshingAccessToken": { "message": "Access Token Refresh Error" }, - "errorRefreshingAccessTokenDesc":{ + "errorRefreshingAccessTokenDesc": { "message": "No refresh token or API keys found. Please try logging out and logging back in." }, "warning": { @@ -3993,6 +3993,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4997,7 +5000,7 @@ "youNeedApprovalFromYourAdminToTrySecretsManager": { "message": "You need approval from your administrator to try Secrets Manager." }, - "smAccessRequestEmailSent" : { + "smAccessRequestEmailSent": { "message": "Access request for secrets manager email sent to admins." }, "requestAccessSMDefaultEmailContent": { @@ -5006,8 +5009,8 @@ "giveMembersAccess": { "message": "Give members access:" }, - "viewAndSelectTheMembers" : { - "message" :"view and select the members you want to give access to Secrets Manager." + "viewAndSelectTheMembers": { + "message": "view and select the members you want to give access to Secrets Manager." }, "openYourOrganizations": { "message": "Open your organization's" @@ -5471,6 +5474,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5497,9 +5513,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -5944,10 +5957,10 @@ "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, - "selfHostedCustomEnvHeader" :{ + "selfHostedCustomEnvHeader": { "message": "For advanced configuration, you can specify the base URL of each service independently." }, - "selfHostedEnvFormInvalid" :{ + "selfHostedEnvFormInvalid": { "message": "You must add either the base Server URL or at least one custom environment." }, "apiUrl": { @@ -7709,7 +7722,7 @@ } } }, - "verificationRequired" : { + "verificationRequired": { "message": "Verification required", "description": "Default title for the user verification dialog." }, @@ -8501,7 +8514,7 @@ "deleteProviderRecoverConfirmDesc": { "message": "You have requested to delete this Provider. Use the button below to confirm." }, - "deleteProviderWarning": { + "deleteProviderWarning": { "message": "Deleting your provider is permanent. It cannot be undone." }, "errorAssigningTargetCollection": { @@ -8514,7 +8527,7 @@ "message": "Integrations & SDKs", "description": "The title for the section that deals with integrations and SDKs." }, - "integrations":{ + "integrations": { "message": "Integrations" }, "integrationsDesc": { @@ -8585,7 +8598,7 @@ }, "createdNewClient": { "message": "Successfully created new client" - }, + }, "noAccess": { "message": "No access" }, @@ -8821,11 +8834,11 @@ "placeholders": { "value": { "content": "$1", - "example":"increments of 100,000" + "example": "increments of 100,000" } } }, - "providerReinstate":{ + "providerReinstate": { "message": " Contact Customer Support to reinstate your subscription." }, "secretPeopleDescription": { diff --git a/libs/auth/src/angular/fingerprint-dialog/fingerprint-dialog.component.html b/libs/auth/src/angular/fingerprint-dialog/fingerprint-dialog.component.html index 9a534d461c4..d6005c970f7 100644 --- a/libs/auth/src/angular/fingerprint-dialog/fingerprint-dialog.component.html +++ b/libs/auth/src/angular/fingerprint-dialog/fingerprint-dialog.component.html @@ -1,8 +1,10 @@ - {{ "yourAccountsFingerprint" | i18n }}: + {{ "yourAccountsFingerprint" | i18n }}: - {{ data.fingerprint.join("-") }} + {{ data.fingerprint.join("-") }} - - {{ "vaultTimeout" | i18n }} +
+ + {{ "vaultTimeout1" | i18n }} - {{ - ((canLockVault$ | async) ? "vaultTimeoutDesc" : "vaultTimeoutLogoutDesc") | i18n - }}
- - {{ "customVaultTimeout" | i18n }} - - {{ "hours" | i18n }} + + + {{ "hours" | i18n }} - - - {{ "minutes" | i18n }} + + + {{ "minutes" | i18n }}
- + + {{ "vaultTimeoutPolicyInEffect1" | i18n: vaultTimeoutPolicyHours : vaultTimeoutPolicyMinutes }} + + {{ "vaultCustomTimeoutMinimum" | i18n }} + + + {{ + "vaultTimeoutPolicyMaximumError" | i18n: vaultTimeoutPolicyHours : vaultTimeoutPolicyMinutes + }} +
diff --git a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts index 7c760835603..d42e7d7d15b 100644 --- a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts +++ b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts @@ -55,16 +55,41 @@ type VaultTimeoutFormValue = VaultTimeoutForm["value"]; export class VaultTimeoutInputComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy, OnChanges { + protected readonly VaultTimeoutAction = VaultTimeoutAction; + get showCustom() { return this.form.get("vaultTimeout").value === VaultTimeoutInputComponent.CUSTOM_VALUE; } - get exceedsMinimumTimout(): boolean { + get exceedsMinimumTimeout(): boolean { return ( !this.showCustom || this.customTimeInMinutes() > VaultTimeoutInputComponent.MIN_CUSTOM_MINUTES ); } + get exceedsMaximumTimeout(): boolean { + return ( + this.showCustom && + this.customTimeInMinutes() > + this.vaultTimeoutPolicyMinutes + 60 * this.vaultTimeoutPolicyHours + ); + } + + get filteredVaultTimeoutOptions(): VaultTimeoutOption[] { + // by policy max value + if (this.vaultTimeoutPolicy == null || this.vaultTimeoutPolicy.data == null) { + return this.vaultTimeoutOptions; + } + + return this.vaultTimeoutOptions.filter((option) => { + if (typeof option.value === "number") { + return option.value <= this.vaultTimeoutPolicy.data.minutes; + } + + return false; + }); + } + static CUSTOM_VALUE = -100; static MIN_CUSTOM_MINUTES = 0; @@ -77,6 +102,7 @@ export class VaultTimeoutInputComponent }); @Input() vaultTimeoutOptions: VaultTimeoutOption[]; + vaultTimeoutPolicy: Policy; vaultTimeoutPolicyHours: number; vaultTimeoutPolicyMinutes: number; @@ -207,7 +233,7 @@ export class VaultTimeoutInputComponent return { policyError: true }; } - if (!this.exceedsMinimumTimout) { + if (!this.exceedsMinimumTimeout) { return { minTimeoutError: true }; } From f2142e318ec335c02b284d5fc5f8d0ac4057dc6e Mon Sep 17 00:00:00 2001 From: Vince Grassia <593223+vgrassia@users.noreply.github.com> Date: Mon, 16 Sep 2024 13:15:34 -0400 Subject: [PATCH 014/104] BRE-315 - Update workflow to push to TestFlight on protected branches (#11082) --- .github/workflows/build-desktop.yml | 67 +++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 8ac65d257c6..8170f1eef00 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -738,7 +738,7 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - "### MacOS GitHub build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append + Write-Output "### MacOS GitHub build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci @@ -879,6 +879,13 @@ jobs: with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + - name: Retrieve Slack secret + id: retrieve-slack-secret + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: bitwarden-ci + secrets: "slack-bot-token" + - name: Download Provisioning Profiles secrets env: ACCOUNT_NAME: bitwardenci @@ -955,7 +962,7 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - "### MacOS App Store build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append + Write-Output "### MacOS App Store build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci @@ -1016,16 +1023,60 @@ jobs: if-no-files-found: error - name: Deploy to TestFlight + id: testflight-deploy if: | (github.ref == 'refs/heads/main' - && needs.setup.outputs.rc_branch_exists == 0 - && needs.setup.outputs.hotfix_branch_exists == 0) - || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) - || github.ref == 'refs/heads/hotfix-rc-desktop' + || github.ref == 'refs/heads/rc' + || github.ref == 'refs/heads/hotfix-rc-desktop') env: APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP - run: npm run upload:mas + run: | + xcrun altool \ + --upload-app \ + --type macos \ + --file "$(find ./dist/mas-universal/Bitwarden*.pkg)" \ + --apiKey $APP_STORE_CONNECT_AUTH_KEY \ + --apiIssuer $APP_STORE_CONNECT_TEAM_ISSUER \ + &> output.txt + + UUID=$(cat output.txt | grep "Delivery UUID" | sed -E 's/Delivery UUID: (.*)/\1/') + echo "uuid=$UUID" >> $GITHUB_OUTPUT + + - name: Post message to a Slack channel + id: slack-message + if: | + (github.ref == 'refs/heads/main' + || github.ref == 'refs/heads/rc' + || github.ref == 'refs/heads/hotfix-rc-desktop') + uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + with: + channel-id: C074F5UESQ0 + payload: | + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Desktop client v${{ env._PACKAGE_VERSION }} <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|build> success on *${{ github.ref_name }}*" + }, + "accessory": { + "type": "button", + "text": { + "type": "plain_text", + "text": "TestFlight Build", + "emoji": true + }, + "url": "https://appstoreconnect.apple.com/teams/${{ env.APP_STORE_CONNECT_TEAM_ISSUER }}/apps/1352778147/testflight/macos/${{ env.BUILD_UUID }}" + } + } + ] + } + env: + APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + SLACK_BOT_TOKEN: ${{ steps.retrieve-slack-secret.outputs.slack-bot-token }} + BUILD_UUID: ${{ steps.testflight-deploy.outputs.uuid }} macos-package-dev: @@ -1158,7 +1209,7 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - "### MacOS Dev build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append + Write-Output "### MacOS Dev build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci From 51a2ec393c3174a2a3ed477431c748e4b9955692 Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Mon, 16 Sep 2024 14:08:01 -0400 Subject: [PATCH 015/104] [PM-11693] Restoring/permanently deleting item from View item page takes you to Vault page (#10995) * route to trash after restore or delete * route to trash after restore or delete --- .../popup/components/vault-v2/view-v2/view-v2.component.ts | 5 +++-- .../trash-list-items-container.component.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index 1505d98ede2..4025beb685b 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -152,7 +152,8 @@ export class ViewV2Component { return false; } - await this.router.navigate(["/vault"]); + const successRoute = this.cipher.isDeleted ? "/trash" : "/vault"; + await this.router.navigate([successRoute]); this.toastService.showToast({ variant: "success", title: null, @@ -169,7 +170,7 @@ export class ViewV2Component { this.logService.error(e); } - await this.router.navigate(["/vault"]); + await this.router.navigate(["/trash"]); this.toastService.showToast({ variant: "success", title: null, diff --git a/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts b/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts index 6d3bfc24838..de9d95aab00 100644 --- a/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts +++ b/apps/browser/src/vault/popup/settings/trash-list-items-container/trash-list-items-container.component.ts @@ -58,7 +58,7 @@ export class TrashListItemsContainerComponent { try { await this.cipherService.restoreWithServer(cipher.id); - await this.router.navigate(["/vault"]); + await this.router.navigate(["/trash"]); this.toastService.showToast({ variant: "success", title: null, @@ -89,7 +89,7 @@ export class TrashListItemsContainerComponent { try { await this.cipherService.deleteWithServer(cipher.id); - await this.router.navigate(["/vault"]); + await this.router.navigate(["/trash"]); this.toastService.showToast({ variant: "success", title: null, From 26f3dcfc66d246e44976fb598fc65f3366581152 Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:02:20 -0500 Subject: [PATCH 016/104] add back events for browser refresh extension (#11085) - something went sideways in a merge --- .../add-edit/add-edit-v2.component.spec.ts | 56 +++++++++++++++++++ .../add-edit/add-edit-v2.component.ts | 12 ++++ .../view-v2/view-v2.component.spec.ts | 19 +++++++ .../vault-v2/view-v2/view-v2.component.ts | 10 ++++ .../card-details-section.component.html | 2 + .../card-details-section.component.spec.ts | 2 + .../card-details-section.component.ts | 20 +++++++ .../custom-fields.component.html | 1 + .../custom-fields.component.spec.ts | 3 + .../custom-fields/custom-fields.component.ts | 18 ++++++ .../login-details-section.component.html | 2 + .../login-details-section.component.spec.ts | 34 +++++++++++ .../login-details-section.component.ts | 22 ++++++++ .../card-details-view.component.html | 3 + .../card-details-view.component.ts | 27 ++++++++- .../cipher-view/cipher-view.component.html | 5 +- .../custom-fields-v2.component.html | 11 +++- .../custom-fields-v2.component.ts | 34 +++++++++-- .../login-credentials-view.component.html | 1 + .../login-credentials-view.component.ts | 25 ++++++++- .../copy-cipher-field.service.spec.ts | 2 + .../src/services/copy-cipher-field.service.ts | 7 ++- 22 files changed, 300 insertions(+), 16 deletions(-) diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts index 77a50ea35d9..ebfb1ff765f 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.spec.ts @@ -3,6 +3,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -44,12 +46,14 @@ describe("AddEditV2Component", () => { const disable = jest.fn(); const navigate = jest.fn(); const back = jest.fn().mockResolvedValue(null); + const collect = jest.fn().mockResolvedValue(null); beforeEach(async () => { buildConfig.mockClear(); disable.mockClear(); navigate.mockClear(); back.mockClear(); + collect.mockClear(); addEditCipherInfo$ = new BehaviorSubject(null); cipherServiceMock = mock(); @@ -66,6 +70,7 @@ describe("AddEditV2Component", () => { { provide: ActivatedRoute, useValue: { queryParams: queryParams$ } }, { provide: I18nService, useValue: { t: (key: string) => key } }, { provide: CipherService, useValue: cipherServiceMock }, + { provide: EventCollectionService, useValue: { collect } }, ], }) .overrideProvider(CipherFormConfigService, { @@ -122,6 +127,57 @@ describe("AddEditV2Component", () => { }); }); + describe("analytics", () => { + it("does not log viewed event when mode is add", fakeAsync(() => { + queryParams$.next({}); + + tick(); + + expect(collect).not.toHaveBeenCalled(); + })); + + it("does not log viewed event whe mode is clone", fakeAsync(() => { + queryParams$.next({ cipherId: "222-333-444-5555", clone: "true" }); + buildConfigResponse.originalCipher = {} as Cipher; + + tick(); + + expect(collect).not.toHaveBeenCalled(); + })); + + it("logs viewed event when mode is edit", fakeAsync(() => { + buildConfigResponse.originalCipher = { + edit: true, + id: "222-333-444-5555", + organizationId: "444-555-666", + } as Cipher; + queryParams$.next({ cipherId: "222-333-444-5555" }); + + tick(); + + expect(collect).toHaveBeenCalledWith( + EventType.Cipher_ClientViewed, + "222-333-444-5555", + false, + "444-555-666", + ); + })); + + it("logs viewed event whe mode is partial-edit", fakeAsync(() => { + buildConfigResponse.originalCipher = { edit: false } as Cipher; + queryParams$.next({ cipherId: "222-333-444-5555", orgId: "444-555-666" }); + + tick(); + + expect(collect).toHaveBeenCalledWith( + EventType.Cipher_ClientViewed, + "222-333-444-5555", + false, + "444-555-666", + ); + })); + }); + describe("addEditCipherInfo initialization", () => { it("populates config.initialValues with `addEditCipherInfo` values", fakeAsync(() => { const addEditCipherInfo = { diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts index 7664c7e0ca1..5febed788e7 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts @@ -6,6 +6,8 @@ import { ActivatedRoute, Params, Router } from "@angular/router"; import { firstValueFrom, map, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -160,6 +162,7 @@ export class AddEditV2Component implements OnInit { private popupRouterCacheService: PopupRouterCacheService, private router: Router, private cipherService: CipherService, + private eventCollectionService: EventCollectionService, ) { this.subscribeToParams(); } @@ -275,6 +278,15 @@ export class AddEditV2Component implements OnInit { await this.cipherService.setAddEditCipherInfo(null); } + if (["edit", "partial-edit"].includes(config.mode) && config.originalCipher?.id) { + await this.eventCollectionService.collect( + EventType.Cipher_ClientViewed, + config.originalCipher.id, + false, + config.originalCipher.organizationId, + ); + } + return config; }), ) diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts index 9851b16aa41..69ee2dafe50 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts @@ -3,7 +3,9 @@ import { ActivatedRoute, Router } from "@angular/router"; import { mock } from "jest-mock-extended"; import { Subject } from "rxjs"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { EventType } from "@bitwarden/common/enums"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -29,10 +31,12 @@ describe("ViewV2Component", () => { let fixture: ComponentFixture; const params$ = new Subject(); const mockNavigate = jest.fn(); + const collect = jest.fn().mockResolvedValue(null); const mockCipher = { id: "122-333-444", type: CipherType.Login, + orgId: "222-444-555", }; const mockVaultPopupAutofillService = { @@ -48,6 +52,7 @@ describe("ViewV2Component", () => { beforeEach(async () => { mockNavigate.mockClear(); + collect.mockClear(); await TestBed.configureTestingModule({ imports: [ViewV2Component], @@ -59,6 +64,7 @@ describe("ViewV2Component", () => { { provide: ConfigService, useValue: mock() }, { provide: PopupRouterCacheService, useValue: mock() }, { provide: ActivatedRoute, useValue: { queryParams: params$ } }, + { provide: EventCollectionService, useValue: { collect } }, { provide: I18nService, useValue: { @@ -122,5 +128,18 @@ describe("ViewV2Component", () => { expect(component.headerText).toEqual("viewItemHeader note"); })); + + it("sends viewed event", fakeAsync(() => { + params$.next({ cipherId: "122-333-444" }); + + flush(); // Resolve all promises + + expect(collect).toHaveBeenCalledWith( + EventType.Cipher_ClientViewed, + mockCipher.id, + false, + undefined, + ); + })); }); }); diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index 4025beb685b..e8aab69dbe9 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -6,9 +6,11 @@ import { ActivatedRoute, Router } from "@angular/router"; import { firstValueFrom, map, Observable, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AUTOFILL_ID, SHOW_AUTOFILL_BUTTON } from "@bitwarden/common/autofill/constants"; +import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -73,6 +75,7 @@ export class ViewV2Component { private toastService: ToastService, private vaultPopupAutofillService: VaultPopupAutofillService, private accountService: AccountService, + private eventCollectionService: EventCollectionService, ) { this.subscribeToParams(); } @@ -90,6 +93,13 @@ export class ViewV2Component { if (this.loadAction === AUTOFILL_ID || this.loadAction === SHOW_AUTOFILL_BUTTON) { await this.vaultPopupAutofillService.doAutofill(this.cipher); } + + await this.eventCollectionService.collect( + EventType.Cipher_ClientViewed, + cipher.id, + false, + cipher.organizationId, + ); }), takeUntilDestroyed(), ) diff --git a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.html b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.html index 161f193108a..44d8a21d3c8 100644 --- a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.html +++ b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.html @@ -19,6 +19,7 @@ bitSuffix bitPasswordInputToggle data-testid="visibility-for-card-number" + (toggledChange)="logCardEvent($event, EventType.Cipher_ClientToggledCardNumberVisible)" >
@@ -60,6 +61,7 @@ bitSuffix bitPasswordInputToggle data-testid="visibility-for-card-code" + (toggledChange)="logCardEvent($event, EventType.Cipher_ClientToggledCardCodeVisible)" > diff --git a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.spec.ts b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.spec.ts index 196be144fdd..e9581859b2e 100644 --- a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.spec.ts +++ b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.spec.ts @@ -4,6 +4,7 @@ import { ReactiveFormsModule } from "@angular/forms"; import { By } from "@angular/platform-browser"; import { mock, MockProxy } from "jest-mock-extended"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -27,6 +28,7 @@ describe("CardDetailsSectionComponent", () => { await TestBed.configureTestingModule({ imports: [CardDetailsSectionComponent, CommonModule, ReactiveFormsModule], providers: [ + { provide: EventCollectionService, useValue: mock() }, { provide: CipherFormContainer, useValue: cipherFormProvider }, { provide: I18nService, useValue: { t: (key: string) => key } }, ], diff --git a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts index df45bcbcac0..e1ef3dc0f37 100644 --- a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts +++ b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts @@ -4,6 +4,8 @@ import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -91,10 +93,13 @@ export class CardDetailsSectionComponent implements OnInit { { name: "12 - " + this.i18nService.t("december"), value: "12" }, ]; + EventType = EventType; + constructor( private cipherFormContainer: CipherFormContainer, private formBuilder: FormBuilder, private i18nService: I18nService, + private eventCollectionService: EventCollectionService, ) { this.cipherFormContainer.registerChildForm("cardDetails", this.cardDetailsForm); @@ -149,6 +154,21 @@ export class CardDetailsSectionComponent implements OnInit { return this.i18nService.t("cardDetails"); } + async logCardEvent(hiddenFieldVisible: boolean, event: EventType) { + const { mode, originalCipher } = this.cipherFormContainer.config; + + const isEdit = ["edit", "partial-edit"].includes(mode); + + if (hiddenFieldVisible && isEdit) { + await this.eventCollectionService.collect( + event, + originalCipher.id, + false, + originalCipher.organizationId, + ); + } + } + /** Set form initial form values from the current cipher */ private setInitialValues() { const { cardholderName, number, brand, expMonth, expYear, code } = this.originalCipherView.card; diff --git a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html index 1be4d922c53..0ab059b09c9 100644 --- a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html +++ b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html @@ -46,6 +46,7 @@ bitPasswordInputToggle data-testid="visibility-for-custom-hidden-field" [disabled]="!canViewPasswords(i)" + (toggledChange)="logHiddenEvent($event)" > diff --git a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.spec.ts b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.spec.ts index 036a59672e0..0c0fa1b4184 100644 --- a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.spec.ts +++ b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.spec.ts @@ -4,7 +4,9 @@ import { CdkDragDrop } from "@angular/cdk/drag-drop"; import { DebugElement } from "@angular/core"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; +import { mock } from "jest-mock-extended"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CardLinkedId, @@ -50,6 +52,7 @@ describe("CustomFieldsComponent", () => { await TestBed.configureTestingModule({ imports: [CustomFieldsComponent], providers: [ + { provide: EventCollectionService, useValue: mock() }, { provide: I18nService, useValue: { t: (...keys: string[]) => keys.filter(Boolean).join(" ") }, diff --git a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts index e2aa118b883..1aeb9e0da08 100644 --- a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts +++ b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.ts @@ -19,6 +19,8 @@ import { FormArray, FormBuilder, FormsModule, ReactiveFormsModule } from "@angul import { Subject, zip } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType, FieldType, LinkedIdType } from "@bitwarden/common/vault/enums"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; @@ -118,6 +120,7 @@ export class CustomFieldsComponent implements OnInit, AfterViewInit { private formBuilder: FormBuilder, private i18nService: I18nService, private liveAnnouncer: LiveAnnouncer, + private eventCollectionService: EventCollectionService, ) { this.destroyed$ = inject(DestroyRef); this.cipherFormContainer.registerChildForm("customFields", this.customFieldsForm); @@ -301,6 +304,21 @@ export class CustomFieldsComponent implements OnInit, AfterViewInit { } } + async logHiddenEvent(hiddenFieldVisible: boolean) { + const { mode, originalCipher } = this.cipherFormContainer.config; + + const isEdit = ["edit", "partial-edit"].includes(mode); + + if (hiddenFieldVisible && isEdit) { + await this.eventCollectionService.collect( + EventType.Cipher_ClientToggledHiddenFieldVisible, + originalCipher.id, + false, + originalCipher.organizationId, + ); + } + } + /** * Returns the linked field options for the current cipher type * diff --git a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html index af75eae862c..b91258a2183 100644 --- a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html +++ b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.html @@ -57,6 +57,7 @@ *ngIf="viewHiddenFields" data-testid="toggle-password-visibility" bitPasswordInputToggle + (toggledChange)="logVisibleEvent($event, EventType.Cipher_ClientToggledPasswordVisible)" > diff --git a/libs/vault/src/cipher-view/card-details/card-details-view.component.ts b/libs/vault/src/cipher-view/card-details/card-details-view.component.ts index 6ab2795afd9..55868068cac 100644 --- a/libs/vault/src/cipher-view/card-details/card-details-view.component.ts +++ b/libs/vault/src/cipher-view/card-details/card-details-view.component.ts @@ -2,8 +2,10 @@ import { CommonModule } from "@angular/common"; import { Component, Input } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { CardView } from "@bitwarden/common/vault/models/view/card.view"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CardComponent, SectionComponent, @@ -32,9 +34,17 @@ import { ReadOnlyCipherCardComponent } from "../read-only-cipher-card/read-only- ], }) export class CardDetailsComponent { - @Input() card: CardView; + @Input() cipher: CipherView; + EventType = EventType; - constructor(private i18nService: I18nService) {} + constructor( + private i18nService: I18nService, + private eventCollectionService: EventCollectionService, + ) {} + + get card() { + return this.cipher.card; + } get setSectionTitle() { if (this.card.brand && this.card.brand !== "Other") { @@ -42,4 +52,15 @@ export class CardDetailsComponent { } return this.i18nService.t("cardDetails"); } + + async logCardEvent(conditional: boolean, event: EventType) { + if (conditional) { + await this.eventCollectionService.collect( + event, + this.cipher.id, + false, + this.cipher.organizationId, + ); + } + } } diff --git a/libs/vault/src/cipher-view/cipher-view.component.html b/libs/vault/src/cipher-view/cipher-view.component.html index 9b4bfdb5970..c34fc05b1d3 100644 --- a/libs/vault/src/cipher-view/cipher-view.component.html +++ b/libs/vault/src/cipher-view/cipher-view.component.html @@ -29,7 +29,7 @@ - + @@ -42,8 +42,7 @@ - - + diff --git a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html index 69aa4e9d699..6c1b8ee5f1d 100644 --- a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html +++ b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html @@ -5,7 +5,7 @@
@@ -24,7 +24,13 @@ {{ field.name }} - + diff --git a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.ts b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.ts index b5826d82edf..01f05765bcb 100644 --- a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.ts +++ b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.ts @@ -2,10 +2,12 @@ import { CommonModule } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType, FieldType, LinkedIdType } from "@bitwarden/common/vault/enums"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; -import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { @@ -37,12 +39,14 @@ import { ], }) export class CustomFieldV2Component implements OnInit { - @Input() fields: FieldView[]; - @Input() cipherType: CipherType; + @Input() cipher: CipherView; fieldType = FieldType; fieldOptions: any; - constructor(private i18nService: I18nService) {} + constructor( + private i18nService: I18nService, + private eventCollectionService: EventCollectionService, + ) {} ngOnInit(): void { this.fieldOptions = this.getLinkedFieldsOptionsForCipher(); @@ -53,8 +57,28 @@ export class CustomFieldV2Component implements OnInit { return this.i18nService.t(linkedType.i18nKey); } + async logHiddenEvent(hiddenFieldVisible: boolean) { + if (hiddenFieldVisible) { + await this.eventCollectionService.collect( + EventType.Cipher_ClientToggledHiddenFieldVisible, + this.cipher.id, + false, + this.cipher.organizationId, + ); + } + } + + async logCopyEvent() { + await this.eventCollectionService.collect( + EventType.Cipher_ClientCopiedHiddenField, + this.cipher.id, + false, + this.cipher.organizationId, + ); + } + private getLinkedFieldsOptionsForCipher() { - switch (this.cipherType) { + switch (this.cipher.type) { case CipherType.Login: return LoginView.prototype.linkedFieldOptions; case CipherType.Card: diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index f2fbb6a0426..1d6c81c6591 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -66,6 +66,7 @@ showToast [appA11yTitle]="'copyValue' | i18n" data-testid="copy-password" + (click)="logCopyEvent()" >
{ expect(eventCollectionService.collect).toHaveBeenCalledWith( EventType.Cipher_ClientCopiedPassword, cipher.id, + false, + cipher.organizationId, ); }); }); diff --git a/libs/vault/src/services/copy-cipher-field.service.ts b/libs/vault/src/services/copy-cipher-field.service.ts index 82a9542feb2..4767ae01bca 100644 --- a/libs/vault/src/services/copy-cipher-field.service.ts +++ b/libs/vault/src/services/copy-cipher-field.service.ts @@ -125,7 +125,12 @@ export class CopyCipherFieldService { }); if (action.event !== undefined) { - await this.eventCollectionService.collect(action.event, cipher.id); + await this.eventCollectionService.collect( + action.event, + cipher.id, + false, + cipher.organizationId, + ); } } From 112bad03b15c5d61a77a3e8158b595bc4a3c53f1 Mon Sep 17 00:00:00 2001 From: Victoria League Date: Mon, 16 Sep 2024 15:36:05 -0400 Subject: [PATCH 017/104] [PM-8582] Move Safari browser check to libs/platform (#11007) --- .../src/platform/browser/browser-api.ts | 6 +-- libs/platform/src/index.ts | 1 + .../src/services/browser-service.spec.ts | 41 +++++++++++++++++++ libs/platform/src/services/browser-service.ts | 7 ++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 libs/platform/src/services/browser-service.spec.ts create mode 100644 libs/platform/src/services/browser-service.ts diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index a5ca7a65ff4..33f18ce5723 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -1,6 +1,7 @@ import { Observable } from "rxjs"; import { DeviceType } from "@bitwarden/common/enums"; +import { isBrowserSafariApi } from "@bitwarden/platform"; import { TabMessage } from "../../types/tab-messages"; import { BrowserPlatformUtilsService } from "../services/platform-utils/browser-platform-utils.service"; @@ -9,10 +10,7 @@ import { registerContentScriptsPolyfill } from "./browser-api.register-content-s export class BrowserApi { static isWebExtensionsApi: boolean = typeof browser !== "undefined"; - static isSafariApi: boolean = - navigator.userAgent.indexOf(" Safari/") !== -1 && - navigator.userAgent.indexOf(" Chrome/") === -1 && - navigator.userAgent.indexOf(" Chromium/") === -1; + static isSafariApi: boolean = isBrowserSafariApi(); static isChromeApi: boolean = !BrowserApi.isSafariApi && typeof chrome !== "undefined"; static isFirefoxOnAndroid: boolean = navigator.userAgent.indexOf("Firefox/") !== -1 && navigator.userAgent.indexOf("Android") !== -1; diff --git a/libs/platform/src/index.ts b/libs/platform/src/index.ts index e69de29bb2d..f11ec102845 100644 --- a/libs/platform/src/index.ts +++ b/libs/platform/src/index.ts @@ -0,0 +1 @@ +export * from "./services/browser-service"; diff --git a/libs/platform/src/services/browser-service.spec.ts b/libs/platform/src/services/browser-service.spec.ts new file mode 100644 index 00000000000..b7c824bb87f --- /dev/null +++ b/libs/platform/src/services/browser-service.spec.ts @@ -0,0 +1,41 @@ +import { isBrowserSafariApi } from "./browser-service"; + +describe("browser-service", () => { + describe("isBrowserSafariApi", () => { + it("returns true if browser is safari", () => { + jest + .spyOn(navigator, "userAgent", "get") + .mockReturnValue( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15", + ); + + const result = isBrowserSafariApi(); + + expect(result).toBe(true); + }); + + it("returns false if browser is chrome", () => { + jest + .spyOn(navigator, "userAgent", "get") + .mockReturnValue( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", + ); + + const result = isBrowserSafariApi(); + + expect(result).toBe(false); + }); + + it("returns false if browser is firefox", () => { + jest + .spyOn(navigator, "userAgent", "get") + .mockReturnValue( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0", + ); + + const result = isBrowserSafariApi(); + + expect(result).toBe(false); + }); + }); +}); diff --git a/libs/platform/src/services/browser-service.ts b/libs/platform/src/services/browser-service.ts new file mode 100644 index 00000000000..00001cbb1a9 --- /dev/null +++ b/libs/platform/src/services/browser-service.ts @@ -0,0 +1,7 @@ +export function isBrowserSafariApi(): boolean { + return ( + navigator.userAgent.indexOf(" Safari/") !== -1 && + navigator.userAgent.indexOf(" Chrome/") === -1 && + navigator.userAgent.indexOf(" Chromium/") === -1 + ); +} From 1ebef296b9409a1d4c94184fd400c0a441bd9a3e Mon Sep 17 00:00:00 2001 From: Justin Baur <19896123+justindbaur@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:08:03 -0400 Subject: [PATCH 018/104] [PM-12024] Move Lock All To Happen in Background (#11047) * Move Lock All To Happen in Background - Make it done serially - Have the promise only resolve once it's complete * Unlock Active Account Last * Add Tests * Update Comment --- .../account-switcher.component.ts | 26 ++-------- .../popup/accounts/foreground-lock.service.ts | 32 ++++++++++++ .../browser/src/background/main.background.ts | 5 ++ .../src/background/runtime.background.ts | 8 +++ .../src/popup/services/services.module.ts | 8 ++- .../common/services/accounts/lock.service.ts | 49 +++++++++++++++++++ .../services/accounts/lock.services.spec.ts | 43 ++++++++++++++++ libs/auth/src/common/services/index.ts | 1 + 8 files changed, 150 insertions(+), 22 deletions(-) create mode 100644 apps/browser/src/auth/popup/accounts/foreground-lock.service.ts create mode 100644 libs/auth/src/common/services/accounts/lock.service.ts create mode 100644 libs/auth/src/common/services/accounts/lock.services.spec.ts diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts index e5c09db6428..fb636ecaf6d 100644 --- a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -1,9 +1,10 @@ import { CommonModule, Location } from "@angular/common"; import { Component, OnDestroy, OnInit } from "@angular/core"; import { Router } from "@angular/router"; -import { Subject, firstValueFrom, map, of, startWith, switchMap, takeUntil } from "rxjs"; +import { Subject, firstValueFrom, map, of, startWith, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { LockService } from "@bitwarden/auth/common"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -70,6 +71,7 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { private vaultTimeoutSettingsService: VaultTimeoutSettingsService, private authService: AuthService, private configService: ConfigService, + private lockService: LockService, ) {} get accountLimit() { @@ -131,26 +133,8 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { async lockAll() { this.loading = true; - this.availableAccounts$ - .pipe( - map((accounts) => - accounts - .filter((account) => account.id !== this.specialAddAccountId) - .sort((a, b) => (a.isActive ? -1 : b.isActive ? 1 : 0)) // Log out of the active account first - .map((account) => account.id), - ), - switchMap(async (accountIds) => { - if (accountIds.length === 0) { - return; - } - - // Must lock active (first) account first, then order doesn't matter - await this.vaultTimeoutService.lock(accountIds.shift()); - await Promise.all(accountIds.map((id) => this.vaultTimeoutService.lock(id))); - }), - takeUntil(this.destroy$), - ) - .subscribe(() => this.router.navigate(["lock"])); + await this.lockService.lockAll(); + await this.router.navigate(["lock"]); } async logOut(userId: UserId) { diff --git a/apps/browser/src/auth/popup/accounts/foreground-lock.service.ts b/apps/browser/src/auth/popup/accounts/foreground-lock.service.ts new file mode 100644 index 00000000000..20a52a90d8b --- /dev/null +++ b/apps/browser/src/auth/popup/accounts/foreground-lock.service.ts @@ -0,0 +1,32 @@ +import { filter, firstValueFrom } from "rxjs"; + +import { LockService } from "@bitwarden/auth/common"; +import { + CommandDefinition, + MessageListener, + MessageSender, +} from "@bitwarden/common/platform/messaging"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; + +const LOCK_ALL_FINISHED = new CommandDefinition<{ requestId: string }>("lockAllFinished"); +const LOCK_ALL = new CommandDefinition<{ requestId: string }>("lockAll"); + +export class ForegroundLockService implements LockService { + constructor( + private readonly messageSender: MessageSender, + private readonly messageListener: MessageListener, + ) {} + + async lockAll(): Promise { + const requestId = Utils.newGuid(); + const finishMessage = firstValueFrom( + this.messageListener + .messages$(LOCK_ALL_FINISHED) + .pipe(filter((m) => m.requestId === requestId)), + ); + + this.messageSender.send(LOCK_ALL, { requestId }); + + await finishMessage; + } +} diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 1cb615fe067..9579fb2be83 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -9,6 +9,7 @@ import { AuthRequestService, LoginEmailServiceAbstraction, LogoutReason, + DefaultLockService, } from "@bitwarden/auth/common"; import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service"; import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstractions/audit.service"; @@ -1065,6 +1066,9 @@ export default class MainBackground { this.scriptInjectorService, this.configService, ); + + const lockService = new DefaultLockService(this.accountService, this.vaultTimeoutService); + this.runtimeBackground = new RuntimeBackground( this, this.autofillService, @@ -1079,6 +1083,7 @@ export default class MainBackground { this.fido2Background, messageListener, this.accountService, + lockService, ); this.nativeMessagingBackground = new NativeMessagingBackground( this.cryptoService, diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 424449f0b65..1ec7edcc30c 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -1,5 +1,6 @@ import { firstValueFrom, map, mergeMap, of, switchMap } from "rxjs"; +import { LockService } from "@bitwarden/auth/common"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AutofillOverlayVisibility, ExtensionCommand } from "@bitwarden/common/autofill/constants"; @@ -48,6 +49,7 @@ export default class RuntimeBackground { private fido2Background: Fido2Background, private messageListener: MessageListener, private accountService: AccountService, + private readonly lockService: LockService, ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -245,6 +247,12 @@ export default class RuntimeBackground { case "lockVault": await this.main.vaultTimeoutService.lock(msg.userId); break; + case "lockAll": + { + await this.lockService.lockAll(); + this.messagingService.send("lockAllFinished", { requestId: msg.requestId }); + } + break; case "logout": await this.main.logout(msg.expired, msg.userId); break; diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 098c6eb91ce..efbe9ce6bf5 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -17,7 +17,7 @@ import { } from "@bitwarden/angular/services/injection-tokens"; import { JslibServicesModule } from "@bitwarden/angular/services/jslib-services.module"; import { AnonLayoutWrapperDataService } from "@bitwarden/auth/angular"; -import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { LockService, PinServiceAbstraction } from "@bitwarden/auth/common"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; @@ -91,6 +91,7 @@ import { TotpService } from "@bitwarden/common/vault/services/totp.service"; import { DialogService, ToastService } from "@bitwarden/components"; import { PasswordRepromptService } from "@bitwarden/vault"; +import { ForegroundLockService } from "../../auth/popup/accounts/foreground-lock.service"; import { ExtensionAnonLayoutWrapperDataService } from "../../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; import { AutofillService as AutofillServiceAbstraction } from "../../autofill/services/abstractions/autofill.service"; import AutofillService from "../../autofill/services/autofill.service"; @@ -560,6 +561,11 @@ const safeProviders: SafeProvider[] = [ useClass: ExtensionAnonLayoutWrapperDataService, deps: [], }), + safeProvider({ + provide: LockService, + useClass: ForegroundLockService, + deps: [MessageSender, MessageListener], + }), ]; @NgModule({ diff --git a/libs/auth/src/common/services/accounts/lock.service.ts b/libs/auth/src/common/services/accounts/lock.service.ts new file mode 100644 index 00000000000..334a795f7bc --- /dev/null +++ b/libs/auth/src/common/services/accounts/lock.service.ts @@ -0,0 +1,49 @@ +import { combineLatest, firstValueFrom, map } from "rxjs"; + +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +export abstract class LockService { + /** + * Locks all accounts. + */ + abstract lockAll(): Promise; +} + +export class DefaultLockService implements LockService { + constructor( + private readonly accountService: AccountService, + private readonly vaultTimeoutService: VaultTimeoutService, + ) {} + + async lockAll() { + const accounts = await firstValueFrom( + combineLatest([this.accountService.activeAccount$, this.accountService.accounts$]).pipe( + map(([activeAccount, accounts]) => { + const otherAccounts = Object.keys(accounts) as UserId[]; + + if (activeAccount == null) { + return { activeAccount: null, otherAccounts: otherAccounts }; + } + + return { + activeAccount: activeAccount.id, + otherAccounts: otherAccounts.filter((accountId) => accountId !== activeAccount.id), + }; + }), + ), + ); + + for (const otherAccount of accounts.otherAccounts) { + await this.vaultTimeoutService.lock(otherAccount); + } + + // Do the active account last in case we ever try to route the user on lock + // that way this whole operation will be complete before that routing + // could take place. + if (accounts.activeAccount != null) { + await this.vaultTimeoutService.lock(accounts.activeAccount); + } + } +} diff --git a/libs/auth/src/common/services/accounts/lock.services.spec.ts b/libs/auth/src/common/services/accounts/lock.services.spec.ts new file mode 100644 index 00000000000..eecc3dd787f --- /dev/null +++ b/libs/auth/src/common/services/accounts/lock.services.spec.ts @@ -0,0 +1,43 @@ +import { mock } from "jest-mock-extended"; + +import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service"; +import { mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { DefaultLockService } from "./lock.service"; + +describe("DefaultLockService", () => { + const mockUser1 = "user1" as UserId; + const mockUser2 = "user2" as UserId; + const mockUser3 = "user3" as UserId; + + const accountService = mockAccountServiceWith(mockUser1); + const vaultTimeoutService = mock(); + + const sut = new DefaultLockService(accountService, vaultTimeoutService); + describe("lockAll", () => { + it("locks the active account last", async () => { + await accountService.addAccount(mockUser2, { + name: "name2", + email: "email2@example.com", + emailVerified: false, + }); + + await accountService.addAccount(mockUser3, { + name: "name3", + email: "email3@example.com", + emailVerified: false, + }); + + await sut.lockAll(); + + expect(vaultTimeoutService.lock).toHaveBeenCalledTimes(3); + // Non-Active users should be called first + expect(vaultTimeoutService.lock).toHaveBeenNthCalledWith(1, mockUser2); + expect(vaultTimeoutService.lock).toHaveBeenNthCalledWith(2, mockUser3); + + // Active user should be called last + expect(vaultTimeoutService.lock).toHaveBeenNthCalledWith(3, mockUser1); + }); + }); +}); diff --git a/libs/auth/src/common/services/index.ts b/libs/auth/src/common/services/index.ts index eb4ec39ce7b..3a8df057796 100644 --- a/libs/auth/src/common/services/index.ts +++ b/libs/auth/src/common/services/index.ts @@ -4,3 +4,4 @@ export * from "./login-strategies/login-strategy.service"; export * from "./user-decryption-options/user-decryption-options.service"; export * from "./auth-request/auth-request.service"; export * from "./register-route.service"; +export * from "./accounts/lock.service"; From d52ab5e343bee8534f49ed5213541b864db7a339 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 16:22:30 -0400 Subject: [PATCH 019/104] [deps] Autofill: Update concurrently to v9 (#11069) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 35 +++++------------------------------ package.json | 2 +- 2 files changed, 6 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00a0e890bf4..6977a9600e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -125,7 +125,7 @@ "base64-loader": "1.0.0", "browserslist": "4.23.2", "chromatic": "11.7.1", - "concurrently": "8.2.2", + "concurrently": "9.0.1", "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", "css-loader": "7.1.2", @@ -14537,18 +14537,16 @@ } }, "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", + "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", - "date-fns": "^2.30.0", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" @@ -14558,7 +14556,7 @@ "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^14.13.0 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" @@ -15476,23 +15474,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, "node_modules/debounce-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", @@ -34665,12 +34646,6 @@ "node": ">= 0.10" } }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", diff --git a/package.json b/package.json index 3783af2c61d..92f588e0cac 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "base64-loader": "1.0.0", "browserslist": "4.23.2", "chromatic": "11.7.1", - "concurrently": "8.2.2", + "concurrently": "9.0.1", "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", "css-loader": "7.1.2", From 651f1e586a8e9f99aba842a0a08990820c879d9f Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Mon, 16 Sep 2024 17:01:38 -0500 Subject: [PATCH 020/104] PM-11468: Add data-testids for View Item pages (#11043) * Add data test IDs for identity information. * Add data test IDs for custom fields. --- .../custom-fields/custom-fields-v2.component.html | 2 ++ .../view-identity-sections.component.html | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html index 6c1b8ee5f1d..8c6d9f96170 100644 --- a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html +++ b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html @@ -7,6 +7,7 @@ class="tw-border-secondary-300 [&_bit-form-field:last-of-type]:tw-mb-0" *ngFor="let field of cipher.fields; let last = last" [ngClass]="{ 'tw-mb-4': !last }" + data-testid="custom-field" > {{ field.name }} @@ -19,6 +20,7 @@ showToast [valueLabel]="field.name" [appA11yTitle]="'copyValue' | i18n" + data-testid="copy-custom-field" > diff --git a/libs/vault/src/cipher-view/view-identity-sections/view-identity-sections.component.html b/libs/vault/src/cipher-view/view-identity-sections/view-identity-sections.component.html index 29ccd5daa6b..ec4580e31d3 100644 --- a/libs/vault/src/cipher-view/view-identity-sections/view-identity-sections.component.html +++ b/libs/vault/src/cipher-view/view-identity-sections/view-identity-sections.component.html @@ -15,6 +15,7 @@ [appCopyClick]="cipher.identity.fullName" showToast [valueLabel]="'name' | i18n" + data-testid="copy-name" > @@ -41,6 +42,7 @@ [appCopyClick]="cipher.identity.company" showToast [valueLabel]="'company' | i18n" + data-testid="copy-company" > @@ -70,6 +72,7 @@ [appCopyClick]="cipher.identity.ssn" showToast [valueLabel]="'ssn' | i18n" + data-testid="copy-ssn" > @@ -96,6 +99,7 @@ [appCopyClick]="cipher.identity.passportNumber" showToast [valueLabel]="'passportNumber' | i18n" + data-testid="copy-passport" > @@ -109,6 +113,7 @@ [appCopyClick]="cipher.identity.licenseNumber" showToast [valueLabel]="'licenseNumber' | i18n" + data-testid="copy-license" > @@ -131,6 +136,7 @@ [appCopyClick]="cipher.identity.email" showToast [valueLabel]="'email' | i18n" + data-testid="copy-email" > @@ -144,6 +150,7 @@ [appCopyClick]="cipher.identity.phone" showToast [valueLabel]="'phone' | i18n" + data-testid="copy-phone" > @@ -164,6 +171,7 @@ [appCopyClick]="addressFields" showToast [valueLabel]="'address' | i18n" + data-testid="copy-address" > From be2ddf784a222652bf3627bef17ec8d8bb7b600d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:53:24 -0400 Subject: [PATCH 021/104] [deps] Design System: Update chromatic to v11.10.2 (#11062) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6977a9600e3..d24d74ffb36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -124,7 +124,7 @@ "babel-loader": "9.1.3", "base64-loader": "1.0.0", "browserslist": "4.23.2", - "chromatic": "11.7.1", + "chromatic": "11.10.2", "concurrently": "9.0.1", "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", @@ -13845,9 +13845,9 @@ } }, "node_modules/chromatic": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.7.1.tgz", - "integrity": "sha512-LvgPimdQdnQB07ZDxLEC2KtxgYeqTw0X71GA7fi3zhgtKLxZcE+BSZ/5I9rrQp1V8ydmfElfw0ZwnUH4fVgUAQ==", + "version": "11.10.2", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.10.2.tgz", + "integrity": "sha512-EbVlhmOLGdx9QRX3RMOTF3UzoyC1aaXNRjlzm1mc++2OI5+6C5Bzwt2ZUYJ3Jnf/pJa23q0y5Y3QEDcfRVqIbg==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index 92f588e0cac..3e78dfb6d80 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "babel-loader": "9.1.3", "base64-loader": "1.0.0", "browserslist": "4.23.2", - "chromatic": "11.7.1", + "chromatic": "11.10.2", "concurrently": "9.0.1", "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", From 171d798c526688a2f172b62086731aa4325ae770 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:59:48 -0400 Subject: [PATCH 022/104] [deps] Design System: Update tailwindcss to v3.4.11 (#11056) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d24d74ffb36..c28985f514c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -171,7 +171,7 @@ "sass-loader": "16.0.1", "storybook": "8.2.9", "style-loader": "3.3.4", - "tailwindcss": "3.4.10", + "tailwindcss": "3.4.11", "ts-jest": "29.2.2", "ts-loader": "9.5.1", "tsconfig-paths-webpack-plugin": "4.1.0", @@ -35491,9 +35491,9 @@ "license": "MIT" }, "node_modules/tailwindcss": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", - "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.11.tgz", + "integrity": "sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3e78dfb6d80..8e5f38c62ef 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "sass-loader": "16.0.1", "storybook": "8.2.9", "style-loader": "3.3.4", - "tailwindcss": "3.4.10", + "tailwindcss": "3.4.11", "ts-jest": "29.2.2", "ts-loader": "9.5.1", "tsconfig-paths-webpack-plugin": "4.1.0", From c05b6eb116a1c98d21a58b7f900133ff6e066e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui=20Tom=C3=A9?= <108268980+r-tome@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:22:17 +0100 Subject: [PATCH 023/104] [PM-11667] Remove all code related to the outdated custom permissions 'Edit/Delete Assigned Collections' (#10904) * [PM-11667] Remove all code related to the outdated custom permissions 'Edit/Delete Assigned Collections' * Revert change made to data model in state migration --- apps/web/src/locales/en/messages.json | 6 ------ libs/common/src/admin-console/models/api/permissions.api.ts | 4 ---- libs/common/src/auth/services/key-connector.service.spec.ts | 2 -- 3 files changed, 12 deletions(-) diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 7b518e4899d..9b7d44150e8 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -4861,12 +4861,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, diff --git a/libs/common/src/admin-console/models/api/permissions.api.ts b/libs/common/src/admin-console/models/api/permissions.api.ts index 4eb055ea797..e6b435294fc 100644 --- a/libs/common/src/admin-console/models/api/permissions.api.ts +++ b/libs/common/src/admin-console/models/api/permissions.api.ts @@ -7,8 +7,6 @@ export class PermissionsApi extends BaseResponse { createNewCollections: boolean; editAnyCollection: boolean; deleteAnyCollection: boolean; - editAssignedCollections: boolean; - deleteAssignedCollections: boolean; manageCiphers: boolean; manageGroups: boolean; manageSso: boolean; @@ -29,8 +27,6 @@ export class PermissionsApi extends BaseResponse { this.createNewCollections = this.getResponseProperty("CreateNewCollections"); this.editAnyCollection = this.getResponseProperty("EditAnyCollection"); this.deleteAnyCollection = this.getResponseProperty("DeleteAnyCollection"); - this.editAssignedCollections = this.getResponseProperty("EditAssignedCollections"); - this.deleteAssignedCollections = this.getResponseProperty("DeleteAssignedCollections"); this.manageCiphers = this.getResponseProperty("ManageCiphers"); this.manageGroups = this.getResponseProperty("ManageGroups"); diff --git a/libs/common/src/auth/services/key-connector.service.spec.ts b/libs/common/src/auth/services/key-connector.service.spec.ts index 5d1aff45f60..0d36bc85959 100644 --- a/libs/common/src/auth/services/key-connector.service.spec.ts +++ b/libs/common/src/auth/services/key-connector.service.spec.ts @@ -340,8 +340,6 @@ describe("KeyConnectorService", () => { createNewCollections: false, editAnyCollection: false, deleteAnyCollection: false, - editAssignedCollections: false, - deleteAssignedCollections: false, manageGroups: false, managePolicies: false, manageSso: false, From a42006763d639e36f713ffa93ac74b4421d27e91 Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:42:57 -0500 Subject: [PATCH 024/104] [PM-9455] FireFox back handling (#10867) * Refactor `POPUP_VIEW_MEMORY` to use `disk` rather than memory for the browser extension. - When FireFox opens the popup in an standalone window memory is lost, thus causing the `popup-route-history` to be lost and back navigation ceases to work * spelling * revert state definition change * add `onUpdated` event for firefox * rework observable handling * remove unneeded `from` --- .../popup-view-cache-background.service.ts | 15 +++++++++++++-- .../src/platform/state/global-state.provider.ts | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/browser/src/platform/services/popup-view-cache-background.service.ts b/apps/browser/src/platform/services/popup-view-cache-background.service.ts index c2713f70a16..35c55633c0c 100644 --- a/apps/browser/src/platform/services/popup-view-cache-background.service.ts +++ b/apps/browser/src/platform/services/popup-view-cache-background.service.ts @@ -1,4 +1,4 @@ -import { switchMap, merge, delay, filter, concatMap, map } from "rxjs"; +import { switchMap, merge, delay, filter, concatMap, map, first, of } from "rxjs"; import { CommandDefinition, MessageListener } from "@bitwarden/common/platform/messaging"; import { @@ -61,7 +61,18 @@ export class PopupViewCacheBackgroundService { merge( // on tab changed, excluding extension tabs fromChromeEvent(chrome.tabs.onActivated).pipe( - switchMap(([tabInfo]) => BrowserApi.getTab(tabInfo.tabId)), + switchMap((tabs) => BrowserApi.getTab(tabs[0].tabId)), + switchMap((tab) => { + // FireFox sets the `url` to "about:blank" and won't populate the `url` until the `onUpdated` event + if (tab.url !== "about:blank") { + return of(tab); + } + + return fromChromeEvent(chrome.tabs.onUpdated).pipe( + first(), + switchMap(([tabId]) => BrowserApi.getTab(tabId)), + ); + }), map((tab) => tab.url || tab.pendingUrl), filter((url) => !url.startsWith(chrome.runtime.getURL(""))), ), diff --git a/libs/common/src/platform/state/global-state.provider.ts b/libs/common/src/platform/state/global-state.provider.ts index 5aa2b26a5b7..a7179ba0f1d 100644 --- a/libs/common/src/platform/state/global-state.provider.ts +++ b/libs/common/src/platform/state/global-state.provider.ts @@ -2,7 +2,7 @@ import { GlobalState } from "./global-state"; import { KeyDefinition } from "./key-definition"; /** - * A provider for geting an implementation of global state scoped to the given key. + * A provider for getting an implementation of global state scoped to the given key. */ export abstract class GlobalStateProvider { /** From d68853a4a2eb12c5829636da2f9b202a1cd0e637 Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:23:15 -0500 Subject: [PATCH 025/104] [PM-11131] Screen Reader Announcements for Copy (#11091) * add copy specific aria-labels for login ciphers * add copy specific aria-labels for card ciphers * add copy translations for identity to web translations --- apps/browser/src/_locales/en/messages.json | 15 +++++++ apps/web/src/locales/en/messages.json | 39 +++++++++++++++++++ .../additional-options.component.html | 2 +- .../autofill-options-view.component.html | 2 +- .../card-details-view.component.html | 4 +- .../custom-fields-v2.component.html | 4 +- .../login-credentials-view.component.html | 6 +-- 7 files changed, 63 insertions(+), 9 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 764b8b5611c..2a7f17e55e5 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 9b7d44150e8..cdfae904236 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -592,6 +592,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, diff --git a/libs/vault/src/cipher-view/additional-options/additional-options.component.html b/libs/vault/src/cipher-view/additional-options/additional-options.component.html index 0913629ad9e..dc785827767 100644 --- a/libs/vault/src/cipher-view/additional-options/additional-options.component.html +++ b/libs/vault/src/cipher-view/additional-options/additional-options.component.html @@ -14,7 +14,7 @@ [appCopyClick]="notes" showToast [valueLabel]="'note' | i18n" - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyNotes' | i18n" > diff --git a/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.html b/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.html index 6d4669dd43b..aa3e05b9aab 100644 --- a/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.html +++ b/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.html @@ -35,7 +35,7 @@ [appCopyClick]="login.launchUri" [valueLabel]="'website' | i18n" showToast - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyWebsite' | i18n" data-testid="copy-website" > diff --git a/libs/vault/src/cipher-view/card-details/card-details-view.component.html b/libs/vault/src/cipher-view/card-details/card-details-view.component.html index 62da2355edd..051a8128889 100644 --- a/libs/vault/src/cipher-view/card-details/card-details-view.component.html +++ b/libs/vault/src/cipher-view/card-details/card-details-view.component.html @@ -39,7 +39,7 @@ [appCopyClick]="card.number" showToast [valueLabel]="'number' | i18n" - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyNumber' | i18n" data-testid="copy-number" > @@ -79,7 +79,7 @@ [appCopyClick]="card.code" showToast [valueLabel]="'securityCode' | i18n" - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copySecurityCode' | i18n" data-testid="copy-code" (click)="logCardEvent(true, EventType.Cipher_ClientCopiedCardCode)" > diff --git a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html index 8c6d9f96170..bd2c6e72230 100644 --- a/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html +++ b/libs/vault/src/cipher-view/custom-fields/custom-fields-v2.component.html @@ -19,7 +19,7 @@ [appCopyClick]="field.value" showToast [valueLabel]="field.name" - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyCustomField' | i18n: field.name" data-testid="copy-custom-field" > @@ -40,7 +40,7 @@ [appCopyClick]="field.value" showToast [valueLabel]="field.name" - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyCustomField' | i18n: field.name" (click)="logCopyEvent()" > diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index 1d6c81c6591..88a59d9cc42 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -22,7 +22,7 @@ [appCopyClick]="cipher.login.username" [valueLabel]="'username' | i18n" showToast - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyUsername' | i18n" data-testid="copy-username" > @@ -64,7 +64,7 @@ [appCopyClick]="cipher.login.password" [valueLabel]="'password' | i18n" showToast - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyPassword' | i18n" data-testid="copy-password" (click)="logCopyEvent()" > @@ -127,7 +127,7 @@ [appCopyClick]="totpCodeCopyObj?.totpCode" [valueLabel]="'verificationCodeTotp' | i18n" showToast - [appA11yTitle]="'copyValue' | i18n" + [appA11yTitle]="'copyVerificationCode' | i18n" data-testid="copy-totp" [disabled]="!(isPremium$ | async)" class="disabled:tw-cursor-default" From d0516f24e8b56b24c16175721731405ad59f426e Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Tue, 17 Sep 2024 14:28:39 -0400 Subject: [PATCH 026/104] [AC-2627] Empty Collection New Item Btn Permissions (#11089) * only show new item btn in empty collection for can edit perm --- apps/web/src/app/vault/org-vault/vault.component.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/vault/org-vault/vault.component.html b/apps/web/src/app/vault/org-vault/vault.component.html index ed7f6b1e3ed..220d6ef490f 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.html +++ b/apps/web/src/app/vault/org-vault/vault.component.html @@ -81,7 +81,11 @@ (click)="addCipher()" buttonType="primary" type="button" - *ngIf="filter.type !== 'trash' && filter.collectionId !== Unassigned" + *ngIf=" + filter.type !== 'trash' && + filter.collectionId !== Unassigned && + selectedCollection?.node?.canEditItems(organization) + " > {{ "newItem" | i18n }} From 80a9836cb2a76c0909d6af82beac40a529ab252b Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:00:21 -0500 Subject: [PATCH 027/104] Navigate to fault after cipher deleted. (#11042) --- apps/web/src/app/vault/individual-vault/view.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/app/vault/individual-vault/view.component.ts b/apps/web/src/app/vault/individual-vault/view.component.ts index 77019b6f32e..fe317490c1f 100644 --- a/apps/web/src/app/vault/individual-vault/view.component.ts +++ b/apps/web/src/app/vault/individual-vault/view.component.ts @@ -118,6 +118,7 @@ export class ViewComponent implements OnInit, OnDestroy { } this.dialogRef.close({ action: ViewCipherDialogResult.deleted }); + await this.router.navigate(["/vault"]); }; /** From 1a961ee29454e9090fbe4cc74d9839b5315fad4c Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:05:19 -0700 Subject: [PATCH 028/104] fix send list item button hover (#11109) --- .../send-list-items-container.component.html | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.html b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.html index 5502422a029..b87c418fe58 100644 --- a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.html +++ b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.html @@ -33,21 +33,22 @@ + > + > From 99ba56785d7b9587f23c3dc92db37d34d89b0688 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Tue, 17 Sep 2024 13:15:11 -0700 Subject: [PATCH 029/104] [PM-11393] Remove the need for TotpCaptureService in Autofill Options View component (#11093) --- .../components/vault-v2/view-v2/view-v2.component.ts | 7 ++----- .../services/browser-totp-capture.service.spec.ts | 11 ----------- .../popup/services/browser-totp-capture.service.ts | 4 ---- .../cipher-form/abstractions/totp-capture.service.ts | 6 ------ .../autofill-options-view.component.ts | 11 +++++------ 5 files changed, 7 insertions(+), 32 deletions(-) diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index e8aab69dbe9..b2ef6701b42 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -20,17 +20,15 @@ import { CollectionView } from "@bitwarden/common/vault/models/view/collection.v import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { AsyncActionsModule, - SearchModule, ButtonModule, - IconButtonModule, DialogService, + IconButtonModule, + SearchModule, ToastService, } from "@bitwarden/components"; -import { TotpCaptureService } from "@bitwarden/vault"; import { CipherViewComponent } from "../../../../../../../../libs/vault/src/cipher-view"; import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; -import { BrowserTotpCaptureService } from "../../../services/browser-totp-capture.service"; import { PopupFooterComponent } from "./../../../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "./../../../../../platform/popup/layout/popup-header.component"; @@ -41,7 +39,6 @@ import { VaultPopupAutofillService } from "./../../../services/vault-popup-autof selector: "app-view-v2", templateUrl: "view-v2.component.html", standalone: true, - providers: [{ provide: TotpCaptureService, useClass: BrowserTotpCaptureService }], imports: [ CommonModule, SearchModule, diff --git a/apps/browser/src/vault/popup/services/browser-totp-capture.service.spec.ts b/apps/browser/src/vault/popup/services/browser-totp-capture.service.spec.ts index e790735dc52..2c9afacffd7 100644 --- a/apps/browser/src/vault/popup/services/browser-totp-capture.service.spec.ts +++ b/apps/browser/src/vault/popup/services/browser-totp-capture.service.spec.ts @@ -13,15 +13,10 @@ describe("BrowserTotpCaptureService", () => { let testBed: TestBed; let service: BrowserTotpCaptureService; let mockCaptureVisibleTab: jest.SpyInstance; - let createNewTabSpy: jest.SpyInstance; const validTotpUrl = "otpauth://totp/label?secret=123"; beforeEach(() => { - const tabReturn = new Promise((resolve) => - resolve({ url: "google.com", active: true } as chrome.tabs.Tab), - ); - createNewTabSpy = jest.spyOn(BrowserApi, "createNewTab").mockReturnValue(tabReturn); mockCaptureVisibleTab = jest.spyOn(BrowserApi, "captureVisibleTab"); mockCaptureVisibleTab.mockResolvedValue("screenshot"); @@ -71,10 +66,4 @@ describe("BrowserTotpCaptureService", () => { expect(result).toBeNull(); }); - - it("should call BrowserApi.createNewTab with a given loginURI", async () => { - await service.openAutofillNewTab("www.google.com"); - - expect(createNewTabSpy).toHaveBeenCalledWith("www.google.com"); - }); }); diff --git a/apps/browser/src/vault/popup/services/browser-totp-capture.service.ts b/apps/browser/src/vault/popup/services/browser-totp-capture.service.ts index 8f93db45c0e..3f8ba61ed36 100644 --- a/apps/browser/src/vault/popup/services/browser-totp-capture.service.ts +++ b/apps/browser/src/vault/popup/services/browser-totp-capture.service.ts @@ -20,8 +20,4 @@ export class BrowserTotpCaptureService implements TotpCaptureService { } return null; } - - async openAutofillNewTab(loginUri: string) { - await BrowserApi.createNewTab(loginUri); - } } diff --git a/libs/vault/src/cipher-form/abstractions/totp-capture.service.ts b/libs/vault/src/cipher-form/abstractions/totp-capture.service.ts index ad0b03be824..d6d95565869 100644 --- a/libs/vault/src/cipher-form/abstractions/totp-capture.service.ts +++ b/libs/vault/src/cipher-form/abstractions/totp-capture.service.ts @@ -1,8 +1,3 @@ -/** - * TODO: PM-10727 - Rename and Refactor this service - * This service is being used in both CipherForm and CipherView. Update this service to reflect that - */ - /** * Service to capture TOTP secret from a client application. */ @@ -11,5 +6,4 @@ export abstract class TotpCaptureService { * Captures a TOTP secret and returns it as a string. Returns null if no TOTP secret was found. */ abstract captureTotpSecret(): Promise; - abstract openAutofillNewTab(loginUri: string): void; } diff --git a/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts b/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts index 84f25a146c6..b7708b5aa98 100644 --- a/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts +++ b/libs/vault/src/cipher-view/autofill-options/autofill-options-view.component.ts @@ -2,18 +2,17 @@ import { CommonModule } from "@angular/common"; import { Component, Input } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { CardComponent, FormFieldModule, + IconButtonModule, SectionComponent, SectionHeaderComponent, TypographyModule, - IconButtonModule, } from "@bitwarden/components"; -import { TotpCaptureService } from "../../cipher-form"; - @Component({ selector: "app-autofill-options-view", templateUrl: "autofill-options-view.component.html", @@ -32,9 +31,9 @@ import { TotpCaptureService } from "../../cipher-form"; export class AutofillOptionsViewComponent { @Input() loginUris: LoginUriView[]; - constructor(private totpCaptureService: TotpCaptureService) {} + constructor(private platformUtilsService: PlatformUtilsService) {} - async openWebsite(selectedUri: string) { - await this.totpCaptureService.openAutofillNewTab(selectedUri); + openWebsite(selectedUri: string) { + this.platformUtilsService.launchUri(selectedUri); } } From e8979decae48bd5304bf8bccdd41098e8c4fc015 Mon Sep 17 00:00:00 2001 From: Justin Baur <19896123+justindbaur@users.noreply.github.com> Date: Tue, 17 Sep 2024 16:58:23 -0400 Subject: [PATCH 030/104] Add Back Safari Only Handling of Process Reload (#11115) --- apps/browser/src/background/main.background.ts | 8 ++++++++ apps/browser/src/popup/app.component.ts | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 9579fb2be83..f54f1de1dd5 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1038,6 +1038,14 @@ export default class MainBackground { const systemUtilsServiceReloadCallback = async () => { await this.taskSchedulerService.clearAllScheduledTasks(); + if (this.platformUtilsService.isSafari()) { + // If we do `chrome.runtime.reload` on safari they will send an onInstalled reason of install + // and that prompts us to show a new tab, this apparently doesn't happen on sideloaded + // extensions and only shows itself production scenarios. See: https://bitwarden.atlassian.net/browse/PM-12298 + self.location.reload(); + return; + } + BrowserApi.reloadExtension(); }; diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 477152fff85..12d5b109c20 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -127,6 +127,12 @@ export class AppComponent implements OnInit, OnDestroy { this.showNativeMessagingFingerprintDialog(msg); } else if (msg.command === "showToast") { this.toastService._showToast(msg); + } else if (msg.command === "reloadProcess") { + if (this.platformUtilsService.isSafari()) { + window.setTimeout(() => { + window.location.reload(); + }, 2000); + } } else if (msg.command === "reloadPopup") { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises From 18ef74930c4210d898cbf5b7020ed2b5f8c17cf9 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 00:39:01 +0000 Subject: [PATCH 031/104] Bumped client version(s) (#11118) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/package.json | 2 +- package-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index 08b8d182837..37deab411b9 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2024.9.0", + "version": "2024.9.1", "scripts": { "build:oss": "webpack", "build:bit": "webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/package-lock.json b/package-lock.json index c28985f514c..e71763cde27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -246,7 +246,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2024.9.0" + "version": "2024.9.1" }, "libs/admin-console": { "name": "@bitwarden/admin-console", From 1b7bb014d203d23e9ac391382941a563cf0132b7 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Wed, 18 Sep 2024 12:38:35 +0200 Subject: [PATCH 032/104] [PM-11312] Add "prevent screenshot" setting to windows and mac (#10707) * Add screenshot protection to windows and mac * Update messaging of screencapture prevention feature * Set default state to false --- .../src/app/accounts/settings.component.html | 17 +++++++++++++++++ .../src/app/accounts/settings.component.ts | 6 ++++++ apps/desktop/src/locales/en/messages.json | 6 ++++++ apps/desktop/src/main/window.main.ts | 15 +++++++++++++++ .../services/desktop-settings.service.ts | 19 +++++++++++++++++++ 5 files changed, 63 insertions(+) diff --git a/apps/desktop/src/app/accounts/settings.component.html b/apps/desktop/src/app/accounts/settings.component.html index 359d856525e..891314aa568 100644 --- a/apps/desktop/src/app/accounts/settings.component.html +++ b/apps/desktop/src/app/accounts/settings.component.html @@ -419,6 +419,23 @@ "enableHardwareAccelerationDesc" | i18n }}
+
+
+ +
+ {{ + "allowScreenshotsDesc" | i18n + }} +
@@ -989,7 +946,7 @@ {{ "total" | i18n }} - {{ total | currency: "USD" : "$" }} + {{ total - calculateTotalAppliedDiscount(total) | currency: "USD" : "$" }} / {{ selectedPlanInterval | i18n }} diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts index 8f2b04331cf..52ca5857a0f 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts @@ -509,10 +509,7 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy { } additionalStoragePriceMonthly(selectedPlan: PlanResponse) { - if (!selectedPlan.isAnnual) { - return selectedPlan.PasswordManager.additionalStoragePricePerGb; - } - return selectedPlan.PasswordManager.additionalStoragePricePerGb / 12; + return selectedPlan.PasswordManager.additionalStoragePricePerGb; } additionalServiceAccountTotal(plan: PlanResponse): number { @@ -834,12 +831,7 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy { } calculateTotalAppliedDiscount(total: number) { - const discountPercent = - this.selectedInterval == PlanInterval.Annually - ? this.discountPercentage + this.discountPercentageFromSub - : this.discountPercentageFromSub; - - const discountedTotal = total / (1 - discountPercent / 100); + const discountedTotal = total * (this.discountPercentageFromSub / 100); return discountedTotal; } diff --git a/apps/web/src/app/billing/shared/payment/payment.component.html b/apps/web/src/app/billing/shared/payment/payment.component.html index a627da18da0..f33768c2c95 100644 --- a/apps/web/src/app/billing/shared/payment/payment.component.html +++ b/apps/web/src/app/billing/shared/payment/payment.component.html @@ -26,7 +26,7 @@
-
+
{{ "number" | i18n }} @@ -40,13 +40,13 @@ height="32" />
-
+
{{ "expiration" | i18n }}
-
+
{{ "securityCodeSlashCVV" | i18n }} Date: Wed, 18 Sep 2024 08:57:32 -0700 Subject: [PATCH 039/104] [desktop] Allow manual sync while locked (#6126) Co-authored-by: Daniel James Smith --- apps/desktop/src/main/menu/menu.file.ts | 2 +- apps/desktop/src/main/menu/menu.first.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/main/menu/menu.file.ts b/apps/desktop/src/main/menu/menu.file.ts index 562bc1fd686..712e579515e 100644 --- a/apps/desktop/src/main/menu/menu.file.ts +++ b/apps/desktop/src/main/menu/menu.file.ts @@ -120,7 +120,7 @@ export class FileMenu extends FirstMenu implements IMenubarMenu { id: "syncVault", label: this.localize("syncVault"), click: () => this.sendMessage("syncVault"), - enabled: !this._isLocked, + enabled: this.hasAuthenticatedAccounts, }; } diff --git a/apps/desktop/src/main/menu/menu.first.ts b/apps/desktop/src/main/menu/menu.first.ts index d9575bb2331..6407cc8aff8 100644 --- a/apps/desktop/src/main/menu/menu.first.ts +++ b/apps/desktop/src/main/menu/menu.first.ts @@ -27,6 +27,10 @@ export class FirstMenu { return this._accounts != null && Object.values(this._accounts).some((a) => a.isLockable); } + protected get hasAuthenticatedAccounts(): boolean { + return this._accounts != null && Object.values(this._accounts).some((a) => a.isAuthenticated); + } + protected get checkForUpdates(): MenuItemConstructorOptions { return { id: "checkForUpdates", From 0f3d8a6f893f890dc5c61541c1d6a31dbe7610b1 Mon Sep 17 00:00:00 2001 From: Aftab Ali <67967050+aliaftab612@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:58:47 +0530 Subject: [PATCH 040/104] [PM-11882] Handled identity item and unsupported items during ProtonPass import. (#10967) --- .../spec/protonpass-json-importer.spec.ts | 99 ++++++++++++- .../protonpass-json/protonpass.json.ts | 138 ++++++++++++++++++ .../protonpass-import-utils.spec.ts | 66 +++++++++ .../protonpass/protonpass-import-utils.ts | 21 +++ .../protonpass/protonpass-json-importer.ts | 134 ++++++++++++++++- .../protonpass/types/protonpass-json-type.ts | 52 ++++++- 6 files changed, 504 insertions(+), 6 deletions(-) create mode 100644 libs/importer/src/importers/protonpass/protonpass-import-utils.spec.ts create mode 100644 libs/importer/src/importers/protonpass/protonpass-import-utils.ts diff --git a/libs/importer/spec/protonpass-json-importer.spec.ts b/libs/importer/spec/protonpass-json-importer.spec.ts index d5f4653c643..39a09127c27 100644 --- a/libs/importer/spec/protonpass-json-importer.spec.ts +++ b/libs/importer/spec/protonpass-json-importer.spec.ts @@ -85,7 +85,7 @@ describe("Protonpass Json Importer", () => { // "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]); + expect(result.folderRelationships[4]).toEqual([4, 1]); }); it("should create collections if part of an organization", async () => { @@ -102,7 +102,7 @@ describe("Protonpass Json Importer", () => { // "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]); + expect(result.collectionRelationships[4]).toEqual([4, 1]); }); it("should not add deleted items", async () => { @@ -114,7 +114,7 @@ describe("Protonpass Json Importer", () => { expect(cipher.name).not.toBe("My Deleted Note"); } - expect(ciphers.length).toBe(4); + expect(ciphers.length).toBe(5); }); it("should set favorites", async () => { @@ -126,4 +126,97 @@ describe("Protonpass Json Importer", () => { expect(ciphers[1].favorite).toBe(false); expect(ciphers[2].favorite).toBe(true); }); + + it("should skip unsupported items", async () => { + const testDataJson = JSON.stringify(testData); + const result = await importer.parse(testDataJson); + expect(result != null).toBe(true); + + const ciphers = result.ciphers; + expect(ciphers.length).toBe(5); + expect(ciphers[4].type).toEqual(CipherType.Login); + }); + + it("should parse identity data", async () => { + const testDataJson = JSON.stringify(testData); + const result = await importer.parse(testDataJson); + expect(result != null).toBe(true); + + result.ciphers.shift(); + result.ciphers.shift(); + result.ciphers.shift(); + + const cipher = result.ciphers.shift(); + expect(cipher.type).toEqual(CipherType.Identity); + expect(cipher.identity.firstName).toBe("Test"); + expect(cipher.identity.middleName).toBe("1"); + expect(cipher.identity.lastName).toBe("1"); + expect(cipher.identity.email).toBe("test@gmail.com"); + expect(cipher.identity.phone).toBe("7507951789"); + expect(cipher.identity.company).toBe("Bitwarden"); + expect(cipher.identity.ssn).toBe("98378264782"); + expect(cipher.identity.passportNumber).toBe("7173716378612"); + expect(cipher.identity.licenseNumber).toBe("21234"); + expect(cipher.identity.address1).toBe("Bitwarden"); + expect(cipher.identity.address2).toBe("23 Street"); + expect(cipher.identity.address3).toBe("12th Foor Test County"); + expect(cipher.identity.city).toBe("New York"); + expect(cipher.identity.state).toBe("Test"); + expect(cipher.identity.postalCode).toBe("4038456"); + expect(cipher.identity.country).toBe("US"); + + expect(cipher.fields.length).toEqual(13); + + expect(cipher.fields.at(0).name).toEqual("gender"); + expect(cipher.fields.at(0).value).toEqual("Male"); + expect(cipher.fields.at(0).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(1).name).toEqual("TestPersonal"); + expect(cipher.fields.at(1).value).toEqual("Personal"); + expect(cipher.fields.at(1).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(2).name).toEqual("TestAddress"); + expect(cipher.fields.at(2).value).toEqual("Address"); + expect(cipher.fields.at(2).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(3).name).toEqual("xHandle"); + expect(cipher.fields.at(3).value).toEqual("@twiter"); + expect(cipher.fields.at(3).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(4).name).toEqual("secondPhoneNumber"); + expect(cipher.fields.at(4).value).toEqual("243538978"); + expect(cipher.fields.at(4).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(5).name).toEqual("instagram"); + expect(cipher.fields.at(5).value).toEqual("@insta"); + expect(cipher.fields.at(5).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(6).name).toEqual("TestContact"); + expect(cipher.fields.at(6).value).toEqual("Contact"); + expect(cipher.fields.at(6).type).toEqual(FieldType.Hidden); + + expect(cipher.fields.at(7).name).toEqual("jobTitle"); + expect(cipher.fields.at(7).value).toEqual("Engineer"); + expect(cipher.fields.at(7).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(8).name).toEqual("workPhoneNumber"); + expect(cipher.fields.at(8).value).toEqual("78236476238746"); + expect(cipher.fields.at(8).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(9).name).toEqual("TestWork"); + expect(cipher.fields.at(9).value).toEqual("Work"); + expect(cipher.fields.at(9).type).toEqual(FieldType.Hidden); + + expect(cipher.fields.at(10).name).toEqual("TestSection"); + expect(cipher.fields.at(10).value).toEqual("Section"); + expect(cipher.fields.at(10).type).toEqual(FieldType.Text); + + expect(cipher.fields.at(11).name).toEqual("TestSectionHidden"); + expect(cipher.fields.at(11).value).toEqual("SectionHidden"); + expect(cipher.fields.at(11).type).toEqual(FieldType.Hidden); + + expect(cipher.fields.at(12).name).toEqual("TestExtra"); + expect(cipher.fields.at(12).value).toEqual("Extra"); + expect(cipher.fields.at(12).type).toEqual(FieldType.Text); + }); }); diff --git a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts b/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts index a508a03debc..367c2b37e14 100644 --- a/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts +++ b/libs/importer/spec/test-data/protonpass-json/protonpass.json.ts @@ -138,6 +138,144 @@ export const testData: ProtonPassJsonFile = { modifyTime: 1689182908, pinned: false, }, + { + itemId: + "gliCOyyJOsoBf5QIijvCF4QsPij3q_MR4nCXZ2sXm7YCJCfHjrRD_p2XG9vLsaytErsQvMhcLISVS7q8-7SCkg==", + shareId: + "TpawpLbs1nuUlQUCtgKZgb3zgAvbrGrOaqOylKqVe_RLROEyUvMq8_ZEuGw73PGRUSr89iNtQ2NosuggP54nwA==", + data: { + metadata: { + name: "Identity", + note: "", + itemUuid: "c2e52768", + }, + extraFields: [ + { + fieldName: "TestExtra", + type: "text", + data: { + content: "Extra", + }, + }, + ], + type: "identity", + content: { + fullName: "Test 1", + email: "test@gmail.com", + phoneNumber: "7507951789", + firstName: "Test", + middleName: "1", + lastName: "Test", + birthdate: "", + gender: "Male", + extraPersonalDetails: [ + { + fieldName: "TestPersonal", + type: "text", + data: { + content: "Personal", + }, + }, + ], + organization: "Bitwarden", + streetAddress: "23 Street", + zipOrPostalCode: "4038456", + city: "New York", + stateOrProvince: "Test", + countryOrRegion: "US", + floor: "12th Foor", + county: "Test County", + extraAddressDetails: [ + { + fieldName: "TestAddress", + type: "text", + data: { + content: "Address", + }, + }, + ], + socialSecurityNumber: "98378264782", + passportNumber: "7173716378612", + licenseNumber: "21234", + website: "", + xHandle: "@twiter", + secondPhoneNumber: "243538978", + linkedin: "", + reddit: "", + facebook: "", + yahoo: "", + instagram: "@insta", + extraContactDetails: [ + { + fieldName: "TestContact", + type: "hidden", + data: { + content: "Contact", + }, + }, + ], + company: "Bitwarden", + jobTitle: "Engineer", + personalWebsite: "", + workPhoneNumber: "78236476238746", + workEmail: "", + extraWorkDetails: [ + { + fieldName: "TestWork", + type: "hidden", + data: { + content: "Work", + }, + }, + ], + extraSections: [ + { + sectionName: "TestSection", + sectionFields: [ + { + fieldName: "TestSection", + type: "text", + data: { + content: "Section", + }, + }, + { + fieldName: "TestSectionHidden", + type: "hidden", + data: { + content: "SectionHidden", + }, + }, + ], + }, + ], + }, + }, + state: 1, + aliasEmail: null, + contentFormatVersion: 6, + createTime: 1725707298, + modifyTime: 1725707298, + pinned: false, + }, + { + itemId: + "WTKLZtKfHIC3Gv7gRXUANifNjj0gN3P_52I4MznAzig9GSb_OgJ0qcZ8taOZyfsFTLOWBslXwI-HSMWXVmnKzQ==", + shareId: + "TpawpLbs1nuUlQUCtgKZgb3zgAvbrGrOaqOylKqVe_RLROEyUvMq8_ZEuGw73PGRUSr89iNtQ2NosuggP54nwA==", + data: { + metadata: { name: "Alias", note: "", itemUuid: "576f14fa" }, + extraFields: [], + type: "alias", + content: {}, + }, + state: 1, + aliasEmail: "alias.removing005@passinbox.com", + contentFormatVersion: 6, + createTime: 1725708208, + modifyTime: 1725708208, + pinned: false, + }, ], }, REDACTED_VAULT_ID_B: { diff --git a/libs/importer/src/importers/protonpass/protonpass-import-utils.spec.ts b/libs/importer/src/importers/protonpass/protonpass-import-utils.spec.ts new file mode 100644 index 00000000000..efa91eb98f4 --- /dev/null +++ b/libs/importer/src/importers/protonpass/protonpass-import-utils.spec.ts @@ -0,0 +1,66 @@ +import { processNames } from "./protonpass-import-utils"; + +describe("processNames", () => { + it("should use only fullName to map names if it contains at least three words, ignoring individual name fields", () => { + const result = processNames("Alice Beth Carter", "Kevin", "", ""); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "Beth", + mappedLastName: "Carter", + }); + }); + + it("should map extra words to the middle name if fullName contains more than three words", () => { + const result = processNames("Alice Beth Middle Carter", "", "", ""); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "Beth Middle", + mappedLastName: "Carter", + }); + }); + + it("should map names correctly even if fullName has words separated by more than one space", () => { + const result = processNames("Alice Carter", "", "", ""); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "", + mappedLastName: "Carter", + }); + }); + + it("should handle a single name in fullName and use middleName and lastName to populate rest of names", () => { + const result = processNames("Alice", "", "Beth", "Carter"); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "Beth", + mappedLastName: "Carter", + }); + }); + + it("should correctly map fullName when it only contains two words", () => { + const result = processNames("Alice Carter", "", "", ""); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "", + mappedLastName: "Carter", + }); + }); + + it("should map middle name from middleName if fullName only contains two words", () => { + const result = processNames("Alice Carter", "", "Beth", ""); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "Beth", + mappedLastName: "Carter", + }); + }); + + it("should fall back to firstName, middleName, and lastName if fullName is empty", () => { + const result = processNames("", "Alice", "Beth", "Carter"); + expect(result).toEqual({ + mappedFirstName: "Alice", + mappedMiddleName: "Beth", + mappedLastName: "Carter", + }); + }); +}); diff --git a/libs/importer/src/importers/protonpass/protonpass-import-utils.ts b/libs/importer/src/importers/protonpass/protonpass-import-utils.ts new file mode 100644 index 00000000000..d8e0a096ab7 --- /dev/null +++ b/libs/importer/src/importers/protonpass/protonpass-import-utils.ts @@ -0,0 +1,21 @@ +export function processNames( + fullname: string | null, + firstname: string | null, + middlename: string | null, + lastname: string | null, +) { + let mappedFirstName = firstname; + let mappedMiddleName = middlename; + let mappedLastName = lastname; + + if (fullname) { + const parts = fullname.trim().split(/\s+/); + + // Assign parts to first, middle, and last name based on the number of parts + mappedFirstName = parts[0] || firstname; + mappedLastName = parts.length > 1 ? parts[parts.length - 1] : lastname; + mappedMiddleName = parts.length > 2 ? parts.slice(1, -1).join(" ") : middlename; + } + + return { mappedFirstName, mappedMiddleName, mappedLastName }; +} diff --git a/libs/importer/src/importers/protonpass/protonpass-json-importer.ts b/libs/importer/src/importers/protonpass/protonpass-json-importer.ts index b8f6bc170c2..94d21f8521c 100644 --- a/libs/importer/src/importers/protonpass/protonpass-json-importer.ts +++ b/libs/importer/src/importers/protonpass/protonpass-json-importer.ts @@ -1,24 +1,110 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { FieldType, SecureNoteType, CipherType } from "@bitwarden/common/vault/enums"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { IdentityView } from "@bitwarden/common/vault/models/view/identity.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 { processNames } from "./protonpass-import-utils"; import { ProtonPassCreditCardItemContent, + ProtonPassIdentityItemContent, + ProtonPassIdentityItemExtraSection, + ProtonPassItemExtraField, ProtonPassItemState, ProtonPassJsonFile, ProtonPassLoginItemContent, } from "./types/protonpass-json-type"; export class ProtonPassJsonImporter extends BaseImporter implements Importer { + private mappedIdentityItemKeys = [ + "fullName", + "firstName", + "middleName", + "lastName", + "email", + "phoneNumber", + "company", + "socialSecurityNumber", + "passportNumber", + "licenseNumber", + "organization", + "streetAddress", + "floor", + "county", + "city", + "stateOrProvince", + "zipOrPostalCode", + "countryOrRegion", + ]; + + private identityItemExtraFieldsKeys = [ + "extraPersonalDetails", + "extraAddressDetails", + "extraContactDetails", + "extraWorkDetails", + "extraSections", + ]; + constructor(private i18nService: I18nService) { super(); } + private processIdentityItemUnmappedAndExtraFields( + cipher: CipherView, + identityItem: ProtonPassIdentityItemContent, + ) { + Object.keys(identityItem).forEach((key) => { + if ( + !this.mappedIdentityItemKeys.includes(key) && + !this.identityItemExtraFieldsKeys.includes(key) + ) { + this.processKvp( + cipher, + key, + identityItem[key as keyof ProtonPassIdentityItemContent] as string, + ); + return; + } + + if (this.identityItemExtraFieldsKeys.includes(key)) { + if (key !== "extraSections") { + const extraFields = identityItem[ + key as keyof ProtonPassIdentityItemContent + ] as ProtonPassItemExtraField[]; + + extraFields?.forEach((extraField) => { + this.processKvp( + cipher, + extraField.fieldName, + extraField.data.content, + extraField.type === "hidden" ? FieldType.Hidden : FieldType.Text, + ); + }); + } else { + const extraSections = identityItem[ + key as keyof ProtonPassIdentityItemContent + ] as ProtonPassIdentityItemExtraSection[]; + + extraSections?.forEach((extraSection) => { + extraSection.sectionFields?.forEach((extraField) => { + this.processKvp( + cipher, + extraField.fieldName, + extraField.data.content, + extraField.type === "hidden" ? FieldType.Hidden : FieldType.Text, + ); + }); + }); + } + } + }); + } + parse(data: string): Promise { const result = new ImportResult(); const results: ProtonPassJsonFile = JSON.parse(data); @@ -38,7 +124,6 @@ export class ProtonPassJsonImporter extends BaseImporter implements Importer { if (item.state == ProtonPassItemState.TRASHED) { continue; } - this.processFolder(result, vault.name); const cipher = this.initLoginCipher(); cipher.name = this.getValueOrDefault(item.data.metadata.name, "--"); @@ -96,8 +181,55 @@ export class ProtonPassJsonImporter extends BaseImporter implements Importer { break; } + case "identity": { + const identityContent = item.data.content as ProtonPassIdentityItemContent; + cipher.type = CipherType.Identity; + cipher.identity = new IdentityView(); + + const { mappedFirstName, mappedMiddleName, mappedLastName } = processNames( + this.getValueOrDefault(identityContent.fullName), + this.getValueOrDefault(identityContent.firstName), + this.getValueOrDefault(identityContent.middleName), + this.getValueOrDefault(identityContent.lastName), + ); + cipher.identity.firstName = mappedFirstName; + cipher.identity.middleName = mappedMiddleName; + cipher.identity.lastName = mappedLastName; + + cipher.identity.email = this.getValueOrDefault(identityContent.email); + cipher.identity.phone = this.getValueOrDefault(identityContent.phoneNumber); + cipher.identity.company = this.getValueOrDefault(identityContent.company); + cipher.identity.ssn = this.getValueOrDefault(identityContent.socialSecurityNumber); + cipher.identity.passportNumber = this.getValueOrDefault(identityContent.passportNumber); + cipher.identity.licenseNumber = this.getValueOrDefault(identityContent.licenseNumber); + + const address3 = + `${identityContent.floor ?? ""} ${identityContent.county ?? ""}`.trim(); + cipher.identity.address1 = this.getValueOrDefault(identityContent.organization); + cipher.identity.address2 = this.getValueOrDefault(identityContent.streetAddress); + cipher.identity.address3 = this.getValueOrDefault(address3); + + cipher.identity.city = this.getValueOrDefault(identityContent.city); + cipher.identity.state = this.getValueOrDefault(identityContent.stateOrProvince); + cipher.identity.postalCode = this.getValueOrDefault(identityContent.zipOrPostalCode); + cipher.identity.country = this.getValueOrDefault(identityContent.countryOrRegion); + this.processIdentityItemUnmappedAndExtraFields(cipher, identityContent); + + for (const extraField of item.data.extraFields) { + this.processKvp( + cipher, + extraField.fieldName, + extraField.data.content, + extraField.type === "hidden" ? FieldType.Hidden : FieldType.Text, + ); + } + break; + } + default: + continue; } + this.processFolder(result, vault.name); this.cleanupCipher(cipher); result.ciphers.push(cipher); } diff --git a/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts b/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts index eb3b4bba5ac..20fa314a314 100644 --- a/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts +++ b/libs/importer/src/importers/protonpass/types/protonpass-json-type.ts @@ -36,8 +36,11 @@ export type ProtonPassItemData = { metadata: ProtonPassItemMetadata; extraFields: ProtonPassItemExtraField[]; platformSpecific?: any; - type: "login" | "alias" | "creditCard" | "note"; - content: ProtonPassLoginItemContent | ProtonPassCreditCardItemContent; + type: "login" | "alias" | "creditCard" | "note" | "identity"; + content: + | ProtonPassLoginItemContent + | ProtonPassCreditCardItemContent + | ProtonPassIdentityItemContent; }; export type ProtonPassItemMetadata = { @@ -74,3 +77,48 @@ export type ProtonPassCreditCardItemContent = { expirationDate?: string; pin?: string; }; + +export type ProtonPassIdentityItemExtraSection = { + sectionName?: string; + sectionFields?: ProtonPassItemExtraField[]; +}; + +export type ProtonPassIdentityItemContent = { + fullName?: string; + email?: string; + phoneNumber?: string; + firstName?: string; + middleName?: string; + lastName?: string; + birthdate?: string; + gender?: string; + extraPersonalDetails?: ProtonPassItemExtraField[]; + organization?: string; + streetAddress?: string; + zipOrPostalCode?: string; + city?: string; + stateOrProvince?: string; + countryOrRegion?: string; + floor?: string; + county?: string; + extraAddressDetails?: ProtonPassItemExtraField[]; + socialSecurityNumber?: string; + passportNumber?: string; + licenseNumber?: string; + website?: string; + xHandle?: string; + secondPhoneNumber?: string; + linkedin?: string; + reddit?: string; + facebook?: string; + yahoo?: string; + instagram?: string; + extraContactDetails?: ProtonPassItemExtraField[]; + company?: string; + jobTitle?: string; + personalWebsite?: string; + workPhoneNumber?: string; + workEmail?: string; + extraWorkDetails?: ProtonPassItemExtraField[]; + extraSections?: ProtonPassIdentityItemExtraSection[]; +}; From c9bcdd60ac27f7682ac9493fbbc0b049b6523f84 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:50:49 -0700 Subject: [PATCH 041/104] use tw classes for svg colors in no-credentials.svg (#11129) --- .../src/icons/no-credentials.icon.ts | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libs/tools/generator/components/src/icons/no-credentials.icon.ts b/libs/tools/generator/components/src/icons/no-credentials.icon.ts index 63843faccc9..7bb289600b8 100644 --- a/libs/tools/generator/components/src/icons/no-credentials.icon.ts +++ b/libs/tools/generator/components/src/icons/no-credentials.icon.ts @@ -3,20 +3,20 @@ import { svgIcon } from "@bitwarden/components"; export const NoCredentialsIcon = svgIcon` - - - - - - - - - - - - - - + + + + + + + + + + + + + + From a674f698a270a1fbb7fa8b32db17a32266e8965b Mon Sep 17 00:00:00 2001 From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:53:04 +0200 Subject: [PATCH 042/104] [PM-12067] Add sorting to exposed passwords report (#11029) * Add sorting to exposed passwords report - Create new type to represent a row within the report - Add types and remove usage of any - Include the exposed number of times within the data passed to the datasource/table instead of looking it up via the `exposedPasswordMap` - Enable sorting via bitSortable - Set default sort to order by exposed number of times in descending order * Show headers and sort also within AC version of exposed-passwords report but hide the Owner column --------- Co-authored-by: Daniel James Smith --- .../pages/exposed-passwords-report.component.html | 14 ++++++++------ .../pages/exposed-passwords-report.component.ts | 15 +++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html index 09c717e9131..43701dcd712 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html @@ -27,12 +27,14 @@ - +
- {{ "name" | i18n }} - {{ "owner" | i18n }} - + {{ "name" | i18n }} + + {{ "owner" | i18n }} + +
@@ -74,7 +76,7 @@

{{ r.subTitle }} - + - {{ "exposedXTimes" | i18n: (exposedPasswordMap.get(r.id) | number) }} + {{ "exposedXTimes" | i18n: (r.exposedXTimes | number) }} diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts index 8503174a937..13d2804c5e5 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.ts @@ -11,12 +11,14 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { PasswordRepromptService } from "@bitwarden/vault"; import { CipherReportComponent } from "./cipher-report.component"; + +type ReportResult = CipherView & { exposedXTimes: number }; + @Component({ selector: "app-exposed-passwords-report", templateUrl: "exposed-passwords-report.component.html", }) export class ExposedPasswordsReportComponent extends CipherReportComponent implements OnInit { - exposedPasswordMap = new Map(); disabled = true; constructor( @@ -44,12 +46,12 @@ export class ExposedPasswordsReportComponent extends CipherReportComponent imple async setCiphers() { const allCiphers = await this.getAllCiphers(); - const exposedPasswordCiphers: CipherView[] = []; + const exposedPasswordCiphers: ReportResult[] = []; const promises: Promise[] = []; this.filterStatus = [0]; - allCiphers.forEach((ciph: any) => { - const { type, login, isDeleted, edit, viewPassword, id } = ciph; + allCiphers.forEach((ciph) => { + const { type, login, isDeleted, edit, viewPassword } = ciph; if ( type !== CipherType.Login || login.password == null || @@ -63,8 +65,8 @@ export class ExposedPasswordsReportComponent extends CipherReportComponent imple const promise = this.auditService.passwordLeaked(login.password).then((exposedCount) => { if (exposedCount > 0) { - exposedPasswordCiphers.push(ciph); - this.exposedPasswordMap.set(id, exposedCount); + const row = { ...ciph, exposedXTimes: exposedCount } as ReportResult; + exposedPasswordCiphers.push(row); } }); promises.push(promise); @@ -72,6 +74,7 @@ export class ExposedPasswordsReportComponent extends CipherReportComponent imple await Promise.all(promises); this.filterCiphersByOrg(exposedPasswordCiphers); + this.dataSource.sort = { column: "exposedXTimes", direction: "desc" }; } protected canManageCipher(c: CipherView): boolean { From 931f86c9482dc67751add2da5d1db7512761f184 Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:48:47 -0500 Subject: [PATCH 043/104] [PM- 9666] Implement edit item view individual vault (#10553) * Add initial vault cipher form for cipher edit. * Add ability to add new cipher by type * Add ability to save and clone cipher, * Update canEditAllCiphers to take 1 argument. * Add attachments button to add/edit dialog. * Add semi-working attachment dialog. * Add working attachment functionality. * Remove debugging code. * Add tests for new attachments dialog component. * Add AddEditComponentV2 tests. * Remove AddEditComponentV2 delete functionality. * Remove unnecessary else statement. * Launch password generation in new dialog when extension refresh enabled. * Add tests for PasswordGeneratorComponent. * Adjust password and attachments dialog sizes. * run lint:fix * Remove unnecessary form from button. * Add missing provider in test. * Remove password generation events. * Add WebVaultGeneratorDialogComponent and WebCipherFormGenerationService * Move and rename CipherFormQueryParams * Use WebCipherFormGenerationService to launch password / user generation modals. * Add WebVaultGeneratorDialogComponent tests. * Remove unnecessary functionality and corresponding tests. * Fix failing tests. * Remove unused properties from AddEditComponentV2 * Pass CipherFormConfig to dialog. * Clean up unused attachment dialog functionality. * Update AddEdit cancel functionality to prevent navigating user. * Make attachment dialog open a static method. * Add addCipherV2 method and clean up tests. * Remove changes to QueryParams. * Add tests for WebCipherFormGenerationService * Remove unused onCipherSaved method. * Remove cipherSaved event. * Remove unused password generator component * Refactor to simplify editCipherId for extensionRefresh flag. * Add additional comments to AddEditComponentV2. * Simplify open vault generator dialog comment. * Remove unused organizationService * Remove unnecessary typecasting. * Remove extensionRefreshEnabled and related. * Remove slideIn animation * Remove unused AddEditComponentV2 properties. * Add back generic typing. * Condesnse properties into single form config. * Remove onDestroy and related code. * Run prettier * fix injection warning * Handle cipher save. * Redirect to vault on delete and make actions consistent. * Update comment. --- .../add-edit-v2.component.html | 34 ++++ .../add-edit-v2.component.spec.ts | 124 ++++++++++++ .../individual-vault/add-edit-v2.component.ts | 177 ++++++++++++++++++ .../attachments-v2.component.html | 19 ++ .../attachments-v2.component.spec.ts | 65 +++++++ .../attachments-v2.component.ts | 87 +++++++++ .../vault/individual-vault/vault.component.ts | 167 +++++++++++++++-- .../individual-vault/view.component.spec.ts | 4 +- .../vault/individual-vault/view.component.ts | 8 +- .../app/vault/org-vault/vault.component.ts | 3 +- apps/web/src/locales/en/messages.json | 21 +++ .../cipher-attachments.component.ts | 5 + .../login-details-section.component.spec.ts | 5 + .../web-generator-dialog.component.html | 22 +++ .../web-generator-dialog.component.spec.ts | 125 +++++++++++++ .../web-generator-dialog.component.ts | 89 +++++++++ ...web-cipher-form-generation.service.spec.ts | 88 +++++++++ .../web-cipher-form-generation.service.ts | 40 ++++ 18 files changed, 1065 insertions(+), 18 deletions(-) create mode 100644 apps/web/src/app/vault/individual-vault/add-edit-v2.component.html create mode 100644 apps/web/src/app/vault/individual-vault/add-edit-v2.component.spec.ts create mode 100644 apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts create mode 100644 apps/web/src/app/vault/individual-vault/attachments-v2.component.html create mode 100644 apps/web/src/app/vault/individual-vault/attachments-v2.component.spec.ts create mode 100644 apps/web/src/app/vault/individual-vault/attachments-v2.component.ts create mode 100644 libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.html create mode 100644 libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.spec.ts create mode 100644 libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.ts create mode 100644 libs/vault/src/cipher-form/services/web-cipher-form-generation.service.spec.ts create mode 100644 libs/vault/src/cipher-form/services/web-cipher-form-generation.service.ts diff --git a/apps/web/src/app/vault/individual-vault/add-edit-v2.component.html b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.html new file mode 100644 index 00000000000..6aa3e610645 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.html @@ -0,0 +1,34 @@ + + + {{ headerText }} + + + + + + + + + + + + + diff --git a/apps/web/src/app/vault/individual-vault/add-edit-v2.component.spec.ts b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.spec.ts new file mode 100644 index 00000000000..cd3fec73778 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.spec.ts @@ -0,0 +1,124 @@ +import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ActivatedRoute, Router } from "@angular/router"; +import { mock, MockProxy } from "jest-mock-extended"; +import { of } from "rxjs"; + +import { 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 { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +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 { DialogService } from "@bitwarden/components"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; +import { CipherFormConfig, DefaultCipherFormConfigService } from "@bitwarden/vault"; + +import { AddEditComponentV2 } from "./add-edit-v2.component"; + +describe("AddEditComponentV2", () => { + let component: AddEditComponentV2; + let fixture: ComponentFixture; + let organizationService: MockProxy; + let policyService: MockProxy; + let billingAccountProfileStateService: MockProxy; + let activatedRoute: MockProxy; + let dialogRef: MockProxy>; + let dialogService: MockProxy; + let cipherService: MockProxy; + let messagingService: MockProxy; + let folderService: MockProxy; + let collectionService: MockProxy; + + const mockParams = { + cloneMode: false, + cipherFormConfig: mock(), + }; + + beforeEach(async () => { + const mockOrganization: Organization = { + id: "org-id", + name: "Test Organization", + } as Organization; + + organizationService = mock(); + organizationService.organizations$ = of([mockOrganization]); + + policyService = mock(); + policyService.policyAppliesToActiveUser$.mockImplementation((policyType: PolicyType) => + of(true), + ); + + billingAccountProfileStateService = mock(); + billingAccountProfileStateService.hasPremiumFromAnySource$ = of(true); + + activatedRoute = mock(); + activatedRoute.queryParams = of({}); + + dialogRef = mock>(); + dialogService = mock(); + messagingService = mock(); + folderService = mock(); + folderService.folderViews$ = of([]); + collectionService = mock(); + collectionService.decryptedCollections$ = of([]); + + const mockDefaultCipherFormConfigService = { + buildConfig: jest.fn().mockResolvedValue({ + allowPersonal: true, + allowOrganization: true, + }), + }; + + await TestBed.configureTestingModule({ + imports: [AddEditComponentV2], + providers: [ + { provide: DIALOG_DATA, useValue: mockParams }, + { provide: DialogRef, useValue: dialogRef }, + { provide: I18nService, useValue: { t: jest.fn().mockReturnValue("login") } }, + { provide: DialogService, useValue: dialogService }, + { provide: CipherService, useValue: cipherService }, + { provide: MessagingService, useValue: messagingService }, + { provide: OrganizationService, useValue: organizationService }, + { provide: Router, useValue: mock() }, + { provide: ActivatedRoute, useValue: activatedRoute }, + { provide: CollectionService, useValue: collectionService }, + { provide: FolderService, useValue: folderService }, + { provide: CryptoService, useValue: mock() }, + { provide: BillingAccountProfileStateService, useValue: billingAccountProfileStateService }, + { provide: PolicyService, useValue: policyService }, + { provide: DefaultCipherFormConfigService, useValue: mockDefaultCipherFormConfigService }, + { + provide: PasswordGenerationServiceAbstraction, + useValue: mock(), + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(AddEditComponentV2); + component = fixture.componentInstance; + }); + + describe("ngOnInit", () => { + it("initializes the component with cipher", async () => { + await component.ngOnInit(); + + expect(component).toBeTruthy(); + }); + }); + + describe("cancel", () => { + it("handles cancel action", async () => { + const spyClose = jest.spyOn(dialogRef, "close"); + + await component.cancel(); + + expect(spyClose).toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts new file mode 100644 index 00000000000..64935c8af38 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts @@ -0,0 +1,177 @@ +import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; +import { Component, Inject, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; + +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherId } from "@bitwarden/common/types/guid"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { AsyncActionsModule, DialogModule, DialogService, ItemModule } from "@bitwarden/components"; +import { + CipherAttachmentsComponent, + CipherFormConfig, + CipherFormGenerationService, + CipherFormMode, + CipherFormModule, +} from "@bitwarden/vault"; + +import { WebCipherFormGenerationService } from "../../../../../../libs/vault/src/cipher-form/services/web-cipher-form-generation.service"; +import { CipherViewComponent } from "../../../../../../libs/vault/src/cipher-view/cipher-view.component"; +import { SharedModule } from "../../shared/shared.module"; + +import { AttachmentsV2Component } from "./attachments-v2.component"; + +/** + * The result of the AddEditCipherDialogV2 component. + */ +export enum AddEditCipherDialogResult { + Edited = "edited", + Added = "added", + Canceled = "canceled", +} + +/** + * The close result of the AddEditCipherDialogV2 component. + */ +export interface AddEditCipherDialogCloseResult { + /** + * The action that was taken. + */ + action: AddEditCipherDialogResult; + /** + * The ID of the cipher that was edited or added. + */ + id?: CipherId; +} + +/** + * Component for viewing a cipher, presented in a dialog. + */ +@Component({ + selector: "app-vault-add-edit-v2", + templateUrl: "add-edit-v2.component.html", + standalone: true, + imports: [ + CipherViewComponent, + CommonModule, + AsyncActionsModule, + DialogModule, + SharedModule, + CipherFormModule, + CipherAttachmentsComponent, + ItemModule, + ], + providers: [{ provide: CipherFormGenerationService, useClass: WebCipherFormGenerationService }], +}) +export class AddEditComponentV2 implements OnInit { + config: CipherFormConfig; + headerText: string; + canAccessAttachments: boolean = false; + + /** + * Constructor for the AddEditComponentV2 component. + * @param params The parameters for the component. + * @param dialogRef The reference to the dialog. + * @param i18nService The internationalization service. + * @param dialogService The dialog service. + * @param billingAccountProfileStateService The billing account profile state service. + */ + constructor( + @Inject(DIALOG_DATA) public params: CipherFormConfig, + private dialogRef: DialogRef, + private i18nService: I18nService, + private dialogService: DialogService, + private billingAccountProfileStateService: BillingAccountProfileStateService, + ) { + this.billingAccountProfileStateService.hasPremiumFromAnySource$ + .pipe(takeUntilDestroyed()) + .subscribe((canAccessPremium) => { + this.canAccessAttachments = canAccessPremium; + }); + } + + /** + * Lifecycle hook for component initialization. + */ + async ngOnInit() { + this.config = this.params; + this.headerText = this.setHeader(this.config?.mode, this.config.cipherType); + } + + /** + * Getter to check if the component is loading. + */ + get loading() { + return this.config == null; + } + + /** + * Method to handle cancel action. Called when a user clicks the cancel button. + */ + async cancel() { + this.dialogRef.close({ action: AddEditCipherDialogResult.Canceled }); + } + + /** + * Sets the header text based on the mode and type of the cipher. + * @param mode The form mode. + * @param type The cipher type. + * @returns The header text. + */ + setHeader(mode: CipherFormMode, type: CipherType) { + const partOne = mode === "edit" || mode === "partial-edit" ? "editItemHeader" : "newItemHeader"; + switch (type) { + case CipherType.Login: + return this.i18nService.t(partOne, this.i18nService.t("typeLogin").toLowerCase()); + case CipherType.Card: + return this.i18nService.t(partOne, this.i18nService.t("typeCard").toLowerCase()); + case CipherType.Identity: + return this.i18nService.t(partOne, this.i18nService.t("typeIdentity").toLowerCase()); + case CipherType.SecureNote: + return this.i18nService.t(partOne, this.i18nService.t("note").toLowerCase()); + } + } + + /** + * Opens the attachments dialog. + */ + async openAttachmentsDialog() { + this.dialogService.open( + AttachmentsV2Component, + { + data: { + cipherId: this.config.originalCipher?.id as CipherId, + }, + }, + ); + } + + /** + * Handles the event when a cipher is saved. + * @param cipherView The cipher view that was saved. + */ + async onCipherSaved(cipherView: CipherView) { + this.dialogRef.close({ + action: + this.config.mode === "add" + ? AddEditCipherDialogResult.Added + : AddEditCipherDialogResult.Edited, + id: cipherView.id as CipherId, + }); + } +} + +/** + * Strongly typed helper to open a cipher add/edit dialog + * @param dialogService Instance of the dialog service that will be used to open the dialog + * @param config Configuration for the dialog + * @returns A reference to the opened dialog + */ +export function openAddEditCipherDialog( + dialogService: DialogService, + config: DialogConfig, +): DialogRef { + return dialogService.open(AddEditComponentV2, config); +} diff --git a/apps/web/src/app/vault/individual-vault/attachments-v2.component.html b/apps/web/src/app/vault/individual-vault/attachments-v2.component.html new file mode 100644 index 00000000000..532a0224be4 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/attachments-v2.component.html @@ -0,0 +1,19 @@ + + + {{ "attachments" | i18n }} + + + + + + + + diff --git a/apps/web/src/app/vault/individual-vault/attachments-v2.component.spec.ts b/apps/web/src/app/vault/individual-vault/attachments-v2.component.spec.ts new file mode 100644 index 00000000000..8099d8fe929 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/attachments-v2.component.spec.ts @@ -0,0 +1,65 @@ +import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { mock } from "jest-mock-extended"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { CipherId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; + +import { + AttachmentsV2Component, + AttachmentDialogResult, + AttachmentsDialogParams, +} from "./attachments-v2.component"; + +describe("AttachmentsV2Component", () => { + let component: AttachmentsV2Component; + let fixture: ComponentFixture; + + const mockCipherId: CipherId = "cipher-id" as CipherId; + const mockParams: AttachmentsDialogParams = { + cipherId: mockCipherId, + }; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AttachmentsV2Component, NoopAnimationsModule], + providers: [ + { provide: DIALOG_DATA, useValue: mockParams }, + { provide: DialogRef, useValue: mock() }, + { provide: I18nService, useValue: mock() }, + { provide: CipherService, useValue: mock() }, + { provide: LogService, useValue: mock() }, + { provide: AccountService, useValue: mock() }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(AttachmentsV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("initializes without errors and with the correct cipherId", () => { + expect(component).toBeTruthy(); + expect(component.cipherId).toBe(mockParams.cipherId); + }); + + it("closes the dialog with 'uploaded' result on uploadSuccessful", () => { + const dialogRefCloseSpy = jest.spyOn(component["dialogRef"], "close"); + + component.uploadSuccessful(); + + expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: AttachmentDialogResult.Uploaded }); + }); + + it("closes the dialog with 'removed' result on removalSuccessful", () => { + const dialogRefCloseSpy = jest.spyOn(component["dialogRef"], "close"); + + component.removalSuccessful(); + + expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: AttachmentDialogResult.Removed }); + }); +}); diff --git a/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts b/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts new file mode 100644 index 00000000000..e3b974e6c09 --- /dev/null +++ b/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts @@ -0,0 +1,87 @@ +import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; +import { Component, Inject } from "@angular/core"; + +import { CipherId } from "@bitwarden/common/types/guid"; +import { DialogService } from "@bitwarden/components"; +import { CipherAttachmentsComponent } from "@bitwarden/vault"; + +import { SharedModule } from "../../shared"; + +export interface AttachmentsDialogParams { + cipherId: CipherId; +} + +/** + * Enum representing the possible results of the attachment dialog. + */ +export enum AttachmentDialogResult { + Uploaded = "uploaded", + Removed = "removed", + Closed = "closed", +} + +export interface AttachmentDialogCloseResult { + action: AttachmentDialogResult; +} + +/** + * Component for the attachments dialog. + */ +@Component({ + selector: "app-vault-attachments-v2", + templateUrl: "attachments-v2.component.html", + standalone: true, + imports: [CommonModule, SharedModule, CipherAttachmentsComponent], +}) +export class AttachmentsV2Component { + cipherId: CipherId; + attachmentFormId = CipherAttachmentsComponent.attachmentFormID; + + /** + * Constructor for AttachmentsV2Component. + * @param dialogRef - Reference to the dialog. + * @param params - Parameters passed to the dialog. + */ + constructor( + private dialogRef: DialogRef, + @Inject(DIALOG_DATA) public params: AttachmentsDialogParams, + ) { + this.cipherId = params.cipherId; + } + + /** + * Opens the attachments dialog. + * @param dialogService - The dialog service. + * @param params - The parameters for the dialog. + * @returns The dialog reference. + */ + static open( + dialogService: DialogService, + params: AttachmentsDialogParams, + ): DialogRef { + return dialogService.open(AttachmentsV2Component, { + data: params, + }); + } + + /** + * Called when an attachment is successfully uploaded. + * Closes the dialog with an 'uploaded' result. + */ + uploadSuccessful() { + this.dialogRef.close({ + action: AttachmentDialogResult.Uploaded, + }); + } + + /** + * Called when an attachment is successfully removed. + * Closes the dialog with a 'removed' result. + */ + removalSuccessful() { + this.dialogRef.close({ + action: AttachmentDialogResult.Removed, + }); + } +} 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 dcf62235d1b..a288b298bad 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -47,20 +47,25 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SyncService } from "@bitwarden/common/platform/sync"; -import { OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherId, OrganizationId, CollectionId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CollectionData } from "@bitwarden/common/vault/models/data/collection.data"; +import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node"; import { CollectionDetailsResponse } from "@bitwarden/common/vault/models/response/collection.response"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; import { ServiceUtils } from "@bitwarden/common/vault/service-utils"; import { DialogService, Icons, ToastService } from "@bitwarden/components"; -import { CollectionAssignmentResult, PasswordRepromptService } from "@bitwarden/vault"; +import { + CollectionAssignmentResult, + DefaultCipherFormConfigService, + PasswordRepromptService, +} from "@bitwarden/vault"; import { SharedModule } from "../../shared/shared.module"; import { AssignCollectionsWebComponent } from "../components/assign-collections"; @@ -74,7 +79,17 @@ import { VaultItemEvent } from "../components/vault-items/vault-item-event"; import { VaultItemsModule } from "../components/vault-items/vault-items.module"; import { getNestedCollectionTree } from "../utils/collection-utils"; +import { + AddEditCipherDialogCloseResult, + AddEditCipherDialogResult, + openAddEditCipherDialog, +} from "./add-edit-v2.component"; import { AddEditComponent } from "./add-edit.component"; +import { + AttachmentDialogCloseResult, + AttachmentDialogResult, + AttachmentsV2Component, +} from "./attachments-v2.component"; import { AttachmentsComponent } from "./attachments.component"; import { BulkDeleteDialogResult, @@ -131,7 +146,11 @@ const SearchTextDebounceInterval = 200; VaultItemsModule, SharedModule, ], - providers: [RoutedVaultFilterService, RoutedVaultFilterBridgeService], + providers: [ + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + DefaultCipherFormConfigService, + ], }) export class VaultComponent implements OnInit, OnDestroy { @ViewChild("vaultFilter", { static: true }) filterComponent: VaultFilterComponent; @@ -170,6 +189,7 @@ export class VaultComponent implements OnInit, OnDestroy { private searchText$ = new Subject(); private refresh$ = new BehaviorSubject(null); private destroy$ = new Subject(); + private extensionRefreshEnabled: boolean; constructor( private syncService: SyncService, @@ -200,6 +220,7 @@ export class VaultComponent implements OnInit, OnDestroy { private billingAccountProfileStateService: BillingAccountProfileStateService, private toastService: ToastService, private accountService: AccountService, + private cipherFormConfigService: DefaultCipherFormConfigService, ) {} async ngOnInit() { @@ -416,6 +437,11 @@ export class VaultComponent implements OnInit, OnDestroy { this.refreshing = false; }, ); + + // Check if the extension refresh feature flag is enabled + this.extensionRefreshEnabled = await this.configService.getFeatureFlag( + FeatureFlag.ExtensionRefresh, + ); } ngOnDestroy() { @@ -511,6 +537,15 @@ export class VaultComponent implements OnInit, OnDestroy { this.searchText$.next(searchText); } + /** + * Handles opening the attachments dialog for a cipher. + * Runs several checks to ensure that the user has the correct permissions + * and then opens the attachments dialog. + * Uses the new AttachmentsV2Component if the extensionRefresh feature flag is enabled. + * + * @param cipher + * @returns + */ async editCipherAttachments(cipher: CipherView) { if (cipher?.reprompt !== 0 && !(await this.passwordRepromptService.showPasswordPrompt())) { this.go({ cipherId: null, itemId: null }); @@ -536,6 +571,24 @@ export class VaultComponent implements OnInit, OnDestroy { ); let madeAttachmentChanges = false; + + if (this.extensionRefreshEnabled) { + const dialogRef = AttachmentsV2Component.open(this.dialogService, { + cipherId: cipher.id as CipherId, + }); + + const result: AttachmentDialogCloseResult = await lastValueFrom(dialogRef.closed); + + if ( + result.action === AttachmentDialogResult.Uploaded || + result.action === AttachmentDialogResult.Removed + ) { + this.refresh(); + } + + return; + } + const [modal] = await this.modalService.openViewRef( AttachmentsComponent, this.attachmentsModalRef, @@ -598,7 +651,11 @@ export class VaultComponent implements OnInit, OnDestroy { } async addCipher(cipherType?: CipherType) { - const component = await this.editCipher(null); + if (this.extensionRefreshEnabled) { + return this.addCipherV2(cipherType); + } + + const component = (await this.editCipher(null)) as AddEditComponent; component.type = cipherType || this.activeFilter.cipherType; if ( this.activeFilter.organizationId !== "MyVault" && @@ -622,18 +679,60 @@ export class VaultComponent implements OnInit, OnDestroy { component.folderId = this.activeFilter.folderId; } + /** + * Opens the add cipher dialog. + * @param cipherType The type of cipher to add. + * @returns The dialog reference. + */ + async addCipherV2(cipherType?: CipherType) { + const cipherFormConfig = await this.cipherFormConfigService.buildConfig( + "add", + null, + cipherType, + ); + cipherFormConfig.initialValues = { + organizationId: + this.activeFilter.organizationId !== "MyVault" && this.activeFilter.organizationId != null + ? (this.activeFilter.organizationId as OrganizationId) + : null, + collectionIds: + this.activeFilter.collectionId !== "AllCollections" && + this.activeFilter.collectionId != null + ? [this.activeFilter.collectionId as CollectionId] + : [], + folderId: this.activeFilter.folderId, + }; + + // Open the dialog. + const dialogRef = openAddEditCipherDialog(this.dialogService, { + data: cipherFormConfig, + }); + + // Wait for the dialog to close. + const result: AddEditCipherDialogCloseResult = await lastValueFrom(dialogRef.closed); + + // Refresh the vault to show the new cipher. + if (result?.action === AddEditCipherDialogResult.Added) { + this.refresh(); + this.go({ itemId: result.id, action: "view" }); + return; + } + + // If the dialog was closed by any other action navigate back to the vault. + this.go({ cipherId: null, itemId: null, action: null }); + } + async navigateToCipher(cipher: CipherView) { this.go({ itemId: cipher?.id }); } - async editCipher(cipher: CipherView) { - return this.editCipherId(cipher?.id); + async editCipher(cipher: CipherView, cloneMode?: boolean) { + return this.editCipherId(cipher?.id, cloneMode); } - async editCipherId(id: string) { + async editCipherId(id: string, cloneMode?: boolean) { const cipher = await this.cipherService.get(id); - // 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 && @@ -644,6 +743,11 @@ export class VaultComponent implements OnInit, OnDestroy { return; } + if (this.extensionRefreshEnabled) { + await this.editCipherIdV2(cipher, cloneMode); + return; + } + const [modal, childComponent] = await this.modalService.openViewRef( AddEditComponent, this.cipherAddEditModalRef, @@ -673,6 +777,46 @@ export class VaultComponent implements OnInit, OnDestroy { return childComponent; } + /** + * Edit a cipher using the new AddEditCipherDialogV2 component. + * + * @param cipher + * @param cloneMode + */ + private async editCipherIdV2(cipher: Cipher, cloneMode?: boolean) { + const cipherFormConfig = await this.cipherFormConfigService.buildConfig( + cloneMode ? "clone" : "edit", + cipher.id as CipherId, + cipher.type, + ); + + const dialogRef = openAddEditCipherDialog(this.dialogService, { + data: cipherFormConfig, + }); + + const result: AddEditCipherDialogCloseResult = await firstValueFrom(dialogRef.closed); + + /** + * Refresh the vault if the dialog was closed by adding, editing, or deleting a cipher. + */ + if (result?.action === AddEditCipherDialogResult.Edited) { + this.refresh(); + } + + /** + * View the cipher if the dialog was closed by editing the cipher. + */ + if (result?.action === AddEditCipherDialogResult.Edited) { + this.go({ itemId: cipher.id, action: "view" }); + return; + } + + /** + * Navigate to the vault if the dialog was closed by any other action. + */ + this.go({ cipherId: null, itemId: null, action: null }); + } + /** * Takes a CipherView and opens a dialog where it can be viewed (wraps viewCipherById). * @param cipher - CipherView @@ -718,8 +862,9 @@ export class VaultComponent implements OnInit, OnDestroy { const result: ViewCipherDialogCloseResult = await lastValueFrom(dialogRef.closed); // If the dialog was closed by deleting the cipher, refresh the vault. - if (result?.action === ViewCipherDialogResult.deleted) { + if (result?.action === ViewCipherDialogResult.Deleted) { this.refresh(); + this.go({ cipherId: null, itemId: null, action: null }); } // If the dialog was closed by any other action (close button, escape key, etc), navigate back to the vault. @@ -873,7 +1018,7 @@ export class VaultComponent implements OnInit, OnDestroy { } } - const component = await this.editCipher(cipher); + const component = await this.editCipher(cipher, true); component.cloneMode = true; } diff --git a/apps/web/src/app/vault/individual-vault/view.component.spec.ts b/apps/web/src/app/vault/individual-vault/view.component.spec.ts index fec97e202ef..dfa2d50489b 100644 --- a/apps/web/src/app/vault/individual-vault/view.component.spec.ts +++ b/apps/web/src/app/vault/individual-vault/view.component.spec.ts @@ -98,7 +98,7 @@ describe("ViewComponent", () => { organizationId: mockCipher.organizationId, }, }); - expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: ViewCipherDialogResult.edited }); + expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: ViewCipherDialogResult.Edited }); }); }); @@ -111,7 +111,7 @@ describe("ViewComponent", () => { await component.delete(); expect(deleteSpy).toHaveBeenCalled(); - expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: ViewCipherDialogResult.deleted }); + expect(dialogRefCloseSpy).toHaveBeenCalledWith({ action: ViewCipherDialogResult.Deleted }); }); }); }); diff --git a/apps/web/src/app/vault/individual-vault/view.component.ts b/apps/web/src/app/vault/individual-vault/view.component.ts index fe317490c1f..964be0e8ab8 100644 --- a/apps/web/src/app/vault/individual-vault/view.component.ts +++ b/apps/web/src/app/vault/individual-vault/view.component.ts @@ -27,8 +27,8 @@ export interface ViewCipherDialogParams { } export enum ViewCipherDialogResult { - edited = "edited", - deleted = "deleted", + Edited = "edited", + Deleted = "deleted", } export interface ViewCipherDialogCloseResult { @@ -117,7 +117,7 @@ export class ViewComponent implements OnInit, OnDestroy { this.logService.error(e); } - this.dialogRef.close({ action: ViewCipherDialogResult.deleted }); + this.dialogRef.close({ action: ViewCipherDialogResult.Deleted }); await this.router.navigate(["/vault"]); }; @@ -137,7 +137,7 @@ export class ViewComponent implements OnInit, OnDestroy { * Method to handle cipher editing. Called when a user clicks the edit button. */ async edit(): Promise { - this.dialogRef.close({ action: ViewCipherDialogResult.edited }); + this.dialogRef.close({ action: ViewCipherDialogResult.Edited }); await this.router.navigate([], { queryParams: { itemId: this.cipher.id, 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 add1ecbe3e5..32f7f0eba5b 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -886,8 +886,9 @@ export class VaultComponent implements OnInit, OnDestroy { const result: ViewCipherDialogCloseResult = await lastValueFrom(dialogRef.closed); // If the dialog was closed by deleting the cipher, refresh the vault. - if (result.action === ViewCipherDialogResult.deleted) { + if (result.action === ViewCipherDialogResult.Deleted) { this.refresh(); + this.go({ cipherId: null, itemId: null, action: null }); } // If the dialog was closed by any other action (close button, escape key, etc), navigate back to the vault. diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 1ca7d040821..87c0ad654fd 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -511,6 +511,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -7399,6 +7417,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, diff --git a/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts b/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts index a6febe48978..93cca2e5dbb 100644 --- a/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts +++ b/libs/vault/src/cipher-form/components/attachments/cipher-attachments.component.ts @@ -85,6 +85,9 @@ export class CipherAttachmentsComponent implements OnInit, AfterViewInit { /** Emits after a file has been successfully uploaded */ @Output() onUploadSuccess = new EventEmitter(); + /** Emits after a file has been successfully removed */ + @Output() onRemoveSuccess = new EventEmitter(); + cipher: CipherView; attachmentForm: CipherAttachmentForm = this.formBuilder.group({ @@ -216,5 +219,7 @@ export class CipherAttachmentsComponent implements OnInit, AfterViewInit { if (index > -1) { this.cipher.attachments.splice(index, 1); } + + this.onRemoveSuccess.emit(); } } diff --git a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.spec.ts b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.spec.ts index 569a6666999..232a4b2d27b 100644 --- a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.spec.ts +++ b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.spec.ts @@ -7,6 +7,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { EventType } from "@bitwarden/common/enums"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -39,6 +40,8 @@ describe("LoginDetailsSectionComponent", () => { let toastService: MockProxy; let totpCaptureService: MockProxy; let i18nService: MockProxy; + let configService: MockProxy; + const collect = jest.fn().mockResolvedValue(null); beforeEach(async () => { @@ -49,6 +52,7 @@ describe("LoginDetailsSectionComponent", () => { toastService = mock(); totpCaptureService = mock(); i18nService = mock(); + configService = mock(); collect.mockClear(); await TestBed.configureTestingModule({ @@ -60,6 +64,7 @@ describe("LoginDetailsSectionComponent", () => { { provide: ToastService, useValue: toastService }, { provide: TotpCaptureService, useValue: totpCaptureService }, { provide: I18nService, useValue: i18nService }, + { provide: ConfigService, useValue: configService }, { provide: EventCollectionService, useValue: { collect } }, ], }) diff --git a/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.html b/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.html new file mode 100644 index 00000000000..30259cd640c --- /dev/null +++ b/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.html @@ -0,0 +1,22 @@ + + + {{ title }} + + + + + + + + diff --git a/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.spec.ts b/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.spec.ts new file mode 100644 index 00000000000..844f15a47af --- /dev/null +++ b/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.spec.ts @@ -0,0 +1,125 @@ +import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; + +import { UsernameGenerationServiceAbstraction } from "../../../../../../libs/tools/generator/extensions/legacy/src/username-generation.service.abstraction"; +import { CipherFormGeneratorComponent } from "../cipher-generator/cipher-form-generator.component"; + +import { + WebVaultGeneratorDialogComponent, + WebVaultGeneratorDialogParams, + WebVaultGeneratorDialogAction, +} from "./web-generator-dialog.component"; + +describe("WebVaultGeneratorDialogComponent", () => { + let component: WebVaultGeneratorDialogComponent; + let fixture: ComponentFixture; + + let dialogRef: MockProxy>; + let mockI18nService: MockProxy; + let passwordOptionsSubject: BehaviorSubject; + let usernameOptionsSubject: BehaviorSubject; + let mockPasswordGenerationService: MockProxy; + let mockUsernameGenerationService: MockProxy; + + beforeEach(async () => { + dialogRef = mock>(); + mockI18nService = mock(); + passwordOptionsSubject = new BehaviorSubject([{ type: "password" }]); + usernameOptionsSubject = new BehaviorSubject([{ type: "username" }]); + + mockPasswordGenerationService = mock(); + mockPasswordGenerationService.getOptions$.mockReturnValue( + passwordOptionsSubject.asObservable(), + ); + + mockUsernameGenerationService = mock(); + mockUsernameGenerationService.getOptions$.mockReturnValue( + usernameOptionsSubject.asObservable(), + ); + + const mockDialogData: WebVaultGeneratorDialogParams = { type: "password" }; + + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, WebVaultGeneratorDialogComponent], + providers: [ + { + provide: DialogRef, + useValue: dialogRef, + }, + { + provide: DIALOG_DATA, + useValue: mockDialogData, + }, + { + provide: I18nService, + useValue: mockI18nService, + }, + { + provide: PlatformUtilsService, + useValue: mock(), + }, + { + provide: PasswordGenerationServiceAbstraction, + useValue: mockPasswordGenerationService, + }, + { + provide: UsernameGenerationServiceAbstraction, + useValue: mockUsernameGenerationService, + }, + { + provide: CipherFormGeneratorComponent, + useValue: { + passwordOptions$: passwordOptionsSubject.asObservable(), + usernameOptions$: usernameOptionsSubject.asObservable(), + }, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(WebVaultGeneratorDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("initializes without errors", () => { + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); + + it("closes the dialog with 'canceled' result when close is called", () => { + const closeSpy = jest.spyOn(dialogRef, "close"); + + (component as any).close(); + + expect(closeSpy).toHaveBeenCalledWith({ + action: WebVaultGeneratorDialogAction.Canceled, + }); + }); + + it("closes the dialog with 'selected' result when selectValue is called", () => { + const closeSpy = jest.spyOn(dialogRef, "close"); + const generatedValue = "generated-value"; + component.onValueGenerated(generatedValue); + + (component as any).selectValue(); + + expect(closeSpy).toHaveBeenCalledWith({ + action: WebVaultGeneratorDialogAction.Selected, + generatedValue: generatedValue, + }); + }); + + it("updates generatedValue when onValueGenerated is called", () => { + const generatedValue = "new-generated-value"; + component.onValueGenerated(generatedValue); + + expect((component as any).generatedValue).toBe(generatedValue); + }); +}); diff --git a/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.ts b/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.ts new file mode 100644 index 00000000000..03a41990c86 --- /dev/null +++ b/libs/vault/src/cipher-form/components/web-generator-dialog/web-generator-dialog.component.ts @@ -0,0 +1,89 @@ +import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; +import { Component, Inject } from "@angular/core"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ButtonModule, DialogService } from "@bitwarden/components"; +import { CipherFormGeneratorComponent } from "@bitwarden/vault"; + +import { DialogModule } from "../../../../../../libs/components/src/dialog"; + +export interface WebVaultGeneratorDialogParams { + type: "password" | "username"; +} + +export interface WebVaultGeneratorDialogResult { + action: WebVaultGeneratorDialogAction; + generatedValue?: string; +} + +export enum WebVaultGeneratorDialogAction { + Selected = "selected", + Canceled = "canceled", +} + +@Component({ + selector: "web-vault-generator-dialog", + templateUrl: "./web-generator-dialog.component.html", + standalone: true, + imports: [CommonModule, CipherFormGeneratorComponent, ButtonModule, DialogModule], +}) +export class WebVaultGeneratorDialogComponent { + protected title = this.i18nService.t(this.isPassword ? "passwordGenerator" : "usernameGenerator"); + protected selectButtonText = this.i18nService.t( + this.isPassword ? "useThisPassword" : "useThisUsername", + ); + + /** + * Whether the dialog is generating a password/passphrase. If false, it is generating a username. + * @protected + */ + protected get isPassword() { + return this.params.type === "password"; + } + + /** + * The currently generated value. + * @protected + */ + protected generatedValue: string = ""; + + constructor( + @Inject(DIALOG_DATA) protected params: WebVaultGeneratorDialogParams, + private dialogRef: DialogRef, + private i18nService: I18nService, + ) {} + + /** + * Close the dialog without selecting a value. + */ + protected close = () => { + this.dialogRef.close({ action: WebVaultGeneratorDialogAction.Canceled }); + }; + + /** + * Close the dialog and select the currently generated value. + */ + protected selectValue = () => { + this.dialogRef.close({ + action: WebVaultGeneratorDialogAction.Selected, + generatedValue: this.generatedValue, + }); + }; + + onValueGenerated(value: string) { + this.generatedValue = value; + } + + /** + * Opens the vault generator dialog. + */ + static open(dialogService: DialogService, config: DialogConfig) { + return dialogService.open( + WebVaultGeneratorDialogComponent, + { + ...config, + }, + ); + } +} diff --git a/libs/vault/src/cipher-form/services/web-cipher-form-generation.service.spec.ts b/libs/vault/src/cipher-form/services/web-cipher-form-generation.service.spec.ts new file mode 100644 index 00000000000..898ac8dcb7b --- /dev/null +++ b/libs/vault/src/cipher-form/services/web-cipher-form-generation.service.spec.ts @@ -0,0 +1,88 @@ +import { DialogRef } from "@angular/cdk/dialog"; +import { TestBed } from "@angular/core/testing"; +import { mock } from "jest-mock-extended"; +import { of } from "rxjs"; + +import { DialogService } from "@bitwarden/components"; + +import { WebVaultGeneratorDialogComponent } from "../components/web-generator-dialog/web-generator-dialog.component"; + +import { WebCipherFormGenerationService } from "./web-cipher-form-generation.service"; + +describe("WebCipherFormGenerationService", () => { + let service: WebCipherFormGenerationService; + let dialogService: jest.Mocked; + let closed = of({}); + const close = jest.fn(); + const dialogRef = { + close, + get closed() { + return closed; + }, + } as unknown as DialogRef; + + beforeEach(() => { + dialogService = mock(); + + TestBed.configureTestingModule({ + providers: [ + WebCipherFormGenerationService, + { provide: DialogService, useValue: dialogService }, + ], + }); + + service = TestBed.inject(WebCipherFormGenerationService); + }); + + it("creates without error", () => { + expect(service).toBeTruthy(); + }); + + describe("generatePassword", () => { + it("opens the password generator dialog and returns the generated value", async () => { + const generatedValue = "generated-password"; + closed = of({ action: "generated", generatedValue }); + dialogService.open.mockReturnValue(dialogRef); + + const result = await service.generatePassword(); + + expect(dialogService.open).toHaveBeenCalledWith(WebVaultGeneratorDialogComponent, { + data: { type: "password" }, + }); + expect(result).toBe(generatedValue); + }); + + it("returns null if the dialog is canceled", async () => { + closed = of({ action: "canceled" }); + dialogService.open.mockReturnValue(dialogRef); + + const result = await service.generatePassword(); + + expect(result).toBeNull(); + }); + }); + + describe("generateUsername", () => { + it("opens the username generator dialog and returns the generated value", async () => { + const generatedValue = "generated-username"; + closed = of({ action: "generated", generatedValue }); + dialogService.open.mockReturnValue(dialogRef); + + const result = await service.generateUsername(); + + expect(dialogService.open).toHaveBeenCalledWith(WebVaultGeneratorDialogComponent, { + data: { type: "username" }, + }); + expect(result).toBe(generatedValue); + }); + + it("returns null if the dialog is canceled", async () => { + closed = of({ action: "canceled" }); + dialogService.open.mockReturnValue(dialogRef); + + const result = await service.generateUsername(); + + expect(result).toBeNull(); + }); + }); +}); diff --git a/libs/vault/src/cipher-form/services/web-cipher-form-generation.service.ts b/libs/vault/src/cipher-form/services/web-cipher-form-generation.service.ts new file mode 100644 index 00000000000..cfa0b28dbf0 --- /dev/null +++ b/libs/vault/src/cipher-form/services/web-cipher-form-generation.service.ts @@ -0,0 +1,40 @@ +import { inject, Injectable } from "@angular/core"; +import { firstValueFrom } from "rxjs"; + +import { DialogService } from "@bitwarden/components"; +import { CipherFormGenerationService } from "@bitwarden/vault"; + +import { WebVaultGeneratorDialogComponent } from "../components/web-generator-dialog/web-generator-dialog.component"; + +@Injectable() +export class WebCipherFormGenerationService implements CipherFormGenerationService { + private dialogService = inject(DialogService); + + async generatePassword(): Promise { + const dialogRef = WebVaultGeneratorDialogComponent.open(this.dialogService, { + data: { type: "password" }, + }); + + const result = await firstValueFrom(dialogRef.closed); + + if (result == null || result.action === "canceled") { + return null; + } + + return result.generatedValue; + } + + async generateUsername(): Promise { + const dialogRef = WebVaultGeneratorDialogComponent.open(this.dialogService, { + data: { type: "username" }, + }); + + const result = await firstValueFrom(dialogRef.closed); + + if (result == null || result.action === "canceled") { + return null; + } + + return result.generatedValue; + } +} From 1940256fe242da1b0d9edb98849b898169eac2da Mon Sep 17 00:00:00 2001 From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:55:31 +0100 Subject: [PATCH 044/104] Resolve the discount issue (#11128) --- .../billing/organizations/change-plan-dialog.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html index 1a7b390d21b..120b570cb1e 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html @@ -21,8 +21,8 @@ >{{ "upgradeDiscount" | i18n - : (selectedInterval === planIntervals.Annually - ? discountPercentageFromSub + this.discountPercentage + : (selectedInterval === planIntervals.Annually && discountPercentageFromSub == 0 + ? this.discountPercentage : this.discountPercentageFromSub) }} From 6c1d74a4cec9714ea0d3ad45697ec8422826dfd5 Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:00:54 -0500 Subject: [PATCH 045/104] [PM-11395] [Defect] View Login - TOTP premium badge does nothing when clicked (#10857) * Add MessagingService to LoginCredentialView component. * Add comments. * Add WIP PremiumUpgradeService * Simplify web PremiumUpgradeServices into one service. * Relocate service files. * Add browser version of PremiumUpgradePromptService. * Cleanup debug comments. * Run prettier. * rework promptForPremium to take organization id and add test. * Add test for browser * Rework imports to fix linter errors. * Add Shane's reworked WebVaultPremiumUpgradePromptService. --- .../vault-v2/view-v2/view-v2.component.ts | 14 ++- ...ser-premium-upgrade-prompt.service.spec.ts | 26 +++++ .../browser-premium-upgrade-prompt.service.ts | 18 ++++ apps/web/src/app/app.component.ts | 2 +- .../vault/individual-vault/view.component.ts | 8 +- ...web-premium-upgrade-prompt.service.spec.ts | 95 +++++++++++++++++++ .../web-premium-upgrade-prompt.service.ts | 57 +++++++++++ .../premium-upgrade-prompt.service.ts | 7 ++ .../login-credentials-view.component.html | 2 +- .../login-credentials-view.component.ts | 8 +- 10 files changed, 225 insertions(+), 12 deletions(-) create mode 100644 apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.spec.ts create mode 100644 apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.ts create mode 100644 apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.spec.ts create mode 100644 apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.ts create mode 100644 libs/common/src/vault/abstractions/premium-upgrade-prompt.service.ts diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index b2ef6701b42..a640abe69f6 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -27,18 +27,22 @@ import { ToastService, } from "@bitwarden/components"; +import { PremiumUpgradePromptService } from "../../../../../../../../libs/common/src/vault/abstractions/premium-upgrade-prompt.service"; import { CipherViewComponent } from "../../../../../../../../libs/vault/src/cipher-view"; import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; - -import { PopupFooterComponent } from "./../../../../../platform/popup/layout/popup-footer.component"; -import { PopupHeaderComponent } from "./../../../../../platform/popup/layout/popup-header.component"; -import { PopupPageComponent } from "./../../../../../platform/popup/layout/popup-page.component"; -import { VaultPopupAutofillService } from "./../../../services/vault-popup-autofill.service"; +import { PopupFooterComponent } from "../../../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component"; +import { BrowserPremiumUpgradePromptService } from "../../../services/browser-premium-upgrade-prompt.service"; +import { VaultPopupAutofillService } from "../../../services/vault-popup-autofill.service"; @Component({ selector: "app-view-v2", templateUrl: "view-v2.component.html", standalone: true, + providers: [ + { provide: PremiumUpgradePromptService, useClass: BrowserPremiumUpgradePromptService }, + ], imports: [ CommonModule, SearchModule, diff --git a/apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.spec.ts b/apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.spec.ts new file mode 100644 index 00000000000..9a00bacd6b0 --- /dev/null +++ b/apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.spec.ts @@ -0,0 +1,26 @@ +import { TestBed } from "@angular/core/testing"; +import { Router } from "@angular/router"; +import { mock, MockProxy } from "jest-mock-extended"; + +import { BrowserPremiumUpgradePromptService } from "./browser-premium-upgrade-prompt.service"; + +describe("BrowserPremiumUpgradePromptService", () => { + let service: BrowserPremiumUpgradePromptService; + let router: MockProxy; + + beforeEach(async () => { + router = mock(); + await TestBed.configureTestingModule({ + providers: [BrowserPremiumUpgradePromptService, { provide: Router, useValue: router }], + }).compileComponents(); + + service = TestBed.inject(BrowserPremiumUpgradePromptService); + }); + + describe("promptForPremium", () => { + it("navigates to the premium update screen", async () => { + await service.promptForPremium(); + expect(router.navigate).toHaveBeenCalledWith(["/premium"]); + }); + }); +}); diff --git a/apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.ts b/apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.ts new file mode 100644 index 00000000000..2909e3b3bd6 --- /dev/null +++ b/apps/browser/src/vault/popup/services/browser-premium-upgrade-prompt.service.ts @@ -0,0 +1,18 @@ +import { inject } from "@angular/core"; +import { Router } from "@angular/router"; + +import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; + +/** + * This class handles the premium upgrade process for the browser extension. + */ +export class BrowserPremiumUpgradePromptService implements PremiumUpgradePromptService { + private router = inject(Router); + + async promptForPremium() { + /** + * Navigate to the premium update screen. + */ + await this.router.navigate(["/premium"]); + } +} diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index ef6cbd2804a..1314670c44c 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -188,7 +188,7 @@ export class AppComponent implements OnDestroy, OnInit { if (premiumConfirmed) { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["settings/subscription/premium"]); + await this.router.navigate(["settings/subscription/premium"]); } break; } diff --git a/apps/web/src/app/vault/individual-vault/view.component.ts b/apps/web/src/app/vault/individual-vault/view.component.ts index 964be0e8ab8..fe846c9f64c 100644 --- a/apps/web/src/app/vault/individual-vault/view.component.ts +++ b/apps/web/src/app/vault/individual-vault/view.component.ts @@ -1,6 +1,6 @@ import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; import { CommonModule } from "@angular/common"; -import { Component, EventEmitter, Inject, OnDestroy, OnInit } from "@angular/core"; +import { Component, Inject, OnInit, EventEmitter, OnDestroy } from "@angular/core"; import { Router } from "@angular/router"; import { Subject } from "rxjs"; @@ -19,8 +19,10 @@ import { ToastService, } from "@bitwarden/components"; +import { PremiumUpgradePromptService } from "../../../../../../libs/common/src/vault/abstractions/premium-upgrade-prompt.service"; import { CipherViewComponent } from "../../../../../../libs/vault/src/cipher-view/cipher-view.component"; import { SharedModule } from "../../shared/shared.module"; +import { WebVaultPremiumUpgradePromptService } from "../services/web-premium-upgrade-prompt.service"; export interface ViewCipherDialogParams { cipher: CipherView; @@ -29,6 +31,7 @@ export interface ViewCipherDialogParams { export enum ViewCipherDialogResult { Edited = "edited", Deleted = "deleted", + PremiumUpgrade = "premiumUpgrade", } export interface ViewCipherDialogCloseResult { @@ -43,6 +46,9 @@ export interface ViewCipherDialogCloseResult { templateUrl: "view.component.html", standalone: true, imports: [CipherViewComponent, CommonModule, AsyncActionsModule, DialogModule, SharedModule], + providers: [ + { provide: PremiumUpgradePromptService, useClass: WebVaultPremiumUpgradePromptService }, + ], }) export class ViewComponent implements OnInit, OnDestroy { cipher: CipherView; diff --git a/apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.spec.ts b/apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.spec.ts new file mode 100644 index 00000000000..6c68dae7077 --- /dev/null +++ b/apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.spec.ts @@ -0,0 +1,95 @@ +import { DialogRef } from "@angular/cdk/dialog"; +import { TestBed } from "@angular/core/testing"; +import { Router } from "@angular/router"; +import { of, lastValueFrom } from "rxjs"; + +import { OrganizationId } from "@bitwarden/common/types/guid"; +import { DialogService } from "@bitwarden/components"; + +import { + ViewCipherDialogCloseResult, + ViewCipherDialogResult, +} from "../individual-vault/view.component"; + +import { WebVaultPremiumUpgradePromptService } from "./web-premium-upgrade-prompt.service"; + +describe("WebVaultPremiumUpgradePromptService", () => { + let service: WebVaultPremiumUpgradePromptService; + let dialogServiceMock: jest.Mocked; + let routerMock: jest.Mocked; + let dialogRefMock: jest.Mocked>; + + beforeEach(() => { + dialogServiceMock = { + openSimpleDialog: jest.fn(), + } as unknown as jest.Mocked; + + routerMock = { + navigate: jest.fn(), + } as unknown as jest.Mocked; + + dialogRefMock = { + close: jest.fn(), + } as unknown as jest.Mocked>; + + TestBed.configureTestingModule({ + providers: [ + WebVaultPremiumUpgradePromptService, + { provide: DialogService, useValue: dialogServiceMock }, + { provide: Router, useValue: routerMock }, + { provide: DialogRef, useValue: dialogRefMock }, + ], + }); + + service = TestBed.inject(WebVaultPremiumUpgradePromptService); + }); + + it("prompts for premium upgrade and navigates to organization billing if organizationId is provided", async () => { + dialogServiceMock.openSimpleDialog.mockReturnValue(lastValueFrom(of(true))); + const organizationId = "test-org-id" as OrganizationId; + + await service.promptForPremium(organizationId); + + expect(dialogServiceMock.openSimpleDialog).toHaveBeenCalledWith({ + title: { key: "upgradeOrganization" }, + content: { key: "upgradeOrganizationDesc" }, + acceptButtonText: { key: "upgradeOrganization" }, + type: "info", + }); + expect(routerMock.navigate).toHaveBeenCalledWith([ + "organizations", + organizationId, + "billing", + "subscription", + ]); + expect(dialogRefMock.close).toHaveBeenCalledWith({ + action: ViewCipherDialogResult.PremiumUpgrade, + }); + }); + + it("prompts for premium upgrade and navigates to premium subscription if organizationId is not provided", async () => { + dialogServiceMock.openSimpleDialog.mockReturnValue(lastValueFrom(of(true))); + + await service.promptForPremium(); + + expect(dialogServiceMock.openSimpleDialog).toHaveBeenCalledWith({ + title: { key: "premiumRequired" }, + content: { key: "premiumRequiredDesc" }, + acceptButtonText: { key: "upgrade" }, + type: "success", + }); + expect(routerMock.navigate).toHaveBeenCalledWith(["settings/subscription/premium"]); + expect(dialogRefMock.close).toHaveBeenCalledWith({ + action: ViewCipherDialogResult.PremiumUpgrade, + }); + }); + + it("does not navigate or close dialog if upgrade is no action is taken", async () => { + dialogServiceMock.openSimpleDialog.mockReturnValue(lastValueFrom(of(false))); + + await service.promptForPremium("test-org-id" as OrganizationId); + + expect(routerMock.navigate).not.toHaveBeenCalled(); + expect(dialogRefMock.close).not.toHaveBeenCalled(); + }); +}); diff --git a/apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.ts b/apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.ts new file mode 100644 index 00000000000..8f9c8c0bd72 --- /dev/null +++ b/apps/web/src/app/vault/services/web-premium-upgrade-prompt.service.ts @@ -0,0 +1,57 @@ +import { DialogRef } from "@angular/cdk/dialog"; +import { Injectable } from "@angular/core"; +import { Router } from "@angular/router"; + +import { OrganizationId } from "@bitwarden/common/types/guid"; +import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; +import { DialogService } from "@bitwarden/components"; + +import { + ViewCipherDialogCloseResult, + ViewCipherDialogResult, +} from "../individual-vault/view.component"; + +/** + * This service is used to prompt the user to upgrade to premium. + */ +@Injectable() +export class WebVaultPremiumUpgradePromptService implements PremiumUpgradePromptService { + constructor( + private dialogService: DialogService, + private router: Router, + private dialog: DialogRef, + ) {} + + /** + * Prompts the user to upgrade to premium. + * @param organizationId The ID of the organization to upgrade. + */ + async promptForPremium(organizationId?: OrganizationId) { + let upgradeConfirmed; + if (organizationId) { + upgradeConfirmed = await this.dialogService.openSimpleDialog({ + title: { key: "upgradeOrganization" }, + content: { key: "upgradeOrganizationDesc" }, + acceptButtonText: { key: "upgradeOrganization" }, + type: "info", + }); + if (upgradeConfirmed) { + await this.router.navigate(["organizations", organizationId, "billing", "subscription"]); + } + } else { + upgradeConfirmed = await this.dialogService.openSimpleDialog({ + title: { key: "premiumRequired" }, + content: { key: "premiumRequiredDesc" }, + acceptButtonText: { key: "upgrade" }, + type: "success", + }); + if (upgradeConfirmed) { + await this.router.navigate(["settings/subscription/premium"]); + } + } + + if (upgradeConfirmed) { + this.dialog.close({ action: ViewCipherDialogResult.PremiumUpgrade }); + } + } +} diff --git a/libs/common/src/vault/abstractions/premium-upgrade-prompt.service.ts b/libs/common/src/vault/abstractions/premium-upgrade-prompt.service.ts new file mode 100644 index 00000000000..8733baaa471 --- /dev/null +++ b/libs/common/src/vault/abstractions/premium-upgrade-prompt.service.ts @@ -0,0 +1,7 @@ +/** + * This interface defines the a contract for a service that prompts the user to upgrade to premium. + * It ensures that PremiumUpgradePromptService contains a promptForPremium method. + */ +export abstract class PremiumUpgradePromptService { + abstract promptForPremium(organizationId?: string): Promise; +} diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index 88a59d9cc42..43be62f8c69 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -97,7 +97,7 @@ bitBadge variant="success" class="tw-ml-2 tw-cursor-pointer" - (click)="getPremium()" + (click)="getPremium(cipher.organizationId)" slot="end" > {{ "premium" | i18n }} diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts index c6957b1848e..b05d3318c3c 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts @@ -1,6 +1,5 @@ import { CommonModule, DatePipe } from "@angular/common"; import { Component, inject, Input } from "@angular/core"; -import { Router } from "@angular/router"; import { Observable, shareReplay } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; @@ -20,6 +19,7 @@ import { ColorPasswordModule, } from "@bitwarden/components"; +import { PremiumUpgradePromptService } from "../../../../../libs/common/src/vault/abstractions/premium-upgrade-prompt.service"; import { BitTotpCountdownComponent } from "../../components/totp-countdown/totp-countdown.component"; import { ReadOnlyCipherCardComponent } from "../read-only-cipher-card/read-only-cipher-card.component"; @@ -61,8 +61,8 @@ export class LoginCredentialsViewComponent { constructor( private billingAccountProfileStateService: BillingAccountProfileStateService, - private router: Router, private i18nService: I18nService, + private premiumUpgradeService: PremiumUpgradePromptService, private eventCollectionService: EventCollectionService, ) {} @@ -75,8 +75,8 @@ export class LoginCredentialsViewComponent { return `${dateCreated} ${creationDate}`; } - async getPremium() { - await this.router.navigate(["/premium"]); + async getPremium(organizationId?: string) { + await this.premiumUpgradeService.promptForPremium(organizationId); } async pwToggleValue(passwordVisible: boolean) { From 2b85392b0fee0830d07fe8247972e842444a8458 Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:02:47 -0500 Subject: [PATCH 046/104] PM-11338: [Defect] Clicking outside of View {Item} dialog should close the dialog properly (#11035) * Handle undefined result. * Updated enum values for consistency. --- apps/web/src/app/vault/org-vault/vault.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 32f7f0eba5b..a2d8c29cbac 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -886,13 +886,13 @@ export class VaultComponent implements OnInit, OnDestroy { const result: ViewCipherDialogCloseResult = await lastValueFrom(dialogRef.closed); // If the dialog was closed by deleting the cipher, refresh the vault. - if (result.action === ViewCipherDialogResult.Deleted) { + if (result?.action === ViewCipherDialogResult.Deleted) { this.refresh(); this.go({ cipherId: null, itemId: null, action: null }); } // If the dialog was closed by any other action (close button, escape key, etc), navigate back to the vault. - if (!result.action) { + if (!result?.action) { this.go({ cipherId: null, itemId: null, action: null }); } } From 00f2317a8210f9ac86d7fd0739bd549055265de8 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Wed, 18 Sep 2024 14:36:53 -0700 Subject: [PATCH 047/104] [PM-11903] - add file send component (#11132) * wip - send file details * wip - file send * send file details * fix click on send list container * remove popup code * remove popup code * finalize send file details * address PR feedback. add base form to send form * revert changes to send list items container * revert changes to send list items container --------- Co-authored-by: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> --- apps/browser/src/_locales/en/messages.json | 3 + .../add-edit/send-add-edit.component.ts | 19 ++-- .../base-send-details.component.ts | 2 + .../send-details/send-details.component.html | 7 ++ .../send-details/send-details.component.ts | 2 + .../send-file-details.component.html | 30 ++++++ .../send-file-details.component.ts | 92 +++++++++++++++++++ .../components/send-form.component.ts | 8 +- .../src/send-form/send-form-container.ts | 4 + 9 files changed, 152 insertions(+), 15 deletions(-) create mode 100644 libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.html create mode 100644 libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index a57b65f6982..061929fc49c 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1136,6 +1136,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, diff --git a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts index 48e6cbb8a31..49526bb032b 100644 --- a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts +++ b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts @@ -117,25 +117,18 @@ export class SendAddEditComponent { ) .subscribe((config) => { this.config = config; - this.headerText = this.getHeaderText(config.mode, config.sendType); + this.headerText = this.getHeaderText(config.mode); }); } /** - * Gets the header text based on the mode and type. + * Gets the header text based on the mode. * @param mode The mode of the send form. - * @param type The type of the send form. * @returns The header text. */ - private getHeaderText(mode: SendFormMode, type: SendType) { - const headerKey = - mode === "edit" || mode === "partial-edit" ? "editItemHeader" : "newItemHeader"; - - switch (type) { - case SendType.Text: - return this.i18nService.t(headerKey, this.i18nService.t("sendTypeText")); - case SendType.File: - return this.i18nService.t(headerKey, this.i18nService.t("sendTypeFile")); - } + private getHeaderText(mode: SendFormMode) { + return this.i18nService.t( + mode === "edit" || mode === "partial-edit" ? "editSend" : "createSend", + ); } } diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts index 282f6caffab..f3e2229dd2b 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts @@ -62,6 +62,8 @@ export class BaseSendDetailsComponent implements OnInit { } as SendView); }); }); + + this.sendFormContainer.registerChildForm("sendDetailsForm", this.sendDetailsForm); } async ngOnInit() { diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html index e1f3f4f0d9f..47e1fc6059a 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html @@ -16,6 +16,13 @@ [sendDetailsForm]="sendDetailsForm" > + + {{ "deletionDate" | i18n }} +
+
{{ "file" | i18n }}
+
{{ originalSendView.file.fileName }}
+
{{ originalSendView.file.sizeName }}
+
+ + {{ "fileToShare" | i18n }} + + + {{ fileName || ("noFileChosen" | i18n) }} + + + {{ "maxFileSize" | i18n }} + + + diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts new file mode 100644 index 00000000000..86c9fa96f1a --- /dev/null +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts @@ -0,0 +1,92 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, + ReactiveFormsModule, + FormsModule, +} from "@angular/forms"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { SendFileView } from "@bitwarden/common/tools/send/models/view/send-file.view"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { ButtonModule, FormFieldModule, SectionComponent } from "@bitwarden/components"; + +import { SendFormConfig } from "../../abstractions/send-form-config.service"; +import { SendFormContainer } from "../../send-form-container"; + +import { BaseSendDetailsForm } from "./base-send-details.component"; + +type BaseSendFileDetailsForm = FormGroup<{ + file: FormControl; +}>; + +export type SendFileDetailsForm = BaseSendFileDetailsForm & BaseSendDetailsForm; + +@Component({ + selector: "tools-send-file-details", + templateUrl: "./send-file-details.component.html", + standalone: true, + imports: [ + ButtonModule, + CommonModule, + JslibModule, + ReactiveFormsModule, + FormFieldModule, + SectionComponent, + FormsModule, + ], +}) +export class SendFileDetailsComponent implements OnInit { + @Input() config: SendFormConfig; + @Input() originalSendView?: SendView; + @Input() sendDetailsForm: BaseSendDetailsForm; + + baseSendFileDetailsForm: BaseSendFileDetailsForm; + sendFileDetailsForm: SendFileDetailsForm; + + FileSendType = SendType.File; + fileName = ""; + + constructor( + private formBuilder: FormBuilder, + protected sendFormContainer: SendFormContainer, + ) { + this.baseSendFileDetailsForm = this.formBuilder.group({ + file: this.formBuilder.control(null, Validators.required), + }); + + this.sendFileDetailsForm = Object.assign(this.baseSendFileDetailsForm, this.sendDetailsForm); + + this.sendFormContainer.registerChildForm("sendFileDetailsForm", this.sendFileDetailsForm); + + this.sendFileDetailsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { + this.sendFormContainer.patchSend((send) => { + return Object.assign(send, { + file: value.file, + }); + }); + }); + } + + onFileSelected = (event: Event): void => { + const file = (event.target as HTMLInputElement).files?.[0]; + if (!file) { + return; + } + this.fileName = file.name; + this.sendFormContainer.onFileSelected(file); + }; + + ngOnInit() { + if (this.originalSendView) { + this.sendFileDetailsForm.patchValue({ + file: this.originalSendView.file, + }); + } + } +} diff --git a/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts index 2cb1907d921..b265b644df4 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts @@ -65,6 +65,7 @@ export class SendFormComponent implements AfterViewInit, OnInit, OnChanges, Send private bitSubmit: BitSubmitDirective; private destroyRef = inject(DestroyRef); private _firstInitialized = false; + private file: File | null = null; /** * The form ID to use for the form. Used to connect it to a submit button. @@ -188,14 +189,17 @@ export class SendFormComponent implements AfterViewInit, OnInit, OnChanges, Send private i18nService: I18nService, ) {} + onFileSelected(file: File): void { + this.file = file; + } + submit = async () => { if (this.sendForm.invalid) { this.sendForm.markAllAsTouched(); return; } - // TODO: Add file handling - await this.addEditFormService.saveSend(this.updatedSendView, null, this.config); + await this.addEditFormService.saveSend(this.updatedSendView, this.file, this.config); this.toastService.showToast({ variant: "success", diff --git a/libs/tools/send/send-ui/src/send-form/send-form-container.ts b/libs/tools/send/send-ui/src/send-form/send-form-container.ts index f3af1ecd816..21508d96727 100644 --- a/libs/tools/send/send-ui/src/send-form/send-form-container.ts +++ b/libs/tools/send/send-ui/src/send-form/send-form-container.ts @@ -2,6 +2,7 @@ import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendFormConfig } from "./abstractions/send-form-config.service"; import { SendDetailsComponent } from "./components/send-details/send-details.component"; +import { SendFileDetailsForm } from "./components/send-details/send-file-details.component"; import { SendTextDetailsForm } from "./components/send-details/send-text-details.component"; /** * The complete form for a send. Includes all the sub-forms from their respective section components. @@ -10,6 +11,7 @@ import { SendTextDetailsForm } from "./components/send-details/send-text-details export type SendForm = { sendDetailsForm?: SendDetailsComponent["sendDetailsForm"]; sendTextDetailsForm?: SendTextDetailsForm; + sendFileDetailsForm?: SendFileDetailsForm; }; /** @@ -37,5 +39,7 @@ export abstract class SendFormContainer { group: Exclude, ): void; + abstract onFileSelected(file: File): void; + abstract patchSend(updateFn: (current: SendView) => SendView): void; } From a96e3cb64729bf7e850f80e27aae3ef27ff1e4dc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:41:07 +0200 Subject: [PATCH 048/104] [deps] Tools: Update electron to v32.1.1 (#11067) * [deps] Tools: Update electron to v32.1.1 * Bump version in electron-builder.json --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel James Smith --- apps/desktop/electron-builder.json | 2 +- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 49e414dfe99..09783f26f49 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -25,7 +25,7 @@ "**/node_modules/argon2/package.json", "**/node_modules/argon2/build/Release/argon2.node" ], - "electronVersion": "32.0.2", + "electronVersion": "32.1.1", "generateUpdatesFilesForAllChannels": true, "publish": { "provider": "generic", diff --git a/package-lock.json b/package-lock.json index e71763cde27..95e8fcb50b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -129,7 +129,7 @@ "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", "css-loader": "7.1.2", - "electron": "32.0.2", + "electron": "32.1.1", "electron-builder": "24.13.3", "electron-log": "5.0.1", "electron-reload": "2.0.0-alpha.1", @@ -16414,9 +16414,9 @@ } }, "node_modules/electron": { - "version": "32.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.2.tgz", - "integrity": "sha512-nmZblq8wW3HZ17MAyaUuiMI9Mb0Cgc7UR3To85h/rVopbfyF5s34NxtK4gvyRfYPxpDGP4k+HoQIPniPPrdE3w==", + "version": "32.1.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.1.1.tgz", + "integrity": "sha512-NlWvG6kXOJbZbELmzP3oV7u50I3NHYbCeh+AkUQ9vGyP7b74cFMx9HdTzejODeztW1jhr3SjIBbUZzZ45zflfQ==", "dev": true, "hasInstallScript": true, "license": "MIT", diff --git a/package.json b/package.json index 8e5f38c62ef..aafc92bbd3d 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "copy-webpack-plugin": "12.0.2", "cross-env": "7.0.3", "css-loader": "7.1.2", - "electron": "32.0.2", + "electron": "32.1.1", "electron-builder": "24.13.3", "electron-log": "5.0.1", "electron-reload": "2.0.0-alpha.1", From 64844600dcdafea0b155d3375b3d768aeb467057 Mon Sep 17 00:00:00 2001 From: Vince Grassia <593223+vgrassia@users.noreply.github.com> Date: Thu, 19 Sep 2024 04:40:55 -0400 Subject: [PATCH 049/104] Fix alert message for Desktop builds (#11139) --- .github/workflows/build-desktop.yml | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 8170f1eef00..ddb87320839 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -1037,11 +1037,7 @@ jobs: --type macos \ --file "$(find ./dist/mas-universal/Bitwarden*.pkg)" \ --apiKey $APP_STORE_CONNECT_AUTH_KEY \ - --apiIssuer $APP_STORE_CONNECT_TEAM_ISSUER \ - &> output.txt - - UUID=$(cat output.txt | grep "Delivery UUID" | sed -E 's/Delivery UUID: (.*)/\1/') - echo "uuid=$UUID" >> $GITHUB_OUTPUT + --apiIssuer $APP_STORE_CONNECT_TEAM_ISSUER - name: Post message to a Slack channel id: slack-message @@ -1059,24 +1055,14 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "Desktop client v${{ env._PACKAGE_VERSION }} <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|build> success on *${{ github.ref_name }}*" - }, - "accessory": { - "type": "button", - "text": { - "type": "plain_text", - "text": "TestFlight Build", - "emoji": true - }, - "url": "https://appstoreconnect.apple.com/teams/${{ env.APP_STORE_CONNECT_TEAM_ISSUER }}/apps/1352778147/testflight/macos/${{ env.BUILD_UUID }}" + "text": "Desktop client v${{ env._PACKAGE_VERSION }} <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|build ${{ env.BUILD_NUMBER }}> success on *${{ github.ref_name }}*" } } ] } env: - APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} SLACK_BOT_TOKEN: ${{ steps.retrieve-slack-secret.outputs.slack-bot-token }} - BUILD_UUID: ${{ steps.testflight-deploy.outputs.uuid }} + BUILD_NUMBER: ${{ needs.setup.outputs.build_number }} macos-package-dev: From 7f9c5cedaf344824cfd50291312c90376e83725d Mon Sep 17 00:00:00 2001 From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> Date: Thu, 19 Sep 2024 14:34:53 +0200 Subject: [PATCH 050/104] Delete SendForm storybook stories (#11149) Co-authored-by: Daniel James Smith --- .../send/send-ui/src/send-form/send-form.mdx | 17 --- .../src/send-form/send-form.stories.ts | 134 ------------------ 2 files changed, 151 deletions(-) delete mode 100644 libs/tools/send/send-ui/src/send-form/send-form.mdx delete mode 100644 libs/tools/send/send-ui/src/send-form/send-form.stories.ts diff --git a/libs/tools/send/send-ui/src/send-form/send-form.mdx b/libs/tools/send/send-ui/src/send-form/send-form.mdx deleted file mode 100644 index d1297ee90ca..00000000000 --- a/libs/tools/send/send-ui/src/send-form/send-form.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import { Controls, Meta, Primary } from "@storybook/addon-docs"; - -import * as stories from "./send-form.stories"; - - - -# Send Form - -The send form is a re-usable form component that can be used to create, update, and clone sends. It -is configured via a `SendFormConfig` object that is passed to the component as a prop. The -`SendFormConfig` object can be created manually, or a `SendFormConfigService` can be used to create -it. A default implementation of the `SendFormConfigService` exists in the `@bitwarden/send-ui` -library. - - - - diff --git a/libs/tools/send/send-ui/src/send-form/send-form.stories.ts b/libs/tools/send/send-ui/src/send-form/send-form.stories.ts deleted file mode 100644 index 2c47bd62626..00000000000 --- a/libs/tools/send/send-ui/src/send-form/send-form.stories.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { importProvidersFrom } from "@angular/core"; -import { action } from "@storybook/addon-actions"; -import { - applicationConfig, - componentWrapperDecorator, - Meta, - moduleMetadata, - StoryObj, -} from "@storybook/angular"; - -import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; -import { Send } from "@bitwarden/common/tools/send/models/domain/send"; -import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; -import { AsyncActionsModule, ButtonModule, ToastService } from "@bitwarden/components"; -import { SendFormConfig } from "@bitwarden/send-ui"; -// FIXME: remove `/apps` import from `/libs` -// eslint-disable-next-line import/no-restricted-paths -import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/src/app/core/tests"; - -import { SendFormService } from "./abstractions/send-form.service"; -import { SendFormComponent } from "./components/send-form.component"; -import { SendFormModule } from "./send-form.module"; - -const defaultConfig: SendFormConfig = { - mode: "add", - sendType: SendType.Text, - areSendsAllowed: true, - originalSend: { - id: "123", - name: "Test Send", - notes: "Example notes", - } as unknown as Send, -}; - -class TestAddEditFormService implements SendFormService { - decryptSend(): Promise { - return Promise.resolve(defaultConfig.originalSend as any); - } - async saveSend(send: SendView, file: File | ArrayBuffer): Promise { - await new Promise((resolve) => setTimeout(resolve, 1000)); - return send; - } -} - -const actionsData = { - onSave: action("onSave"), -}; - -export default { - title: "Tools/Send Form", - component: SendFormComponent, - decorators: [ - moduleMetadata({ - imports: [SendFormModule, AsyncActionsModule, ButtonModule], - providers: [ - { - provide: SendFormService, - useClass: TestAddEditFormService, - }, - { - provide: ToastService, - useValue: { - showToast: action("showToast"), - }, - }, - ], - }), - componentWrapperDecorator( - (story) => `
${story}
`, - ), - applicationConfig({ - providers: [importProvidersFrom(PreloadedEnglishI18nModule)], - }), - ], - args: { - config: defaultConfig, - }, - argTypes: { - config: { - description: "The configuration object for the form.", - }, - }, -} as Meta; - -type Story = StoryObj; - -export const Default: Story = { - render: (args) => { - return { - props: { - onSave: actionsData.onSave, - ...args, - }, - template: /*html*/ ` - - - `, - }; - }, -}; - -export const Edit: Story = { - ...Default, - args: { - config: { - ...defaultConfig, - mode: "edit", - originalSend: defaultConfig.originalSend, - }, - }, -}; - -export const PartialEdit: Story = { - ...Default, - args: { - config: { - ...defaultConfig, - mode: "partial-edit", - originalSend: defaultConfig.originalSend, - }, - }, -}; - -export const SendsHaveBeenDisabledByPolicy: Story = { - ...Default, - args: { - config: { - ...defaultConfig, - mode: "add", - areSendsAllowed: false, - originalSend: defaultConfig.originalSend, - }, - }, -}; From 354079725ffdd2c0379b78a26b801ff40c4a0121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85berg?= Date: Thu, 19 Sep 2024 14:45:45 +0200 Subject: [PATCH 051/104] PM-7673: Reduce syncs when signing in with passkeys (#10817) * Reduce syncs when signing in with passkeys * PM-7673: Reduce syncs when creating a passkey (#10824) * Reduce to syncs when creating a passkey * Mocked rxjs stream --- .../fido2/fido2-authenticator.service.spec.ts | 6 ++- .../fido2/fido2-authenticator.service.ts | 42 +++++++++++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts b/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts index 289e94e6eff..bd9bb6e5f6f 100644 --- a/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts +++ b/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts @@ -1,7 +1,7 @@ import { TextEncoder } from "util"; import { mock, MockProxy } from "jest-mock-extended"; -import { BehaviorSubject } from "rxjs"; +import { BehaviorSubject, of } from "rxjs"; import { AccountInfo, AccountService } from "../../../auth/abstractions/account.service"; import { UserId } from "../../../types/guid"; @@ -53,7 +53,9 @@ describe("FidoAuthenticatorService", () => { userInterface = mock(); userInterfaceSession = mock(); userInterface.newSession.mockResolvedValue(userInterfaceSession); - syncService = mock(); + syncService = mock({ + activeUserLastSync$: () => of(new Date()), + }); accountService = mock(); authenticator = new Fido2AuthenticatorService( cipherService, diff --git a/libs/common/src/platform/services/fido2/fido2-authenticator.service.ts b/libs/common/src/platform/services/fido2/fido2-authenticator.service.ts index ddcc079eb95..8f0523769d9 100644 --- a/libs/common/src/platform/services/fido2/fido2-authenticator.service.ts +++ b/libs/common/src/platform/services/fido2/fido2-authenticator.service.ts @@ -94,7 +94,14 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr } await userInterfaceSession.ensureUnlockedVault(); - await this.syncService.fullSync(false); + + // Avoid syncing if we did it reasonably soon as the only reason for syncing is to validate excludeCredentials + const lastSync = await firstValueFrom(this.syncService.activeUserLastSync$()); + const threshold = new Date().getTime() - 1000 * 60 * 30; // 30 minutes ago + + if (!lastSync || lastSync.getTime() < threshold) { + await this.syncService.fullSync(false); + } const existingCipherIds = await this.findExcludedCredentials( params.excludeCredentialDescriptorList, @@ -223,15 +230,17 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr let cipherOptions: CipherView[]; await userInterfaceSession.ensureUnlockedVault(); - await this.syncService.fullSync(false); - if (params.allowCredentialDescriptorList?.length > 0) { - cipherOptions = await this.findCredentialsById( - params.allowCredentialDescriptorList, - params.rpId, - ); - } else { - cipherOptions = await this.findCredentialsByRp(params.rpId); + // Try to find the passkey locally before causing a sync to speed things up + // only skip syncing if we found credentials AND all of them have a counter = 0 + cipherOptions = await this.findCredential(params, cipherOptions); + if ( + cipherOptions.length === 0 || + cipherOptions.some((c) => c.login.fido2Credentials.some((p) => p.counter > 0)) + ) { + // If no passkey is found, or any had a non-zero counter, sync to get the latest data + await this.syncService.fullSync(false); + cipherOptions = await this.findCredential(params, cipherOptions); } if (cipherOptions.length === 0) { @@ -335,6 +344,21 @@ export class Fido2AuthenticatorService implements Fido2AuthenticatorServiceAbstr } } + private async findCredential( + params: Fido2AuthenticatorGetAssertionParams, + cipherOptions: CipherView[], + ) { + if (params.allowCredentialDescriptorList?.length > 0) { + cipherOptions = await this.findCredentialsById( + params.allowCredentialDescriptorList, + params.rpId, + ); + } else { + cipherOptions = await this.findCredentialsByRp(params.rpId); + } + return cipherOptions; + } + private requiresUserVerificationPrompt( params: Fido2AuthenticatorGetAssertionParams, cipherOptions: CipherView[], From 6ffd85c42cf0df1784e1cc80181260fedc1ecf49 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Thu, 19 Sep 2024 14:56:47 +0200 Subject: [PATCH 052/104] [PM-11342] Fix 404 missing styles (#11147) Fix 404 page lacking styles on nested pages. --- apps/web/webpack.config.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js index cec4bf044be..99dc7479257 100644 --- a/apps/web/webpack.config.js +++ b/apps/web/webpack.config.js @@ -135,6 +135,8 @@ const plugins = [ template: "./src/404.html", filename: "404.html", chunks: ["styles"], + // 404 page is a wildcard, this ensures it uses absolute paths. + publicPath: "/", }), new CopyWebpackPlugin({ patterns: [ From e5bb2e58a63f722dfb9dc3087c6d5548883e05f8 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Thu, 19 Sep 2024 15:00:07 +0200 Subject: [PATCH 053/104] [PM-12004] Fix ~60 compile warnings in webpack for web (#11004) --- apps/web/tsconfig.build.json | 5 +++++ apps/web/webpack.config.js | 2 +- bitwarden_license/bit-web/tsconfig.build.json | 14 ++++++++++++++ bitwarden_license/bit-web/webpack.config.js | 2 +- 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 apps/web/tsconfig.build.json create mode 100644 bitwarden_license/bit-web/tsconfig.build.json diff --git a/apps/web/tsconfig.build.json b/apps/web/tsconfig.build.json new file mode 100644 index 00000000000..b10c4f9d899 --- /dev/null +++ b/apps/web/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "files": ["src/polyfills.ts", "src/main.ts", "src/theme.ts"], + "include": ["src/connectors/*.ts", "../../libs/common/src/platform/services/**/*.worker.ts"] +} diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js index 99dc7479257..fee60264ea4 100644 --- a/apps/web/webpack.config.js +++ b/apps/web/webpack.config.js @@ -178,7 +178,7 @@ const plugins = [ ADDITIONAL_REGIONS: envConfig["additionalRegions"] ?? [], }), new AngularWebpackPlugin({ - tsConfigPath: "tsconfig.json", + tsconfig: "tsconfig.build.json", entryModule: "src/app/app.module#AppModule", sourceMap: true, }), diff --git a/bitwarden_license/bit-web/tsconfig.build.json b/bitwarden_license/bit-web/tsconfig.build.json new file mode 100644 index 00000000000..9bebbeb5061 --- /dev/null +++ b/bitwarden_license/bit-web/tsconfig.build.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig", + "files": [ + "../../apps/web/src/polyfills.ts", + "../../apps/web/src/main.ts", + "../../apps/web/src/theme.ts", + + "../../bitwarden_license/bit-web/src/main.ts" + ], + "include": [ + "../../apps/web/src/connectors/*.ts", + "../../libs/common/src/platform/services/**/*.worker.ts" + ] +} diff --git a/bitwarden_license/bit-web/webpack.config.js b/bitwarden_license/bit-web/webpack.config.js index bf192b5411a..ce5f0075afc 100644 --- a/bitwarden_license/bit-web/webpack.config.js +++ b/bitwarden_license/bit-web/webpack.config.js @@ -4,7 +4,7 @@ const webpackConfig = require("../../apps/web/webpack.config"); webpackConfig.entry["app/main"] = "../../bitwarden_license/bit-web/src/main.ts"; webpackConfig.plugins[webpackConfig.plugins.length - 1] = new AngularWebpackPlugin({ - tsconfig: "../../bitwarden_license/bit-web/tsconfig.json", + tsconfig: "../../bitwarden_license/bit-web/tsconfig.build.json", entryModule: "bitwarden_license/src/app/app.module#AppModule", sourceMap: true, }); From 19f4afcd2bc9419e053ee4cc85c52771485bf730 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 14:27:51 +0000 Subject: [PATCH 054/104] Bumped client version(s) (#11152) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/package.json | 2 +- apps/desktop/src/package-lock.json | 4 ++-- apps/desktop/src/package.json | 2 +- package-lock.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4562653978b..40ce2fec5d9 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2024.9.0", + "version": "2024.9.1", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index 6823bddceb8..ce08dfde2cd 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2024.9.0", + "version": "2024.9.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2024.9.0", + "version": "2024.9.1", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native/napi", diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 18a046d5bce..e34641f1e09 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2024.9.0", + "version": "2024.9.1", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/package-lock.json b/package-lock.json index 95e8fcb50b4..bfc943b55b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -232,7 +232,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2024.9.0", + "version": "2024.9.1", "hasInstallScript": true, "license": "GPL-3.0" }, From afff91e0f378e27df417c3b5a3b9e9da5254c0e7 Mon Sep 17 00:00:00 2001 From: Ike <137194738+ike-kottlowski@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:32:42 -0400 Subject: [PATCH 055/104] added duofederal.com to valid urls (#11137) --- apps/web/src/connectors/duo-redirect.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/web/src/connectors/duo-redirect.ts b/apps/web/src/connectors/duo-redirect.ts index 84551258610..ddbf75e53ca 100644 --- a/apps/web/src/connectors/duo-redirect.ts +++ b/apps/web/src/connectors/duo-redirect.ts @@ -52,7 +52,11 @@ window.addEventListener("load", async () => { function redirectToDuoFrameless(redirectUrl: string) { const validateUrl = new URL(redirectUrl); - if (validateUrl.protocol !== "https:" || !validateUrl.hostname.endsWith("duosecurity.com")) { + if ( + validateUrl.protocol !== "https:" || + !validateUrl.hostname.endsWith("duosecurity.com") || + !validateUrl.hostname.endsWith("duofederal.com") + ) { throw new Error("Invalid redirect URL"); } From 01e530d02bfd253afacc01e9c5622e0e052e4e0f Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Thu, 19 Sep 2024 10:55:40 -0500 Subject: [PATCH 056/104] [PM-11691] Remove Nord and Solarized Dark from extension (#11013) * remove nord and solarized dark from AppearanceV2 component - This component already behind the extension refresh feature flag * update the users theme to system when nord or solarized dark is selected * For desktop, still allow all theme types by overriding the default theme service. * change theme on the fly rather than updating local state. - When the feature flag is removed then a migration will have to take place --- .../browser/src/background/main.background.ts | 7 ++++-- .../popup/settings/appearance-v2.component.ts | 2 -- .../src/app/services/desktop-theme.service.ts | 25 +++++++++++++++++++ .../src/app/services/services.module.ts | 7 ++++++ apps/web/src/app/core/core.module.ts | 7 +++--- .../src/services/jslib-services.module.ts | 2 +- .../platform/theming/theme-state.service.ts | 23 ++++++++++++++--- 7 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 apps/desktop/src/app/services/desktop-theme.service.ts diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index f54f1de1dd5..62d83b19009 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -610,8 +610,6 @@ export default class MainBackground { migrationRunner, ); - this.themeStateService = new DefaultThemeStateService(this.globalStateProvider); - this.masterPasswordService = new MasterPasswordService( this.stateProvider, this.stateService, @@ -785,6 +783,11 @@ export default class MainBackground { this.authService, ); + this.themeStateService = new DefaultThemeStateService( + this.globalStateProvider, + this.configService, + ); + this.bulkEncryptService = new FallbackBulkEncryptService(this.encryptService); this.cipherService = new CipherService( diff --git a/apps/browser/src/vault/popup/settings/appearance-v2.component.ts b/apps/browser/src/vault/popup/settings/appearance-v2.component.ts index 7ca073d51b0..12f5c540409 100644 --- a/apps/browser/src/vault/popup/settings/appearance-v2.component.ts +++ b/apps/browser/src/vault/popup/settings/appearance-v2.component.ts @@ -59,8 +59,6 @@ export class AppearanceV2Component implements OnInit { { name: i18nService.t("systemDefault"), value: ThemeType.System }, { name: i18nService.t("light"), value: ThemeType.Light }, { name: i18nService.t("dark"), value: ThemeType.Dark }, - { name: "Nord", value: ThemeType.Nord }, - { name: i18nService.t("solarizedDark"), value: ThemeType.SolarizedDark }, ]; } diff --git a/apps/desktop/src/app/services/desktop-theme.service.ts b/apps/desktop/src/app/services/desktop-theme.service.ts new file mode 100644 index 00000000000..321aff677df --- /dev/null +++ b/apps/desktop/src/app/services/desktop-theme.service.ts @@ -0,0 +1,25 @@ +import { map } from "rxjs"; + +import { ThemeType } from "@bitwarden/common/platform/enums"; +import { GlobalStateProvider } from "@bitwarden/common/platform/state"; +import { + THEME_SELECTION, + ThemeStateService, +} from "@bitwarden/common/platform/theming/theme-state.service"; + +export class DesktopThemeStateService implements ThemeStateService { + private readonly selectedThemeState = this.globalStateProvider.get(THEME_SELECTION); + + selectedTheme$ = this.selectedThemeState.state$.pipe(map((theme) => theme ?? this.defaultTheme)); + + constructor( + private globalStateProvider: GlobalStateProvider, + private defaultTheme: ThemeType = ThemeType.System, + ) {} + + async setSelectedTheme(theme: ThemeType): Promise { + await this.selectedThemeState.update(() => theme, { + shouldUpdate: (currentTheme) => currentTheme !== theme, + }); + } +} diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index d4b51ca1c7e..d5672f54c0f 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -66,6 +66,7 @@ import { SystemService } from "@bitwarden/common/platform/services/system.servic import { GlobalStateProvider, StateProvider } from "@bitwarden/common/platform/state"; // eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage import { MemoryStorageService as MemoryStorageServiceForStateProviders } from "@bitwarden/common/platform/state/storage/memory-storage.service"; +import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type"; import { CipherService as CipherServiceAbstraction } from "@bitwarden/common/vault/abstractions/cipher.service"; import { DialogService } from "@bitwarden/components"; @@ -93,6 +94,7 @@ import { SearchBarService } from "../layout/search/search-bar.service"; import { DesktopFileDownloadService } from "./desktop-file-download.service"; import { DesktopSetPasswordJitService } from "./desktop-set-password-jit.service"; +import { DesktopThemeStateService } from "./desktop-theme.service"; import { InitService } from "./init.service"; import { NativeMessagingManifestService } from "./native-messaging-manifest.service"; import { RendererCryptoFunctionService } from "./renderer-crypto-function.service"; @@ -212,6 +214,11 @@ const safeProviders: SafeProvider[] = [ useFactory: () => fromIpcSystemTheme(), deps: [], }), + safeProvider({ + provide: ThemeStateService, + useClass: DesktopThemeStateService, + deps: [GlobalStateProvider], + }), safeProvider({ provide: EncryptedMessageHandlerService, deps: [ diff --git a/apps/web/src/app/core/core.module.ts b/apps/web/src/app/core/core.module.ts index 887c8fb626a..5bf9373b032 100644 --- a/apps/web/src/app/core/core.module.ts +++ b/apps/web/src/app/core/core.module.ts @@ -33,6 +33,7 @@ import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { ClientType } from "@bitwarden/common/enums"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; @@ -174,10 +175,10 @@ const safeProviders: SafeProvider[] = [ }), safeProvider({ provide: ThemeStateService, - useFactory: (globalStateProvider: GlobalStateProvider) => + useFactory: (globalStateProvider: GlobalStateProvider, configService: ConfigService) => // Web chooses to have Light as the default theme - new DefaultThemeStateService(globalStateProvider, ThemeType.Light), - deps: [GlobalStateProvider], + new DefaultThemeStateService(globalStateProvider, configService, ThemeType.Light), + deps: [GlobalStateProvider, ConfigService], }), safeProvider({ provide: CLIENT_TYPE, diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index cdf6a273909..4cdf5be8651 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -364,7 +364,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: ThemeStateService, useClass: DefaultThemeStateService, - deps: [GlobalStateProvider], + deps: [GlobalStateProvider, ConfigService], }), safeProvider({ provide: AbstractThemingService, diff --git a/libs/common/src/platform/theming/theme-state.service.ts b/libs/common/src/platform/theming/theme-state.service.ts index 9c31733416b..bb146be4927 100644 --- a/libs/common/src/platform/theming/theme-state.service.ts +++ b/libs/common/src/platform/theming/theme-state.service.ts @@ -1,5 +1,7 @@ -import { Observable, map } from "rxjs"; +import { Observable, combineLatest, map } from "rxjs"; +import { FeatureFlag } from "../../enums/feature-flag.enum"; +import { ConfigService } from "../abstractions/config/config.service"; import { ThemeType } from "../enums"; import { GlobalStateProvider, KeyDefinition, THEMING_DISK } from "../state"; @@ -16,17 +18,32 @@ export abstract class ThemeStateService { abstract setSelectedTheme(theme: ThemeType): Promise; } -const THEME_SELECTION = new KeyDefinition(THEMING_DISK, "selection", { +export const THEME_SELECTION = new KeyDefinition(THEMING_DISK, "selection", { deserializer: (s) => s, }); export class DefaultThemeStateService implements ThemeStateService { private readonly selectedThemeState = this.globalStateProvider.get(THEME_SELECTION); - selectedTheme$ = this.selectedThemeState.state$.pipe(map((theme) => theme ?? this.defaultTheme)); + selectedTheme$ = combineLatest([ + this.selectedThemeState.state$, + this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), + ]).pipe( + map(([theme, isExtensionRefresh]) => { + // The extension refresh should not allow for Nord or SolarizedDark + // Default the user to their system theme + if (isExtensionRefresh && [ThemeType.Nord, ThemeType.SolarizedDark].includes(theme)) { + return ThemeType.System; + } + + return theme; + }), + map((theme) => theme ?? this.defaultTheme), + ); constructor( private globalStateProvider: GlobalStateProvider, + private configService: ConfigService, private defaultTheme: ThemeType = ThemeType.System, ) {} From 7ae427e713733f43f4d916b1208aa990e39fd54c Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Thu, 19 Sep 2024 13:27:08 -0400 Subject: [PATCH 057/104] Revert "[PM-11200] Move delete item permission to Can Manage (#10890)" (#11155) * Revert "[PM-11200] Move delete item permission to Can Manage (#10890)" This reverts commit 8921230b4f5f33d0948572e47261604a6a3d731e. * Removed provider access --- .../vault-cipher-row.component.html | 2 +- .../vault-items/vault-cipher-row.component.ts | 1 - .../vault-items/vault-items.component.html | 3 -- .../vault-items/vault-items.component.ts | 39 ++++--------------- .../individual-vault/vault.component.html | 1 - 5 files changed, 8 insertions(+), 38 deletions(-) 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 6a04ff6071d..524d9dff20b 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 @@ -157,7 +157,7 @@ -
+
+ + {{ "sendPasswordDescV2" | i18n }} + + + + {{ "hideYourEmail" | i18n }} + + + {{ "privateNote" | i18n }} + + + + diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts new file mode 100644 index 00000000000..46b0940c919 --- /dev/null +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts @@ -0,0 +1,95 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; +import { + CardComponent, + CheckboxModule, + FormFieldModule, + IconButtonModule, + SectionComponent, + SectionHeaderComponent, + TypographyModule, +} from "@bitwarden/components"; + +import { SendFormConfig } from "../../abstractions/send-form-config.service"; +import { SendFormContainer } from "../../send-form-container"; + +@Component({ + selector: "tools-send-options", + templateUrl: "./send-options.component.html", + standalone: true, + imports: [ + SectionComponent, + SectionHeaderComponent, + TypographyModule, + JslibModule, + CardComponent, + FormFieldModule, + ReactiveFormsModule, + IconButtonModule, + CheckboxModule, + CommonModule, + ], +}) +export class SendOptionsComponent implements OnInit { + @Input({ required: true }) + config: SendFormConfig; + @Input() + originalSendView: SendView; + sendOptionsForm = this.formBuilder.group({ + maxAccessCount: [null as number], + accessCount: [null as number], + notes: [null as string], + password: [null as string], + hideEmail: [false as boolean], + }); + get hasPassword(): boolean { + return ( + this.sendOptionsForm.value.password !== null && this.sendOptionsForm.value.password !== "" + ); + } + + get shouldShowCount(): boolean { + return this.config.mode === "edit" && this.sendOptionsForm.value.maxAccessCount !== null; + } + + get viewsLeft(): number { + return this.sendOptionsForm.value.maxAccessCount + ? this.sendOptionsForm.value.maxAccessCount - this.sendOptionsForm.value.accessCount + : 0; + } + + constructor( + private sendFormContainer: SendFormContainer, + private formBuilder: FormBuilder, + ) { + this.sendFormContainer.registerChildForm("sendOptionsForm", this.sendOptionsForm); + this.sendOptionsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { + this.sendFormContainer.patchSend((send) => { + Object.assign(send, { + maxAccessCount: value.maxAccessCount, + accessCount: value.accessCount, + password: value.password, + hideEmail: value.hideEmail, + notes: value.notes, + }); + return send; + }); + }); + } + ngOnInit() { + if (this.sendFormContainer.originalSendView) { + this.sendOptionsForm.patchValue({ + maxAccessCount: this.sendFormContainer.originalSendView.maxAccessCount, + accessCount: this.sendFormContainer.originalSendView.accessCount, + password: this.sendFormContainer.originalSendView.password, + hideEmail: this.sendFormContainer.originalSendView.hideEmail, + notes: this.sendFormContainer.originalSendView.notes, + }); + } + } +} diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts index f3e2229dd2b..b5cf8ee0c76 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/base-send-details.component.ts @@ -1,7 +1,7 @@ import { DatePipe } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { FormBuilder, FormGroup, FormControl, Validators } from "@angular/forms"; +import { FormBuilder, FormControl, Validators } from "@angular/forms"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; @@ -9,11 +9,6 @@ import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendFormConfig } from "../../abstractions/send-form-config.service"; import { SendFormContainer } from "../../send-form-container"; -export type BaseSendDetailsForm = FormGroup<{ - name: FormControl; - selectedDeletionDatePreset: FormControl; -}>; - // Value = hours export enum DatePreset { OneHour = 1, @@ -38,21 +33,20 @@ export class BaseSendDetailsComponent implements OnInit { @Input() config: SendFormConfig; @Input() originalSendView?: SendView; - sendDetailsForm: BaseSendDetailsForm; customDeletionDateOption: DatePresetSelectOption | null = null; datePresetOptions: DatePresetSelectOption[] = []; + sendDetailsForm = this.formBuilder.group({ + name: new FormControl("", Validators.required), + selectedDeletionDatePreset: new FormControl(DatePreset.SevenDays || "", Validators.required), + }); + constructor( protected sendFormContainer: SendFormContainer, protected formBuilder: FormBuilder, protected i18nService: I18nService, protected datePipe: DatePipe, ) { - this.sendDetailsForm = this.formBuilder.group({ - name: new FormControl("", Validators.required), - selectedDeletionDatePreset: new FormControl(DatePreset.SevenDays || "", Validators.required), - }); - this.sendDetailsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { this.sendFormContainer.patchSend((send) => { return Object.assign(send, { diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html index 47e1fc6059a..b10956daac7 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html @@ -1,5 +1,5 @@ - +

{{ "sendDetails" | i18n }}

@@ -13,14 +13,12 @@ *ngIf="config.sendType === TextSendType" [config]="config" [originalSendView]="originalSendView" - [sendDetailsForm]="sendDetailsForm" > @@ -39,4 +37,5 @@ {{ "deletionDateDescV2" | i18n }} +
diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.ts index aadfc590c28..2d00888b9b5 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.ts @@ -17,6 +17,7 @@ import { } from "@bitwarden/components"; import { SendFormContainer } from "../../send-form-container"; +import { SendOptionsComponent } from "../options/send-options.component"; import { BaseSendDetailsComponent } from "./base-send-details.component"; import { SendFileDetailsComponent } from "./send-file-details.component"; @@ -36,6 +37,7 @@ import { SendTextDetailsComponent } from "./send-text-details.component"; ReactiveFormsModule, SendTextDetailsComponent, SendFileDetailsComponent, + SendOptionsComponent, IconButtonModule, CheckboxModule, CommonModule, diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts index 86c9fa96f1a..61391e20725 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-file-details.component.ts @@ -1,14 +1,7 @@ import { CommonModule } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { - FormBuilder, - FormControl, - FormGroup, - Validators, - ReactiveFormsModule, - FormsModule, -} from "@angular/forms"; +import { FormBuilder, Validators, ReactiveFormsModule, FormsModule } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; @@ -19,14 +12,6 @@ import { ButtonModule, FormFieldModule, SectionComponent } from "@bitwarden/comp import { SendFormConfig } from "../../abstractions/send-form-config.service"; import { SendFormContainer } from "../../send-form-container"; -import { BaseSendDetailsForm } from "./base-send-details.component"; - -type BaseSendFileDetailsForm = FormGroup<{ - file: FormControl; -}>; - -export type SendFileDetailsForm = BaseSendFileDetailsForm & BaseSendDetailsForm; - @Component({ selector: "tools-send-file-details", templateUrl: "./send-file-details.component.html", @@ -44,10 +29,10 @@ export type SendFileDetailsForm = BaseSendFileDetailsForm & BaseSendDetailsForm; export class SendFileDetailsComponent implements OnInit { @Input() config: SendFormConfig; @Input() originalSendView?: SendView; - @Input() sendDetailsForm: BaseSendDetailsForm; - baseSendFileDetailsForm: BaseSendFileDetailsForm; - sendFileDetailsForm: SendFileDetailsForm; + sendFileDetailsForm = this.formBuilder.group({ + file: this.formBuilder.control(null, Validators.required), + }); FileSendType = SendType.File; fileName = ""; @@ -56,12 +41,6 @@ export class SendFileDetailsComponent implements OnInit { private formBuilder: FormBuilder, protected sendFormContainer: SendFormContainer, ) { - this.baseSendFileDetailsForm = this.formBuilder.group({ - file: this.formBuilder.control(null, Validators.required), - }); - - this.sendFileDetailsForm = Object.assign(this.baseSendFileDetailsForm, this.sendDetailsForm); - this.sendFormContainer.registerChildForm("sendFileDetailsForm", this.sendFileDetailsForm); this.sendFileDetailsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.html b/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.html index bddd8f226d1..b7875d1d45f 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.html @@ -1,4 +1,4 @@ - + {{ "sendTypeTextToShare" | i18n }} diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.ts index 970c74644d8..85fc324f2f7 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-text-details.component.ts @@ -1,13 +1,7 @@ import { CommonModule } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { - FormBuilder, - FormControl, - FormGroup, - Validators, - ReactiveFormsModule, -} from "@angular/forms"; +import { FormBuilder, FormControl, Validators, ReactiveFormsModule } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; @@ -16,15 +10,6 @@ import { CheckboxModule, FormFieldModule, SectionComponent } from "@bitwarden/co import { SendFormConfig } from "../../abstractions/send-form-config.service"; import { SendFormContainer } from "../../send-form-container"; -import { BaseSendDetailsForm } from "./base-send-details.component"; - -type BaseSendTextDetailsForm = FormGroup<{ - text: FormControl; - hidden: FormControl; -}>; - -export type SendTextDetailsForm = BaseSendTextDetailsForm & BaseSendDetailsForm; - @Component({ selector: "tools-send-text-details", templateUrl: "./send-text-details.component.html", @@ -41,22 +26,16 @@ export type SendTextDetailsForm = BaseSendTextDetailsForm & BaseSendDetailsForm; export class SendTextDetailsComponent implements OnInit { @Input() config: SendFormConfig; @Input() originalSendView?: SendView; - @Input() sendDetailsForm: BaseSendDetailsForm; - baseSendTextDetailsForm: BaseSendTextDetailsForm; - sendTextDetailsForm: SendTextDetailsForm; + sendTextDetailsForm = this.formBuilder.group({ + text: new FormControl("", Validators.required), + hidden: new FormControl(false), + }); constructor( private formBuilder: FormBuilder, protected sendFormContainer: SendFormContainer, ) { - this.baseSendTextDetailsForm = this.formBuilder.group({ - text: new FormControl("", Validators.required), - hidden: new FormControl(false), - }); - - this.sendTextDetailsForm = Object.assign(this.baseSendTextDetailsForm, this.sendDetailsForm); - this.sendFormContainer.registerChildForm("sendTextDetailsForm", this.sendTextDetailsForm); this.sendTextDetailsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { @@ -73,7 +52,7 @@ export class SendTextDetailsComponent implements OnInit { ngOnInit() { if (this.originalSendView) { - this.baseSendTextDetailsForm.patchValue({ + this.sendTextDetailsForm.patchValue({ text: this.originalSendView.text?.text || "", hidden: this.originalSendView.text?.hidden || false, }); diff --git a/libs/tools/send/send-ui/src/send-form/send-form-container.ts b/libs/tools/send/send-ui/src/send-form/send-form-container.ts index 21508d96727..84e0913194b 100644 --- a/libs/tools/send/send-ui/src/send-form/send-form-container.ts +++ b/libs/tools/send/send-ui/src/send-form/send-form-container.ts @@ -1,17 +1,19 @@ import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendFormConfig } from "./abstractions/send-form-config.service"; +import { SendOptionsComponent } from "./components/options/send-options.component"; import { SendDetailsComponent } from "./components/send-details/send-details.component"; -import { SendFileDetailsForm } from "./components/send-details/send-file-details.component"; -import { SendTextDetailsForm } from "./components/send-details/send-text-details.component"; +import { SendFileDetailsComponent } from "./components/send-details/send-file-details.component"; +import { SendTextDetailsComponent } from "./components/send-details/send-text-details.component"; /** * The complete form for a send. Includes all the sub-forms from their respective section components. * TODO: Add additional form sections as they are implemented. */ export type SendForm = { sendDetailsForm?: SendDetailsComponent["sendDetailsForm"]; - sendTextDetailsForm?: SendTextDetailsForm; - sendFileDetailsForm?: SendFileDetailsForm; + sendTextDetailsForm?: SendTextDetailsComponent["sendTextDetailsForm"]; + sendFileDetailsForm?: SendFileDetailsComponent["sendFileDetailsForm"]; + sendOptionsForm?: SendOptionsComponent["sendOptionsForm"]; }; /** From ca1dce46257852834415a78e12e266b2d97c1591 Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Thu, 19 Sep 2024 14:48:14 -0500 Subject: [PATCH 062/104] Add missing translation keys. (#11159) --- apps/web/src/locales/en/messages.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 87c0ad654fd..c47975bdfea 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -8281,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, From 01f668e648cb2f60f4a84af4627af89d2c5de642 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:59:25 -0700 Subject: [PATCH 063/104] add send link copy (#11160) --- .../send-details/send-details.component.html | 13 +++++++++++++ .../send-details/send-details.component.ts | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html index b10956daac7..e5b99828fe4 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html @@ -21,6 +21,19 @@ [originalSendView]="originalSendView" > + + {{ "sendLink" | i18n }} + + + + {{ "deletionDate" | i18n }} Date: Thu, 19 Sep 2024 13:15:11 -0700 Subject: [PATCH 064/104] disable hide email when in policy in send options (#11161) --- .../options/send-options.component.html | 2 +- .../components/options/send-options.component.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html index e57b5af34c9..9c5183aabd2 100644 --- a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html @@ -19,7 +19,7 @@ {{ "sendPasswordDescV2" | i18n }} - + {{ "hideYourEmail" | i18n }} diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts index 46b0940c919..ab4ffaa9dd0 100644 --- a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts @@ -2,8 +2,11 @@ import { CommonModule } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; +import { map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { CardComponent, @@ -40,6 +43,7 @@ export class SendOptionsComponent implements OnInit { config: SendFormConfig; @Input() originalSendView: SendView; + disableHideEmail = false; sendOptionsForm = this.formBuilder.group({ maxAccessCount: [null as number], accessCount: [null as number], @@ -47,6 +51,7 @@ export class SendOptionsComponent implements OnInit { password: [null as string], hideEmail: [false as boolean], }); + get hasPassword(): boolean { return ( this.sendOptionsForm.value.password !== null && this.sendOptionsForm.value.password !== "" @@ -66,8 +71,19 @@ export class SendOptionsComponent implements OnInit { constructor( private sendFormContainer: SendFormContainer, private formBuilder: FormBuilder, + private policyService: PolicyService, ) { this.sendFormContainer.registerChildForm("sendOptionsForm", this.sendOptionsForm); + this.policyService + .getAll$(PolicyType.SendOptions) + .pipe( + map((policies) => policies?.some((p) => p.data.disableHideEmail)), + takeUntilDestroyed(), + ) + .subscribe((disableHideEmail) => { + this.disableHideEmail = disableHideEmail; + }); + this.sendOptionsForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { this.sendFormContainer.patchSend((send) => { Object.assign(send, { From 5f25bd93cd5a835e9ec51743e461e74b87f010c6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:26:04 +0000 Subject: [PATCH 065/104] Autosync the updated translations (#11166) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 145 ++++++++++++++--- apps/web/src/locales/ar/messages.json | 145 ++++++++++++++--- apps/web/src/locales/az/messages.json | 153 +++++++++++++---- apps/web/src/locales/be/messages.json | 145 ++++++++++++++--- apps/web/src/locales/bg/messages.json | 151 +++++++++++++---- apps/web/src/locales/bn/messages.json | 145 ++++++++++++++--- apps/web/src/locales/bs/messages.json | 145 ++++++++++++++--- apps/web/src/locales/ca/messages.json | 145 ++++++++++++++--- apps/web/src/locales/cs/messages.json | 141 +++++++++++++--- apps/web/src/locales/cy/messages.json | 145 ++++++++++++++--- apps/web/src/locales/da/messages.json | 173 +++++++++++++++----- apps/web/src/locales/de/messages.json | 179 +++++++++++++++----- apps/web/src/locales/el/messages.json | 145 ++++++++++++++--- apps/web/src/locales/en_GB/messages.json | 141 +++++++++++++--- apps/web/src/locales/en_IN/messages.json | 141 +++++++++++++--- apps/web/src/locales/eo/messages.json | 145 ++++++++++++++--- apps/web/src/locales/es/messages.json | 145 ++++++++++++++--- apps/web/src/locales/et/messages.json | 145 ++++++++++++++--- apps/web/src/locales/eu/messages.json | 145 ++++++++++++++--- apps/web/src/locales/fa/messages.json | 145 ++++++++++++++--- apps/web/src/locales/fi/messages.json | 169 ++++++++++++++----- apps/web/src/locales/fil/messages.json | 145 ++++++++++++++--- apps/web/src/locales/fr/messages.json | 141 +++++++++++++--- apps/web/src/locales/gl/messages.json | 145 ++++++++++++++--- apps/web/src/locales/he/messages.json | 145 ++++++++++++++--- apps/web/src/locales/hi/messages.json | 145 ++++++++++++++--- apps/web/src/locales/hr/messages.json | 183 +++++++++++++++------ apps/web/src/locales/hu/messages.json | 143 +++++++++++++--- apps/web/src/locales/id/messages.json | 145 ++++++++++++++--- apps/web/src/locales/it/messages.json | 151 +++++++++++++---- apps/web/src/locales/ja/messages.json | 141 +++++++++++++--- apps/web/src/locales/ka/messages.json | 145 ++++++++++++++--- apps/web/src/locales/km/messages.json | 145 ++++++++++++++--- apps/web/src/locales/kn/messages.json | 145 ++++++++++++++--- apps/web/src/locales/ko/messages.json | 145 ++++++++++++++--- apps/web/src/locales/lv/messages.json | 151 +++++++++++++---- apps/web/src/locales/ml/messages.json | 145 ++++++++++++++--- apps/web/src/locales/mr/messages.json | 145 ++++++++++++++--- apps/web/src/locales/my/messages.json | 145 ++++++++++++++--- apps/web/src/locales/nb/messages.json | 145 ++++++++++++++--- apps/web/src/locales/ne/messages.json | 145 ++++++++++++++--- apps/web/src/locales/nl/messages.json | 151 +++++++++++++---- apps/web/src/locales/nn/messages.json | 145 ++++++++++++++--- apps/web/src/locales/or/messages.json | 145 ++++++++++++++--- apps/web/src/locales/pl/messages.json | 145 ++++++++++++++--- apps/web/src/locales/pt_BR/messages.json | 143 +++++++++++++--- apps/web/src/locales/pt_PT/messages.json | 153 +++++++++++++---- apps/web/src/locales/ro/messages.json | 145 ++++++++++++++--- apps/web/src/locales/ru/messages.json | 143 +++++++++++++--- apps/web/src/locales/si/messages.json | 145 ++++++++++++++--- apps/web/src/locales/sk/messages.json | 143 +++++++++++++--- apps/web/src/locales/sl/messages.json | 145 ++++++++++++++--- apps/web/src/locales/sr/messages.json | 181 ++++++++++++++++----- apps/web/src/locales/sr_CS/messages.json | 145 ++++++++++++++--- apps/web/src/locales/sv/messages.json | 199 +++++++++++++++++------ apps/web/src/locales/te/messages.json | 145 ++++++++++++++--- apps/web/src/locales/th/messages.json | 145 ++++++++++++++--- apps/web/src/locales/tr/messages.json | 143 +++++++++++++--- apps/web/src/locales/uk/messages.json | 143 +++++++++++++--- apps/web/src/locales/vi/messages.json | 171 ++++++++++++++----- apps/web/src/locales/zh_CN/messages.json | 157 ++++++++++++++---- apps/web/src/locales/zh_TW/messages.json | 145 ++++++++++++++--- 62 files changed, 7446 insertions(+), 1804 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index da3e29eed8a..7232f4cd3f5 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleaans" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Gekoppel", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Verwyder" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Bekyk item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopieer URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Ek" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Instellings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Wagwoordwenk" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Kluis-uittel" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Kies wanneer u kluis sal uittel en die gekose aksie sal uitvoer." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Vergrendel", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Asblik", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Skrap enige versameling" }, - "editAssignedCollections": { - "message": "Wysig toegekende versamelings" - }, - "deleteAssignedCollections": { - "message": "Skrap toegekende versamelings" - }, "manageGroups": { "message": "Bestuur groepe" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Pasgemaakte kluisuittel" - }, "vaultTimeoutToLarge": { "message": "U kluisuittelling oorskry die beperking wat deur u organisasie daargestel is." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Laaste Sinchronisering", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Selfgehuisveste borgskappe gesinchroniseer." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM-bevoorrading", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Voorsien gebruikers en groepe outomaties met u voorkeuridentiteitsverskaffer d.m.v. SCIM-bevoorrading", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Aktiveer SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Stel u voorkeuridentiteitverskaffer op deur die URL- en SCIM-API-sleutel in te stel", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Hierdie API-sleutel het toegang tot die beheer van gebruikers in u organisasie. Dit moet ’n geheim gehou word." }, "copyScimKey": { "message": "Kopieer die SCIM-API-sleutel na u knipbord", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Roteer die SCIM-API-sleutel", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Is u seker u wil die SCIM-API-sleutel roteer? Die huidige sleutel sal nie meer werk vir enige bestaande integrasies nie.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Roteer sleutel" }, "scimApiKey": { "message": "SCIM API-sleutel", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopieer die SCIM-eindpunt se bronadres na u knipbord", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM-bronadres", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Die SCIM API-sleutel is suksesvol geroteer", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM-instellings is suksesvol bewaar", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Toevoer word vereis." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Laai lêer op" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Aanvaarde formate:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 7c159370110..644a5346aff 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "قيمة منطقية" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "مرتبط", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "إزالة" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "عرض العنصر" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "نسخ الرابط", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "أنا" }, @@ -960,6 +1026,18 @@ "settings": { "message": "الإعدادات" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "تلميح كلمة المرور" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "مهلة الخزنة" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "قفل", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "سلة المهملات", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "إدارة الفِرَق" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "هذا الحقل مطلوب." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 94dc8052f52..f0bbed2beb6 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -144,7 +144,7 @@ "message": "Güvənlik kodu (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Güvənlik kodu / CVV" }, "identityName": { "message": "Kimlik adı" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Əlaqələndirildi", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Sil" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Elementə bax" }, + "newItemHeader": { + "message": "Yeni $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ - düzəliş et", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "$ITEMTYPE$ - bax", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Uğurla kopyalandı" }, "copyValue": { "message": "Dəyəri kopyala", @@ -592,6 +619,45 @@ "message": "URI-ni kopyala", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "$FIELD$ - kopyala", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Veb saytı kopyala" + }, + "copyNotes": { + "message": "Notları kopyala" + }, + "copyAddress": { + "message": "Ünvanı kopyala" + }, + "copyPhone": { + "message": "Telefonu kopyala" + }, + "copyEmail": { + "message": "E-poçtu kopyala" + }, + "copyCompany": { + "message": "Şirkəti kopyala" + }, + "copySSN": { + "message": "Sosial güvənlik nömrəsini kopyala" + }, + "copyPassportNumber": { + "message": "Pasport nömrəsini kopyala" + }, + "copyLicenseNumber": { + "message": "Lisenziya nömrəsini kopyala" + }, + "copyName": { + "message": "Adı kopyala" + }, "me": { "message": "Mən" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Ayarlar" }, + "accountEmail": { + "message": "Hesab e-poçtu" + }, + "requestHint": { + "message": "İpucu tələb et" + }, + "requestPasswordHint": { + "message": "Parol ipucusu tələb et" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Hesabınızın e-poçt ünvanını daxil edin və parolunuz üçün ipucu sizə göndəriləcək" + }, "passwordHint": { "message": "Parol məsləhəti" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Şifrələmə açarı güncəlləməsi davam edə bilmir" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Şifrələmə açarınızı güncəlləyərkən qovluqlarınızın şifrəsi açıla bilmədi. Güncəlləmənin davam etməsi üçün qovluqlarınız silinməlidir. Davam etsəniz, heç bir anbar elementi silinməyəcək." }, "keyUpdated": { "message": "Açar güncəlləndi" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Anbara müraciət bitəcək" }, + "vaultTimeout1": { + "message": "Vaxt bitmə" + }, "vaultTimeoutDesc": { "message": "Anbara müraciətin bitəcəyi vaxtı seçin və seçilən əməliyyatı icra edin." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Kilidlə", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Tullantı qutusu", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "İstənilən kolleksiyanı sil" }, - "editAssignedCollections": { - "message": "Təyin edilmiş kolleksiyalara düzəliş et" - }, - "deleteAssignedCollections": { - "message": "Təyin edilmiş kolleksiyaları sil" - }, "manageGroups": { "message": "Qrupları idarə et" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maksimum $HOURS$ saat və $MINUTES$ dəqiqə.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir. Anbar vaxt bitişi əməliyyatı $ACTION$ olaraq ayarlandı.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Özəl vaxt" - }, "vaultTimeoutToLarge": { "message": "Anbar vaxt bitişi, təşkilatınız tərəfindən ayarlanan məhdudiyyətləri aşır." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Son sinxr", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorluq sinxronlaşdırıldı." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM Təminatı", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "SCIM təmin etmə vasitəsilə tərcih etdiyiniz kimlik doğrulama provayderləri ilə istifadəçiləri və qrupları avtomatik təmin edin", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM-i fəallaşdır", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "URL və SCIM API açarını konfiqurasiya edərək tərcih etdiyiniz kimlik provayderini qurun", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Bu API açarı, təşkilatınızdakı istifadəçiləri idarə etmə müraciətinə sahibdir. Gizli saxlanılmalıdır." }, "copyScimKey": { "message": "SCIM API açarını lövhəyə kopyala", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "SCIM API açarını döndər", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "SCIM API açarını döndərmək istədiyinizə əminsiniz? Hazırkı açar, mövcud heç bir inteqrasiya üçün işləməyəcək.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Açarı döndər" }, "scimApiKey": { "message": "SCIM API açarı", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "SCIM uc nöqtə URL-sini lövhəyə kopyala", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API açarı uğurla döndərildi", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM ayarları saxlanıldı", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Giriş lazımdır." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Fayl yüklə" }, + "upload": { + "message": "Yüklə" + }, "acceptedFormats": { "message": "Qəbul edilən formatlar:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Xana əlavə et" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Elementlər" }, @@ -9073,21 +9164,21 @@ "current": { "message": "Hazırkı" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Sirr Meneceri abunəliyiniz seçilmiş plan əsasında yüksəldiləcək" }, "bitwardenPasswordManager": { "message": "Bitwarden Parol Meneceri" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Tamamlayıcı bir illik Parol Meneceri abunəliyiniz seçilmiş plana yüksəldiləcək. Ödənişsiz dövr bitənə qədər sizdən ödəniş alınmayacaq." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Fayl cihazda saxlanıldı. Endirilənləri cihazınızdan idarə edin." }, "publicApi": { "message": "Hər kəsə açıq API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Xarakter sayını göstər" diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 21f6754deb7..b190af809ca 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Булева" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Звязана", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Выдаліць" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Прагледзець элемент" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Скапіяваць URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Я" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Налады" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Падказка да пароля" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Час чакання сховішча" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Выберыце дзеянне, якое неабходна выканаць пасля завяршэння часу чакання сховішча." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Заблакіраваць", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Сметніца", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Выдаліць любую калекцыю" }, - "editAssignedCollections": { - "message": "Рэдагаваць прызначаныя калекцыі" - }, - "deleteAssignedCollections": { - "message": "Выдаліць прызначаныя калекцыі" - }, "manageGroups": { "message": "Кіраванне групамі" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае гадзін: $HOURS$; хвілін: $MINUTES$. Для часу чакання вашага сховішча прызначана дзеянне $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Карыстальніцкі час чакання сховішча" - }, "vaultTimeoutToLarge": { "message": "Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Апошняя сінхранізацыя", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Уласнае размяшчэнне спансіравання сінхранізавана." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Забеспячэнне SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Аўтаматычна забяспечваць карыстальнікаў і групы пажаданымі пасведчаннямі пастаўшчыка праз SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Уключыць SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Наладзьце пажаданага пастаўшчыка пасведчанняў з дапамогай канфігурацыі URL-адраса і ключа API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Гэты ключ API мае доступ да кіравання карыстальнікаў у межах вашай арганізацыі. Яго неабходна захоўваць у надзейным месцы." }, "copyScimKey": { "message": "Скапіяваць ключ API для SCIM у буфер абмену", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Змяніць ключ API для SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Вы сапраўды хочаце змяніць ключ API для SCIM? Бягучы ключ не будзе больш працаваць для любых бягучых інтэграцый.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Змяніць ключ" }, "scimApiKey": { "message": "Ключ API для SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Скапіяваць SCIM канцавога пункту URL-адраса ў ваш буфер абмену", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL-адрас SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Ключ API для SCIM быў паспяхова зменены", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Налады SCIM былі паспяхова захаваны", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Неабходны ўвод даных." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Файл запампаваны" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Прынятыя фарматы:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 9c0315406ff..5e7556af1ee 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -144,7 +144,7 @@ "message": "Код за сигурност" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Код за сигурност / CVV" }, "identityName": { "message": "Име на самоличността" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Булево" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Свързано", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Премахване" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Преглед на елемента" }, + "newItemHeader": { + "message": "Ново $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Редактиране на $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Преглед на $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Копирането е успешно" }, "copyValue": { "message": "Копиране на стойността", @@ -592,6 +619,45 @@ "message": "Копиране на адреса", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Копиране на $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Копиране на уеб сайта" + }, + "copyNotes": { + "message": "Копиране на бележките" + }, + "copyAddress": { + "message": "Копиране на адреса" + }, + "copyPhone": { + "message": "Копиране на телефона" + }, + "copyEmail": { + "message": "Копиране на е-пощата" + }, + "copyCompany": { + "message": "Копиране на компанията" + }, + "copySSN": { + "message": "Копиране на номера на осигуровката" + }, + "copyPassportNumber": { + "message": "Копиране на номера на паспорта" + }, + "copyLicenseNumber": { + "message": "Копиране на номера на свидетелството" + }, + "copyName": { + "message": "Копиране на името" + }, "me": { "message": "Аз" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Настройки" }, + "accountEmail": { + "message": "Е-поща на регистрацията" + }, + "requestHint": { + "message": "Заявка за подсказка" + }, + "requestPasswordHint": { + "message": "Заявка за подсказка за паролата" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Въведете е-пощата на регистрацията си и подсказката за паролата ще Ви бъде изпратена" + }, "passwordHint": { "message": "Подсказка за паролата" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Актуализирането на шифриращия ключ не може да продължи" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Ако актуализирате шифроващия ключ, папките Ви няма да могат да бъдат дешифрирани. За да продължите с промяната, папките трябва да бъдат изтрити. Елементите в трезора няма да бъдат изтрити, ако продължите." }, "keyUpdated": { "message": "Ключът е обновен" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Време за достъп" }, + "vaultTimeout1": { + "message": "Време за достъп" + }, "vaultTimeoutDesc": { "message": "Изберете колко да е времето за достъп и какво ще е действието след това." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Заключване", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Кошче", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Изтриване на всякакви колекции" }, - "editAssignedCollections": { - "message": "Редактиране на възложените колекции" - }, - "deleteAssignedCollections": { - "message": "Изтриване на възложените колекции" - }, "manageGroups": { "message": "Управление на групи" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Максимум $HOURS$ час(а) и $MINUTES$ минута/и.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минута/и. Зададеното действие при изтичане на това време е $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Персонализирано време за достъп до трезора" - }, "vaultTimeoutToLarge": { "message": "Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Последно синхронизиране", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Спонсорствата на собствения сървър са синхронизирани." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Удостоверяване чрез SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Предоставете на потребителите и групите си автоматично удостоверяване със своя предпочитан доставчик на удостоверителни данни като използвате удостоверяване чрез SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Включване на SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Задайте предпочитания си доставчик на удостоверителни данни като настроите адреса и ключа за API на SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Този ключ за API предоставя достъп за управление на потребителите в организацията Ви. Трябва да го пазите в тайна." }, "copyScimKey": { "message": "Копиране на ключа за API на SCIM в буфера", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Смяна на ключа за API на SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Наистина ли искате да смените ключа за API на SCIM? Текущият ключ ще спре да работи за вече настроените интеграции.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Смяна на ключа" }, "scimApiKey": { "message": "Ключ за API на SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Копиране на адреса на SCIM в буфера", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "Адрес на SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Ключът за API на SCIM беше сменен успешно", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Настройките за SCIM бяха запазени успешно", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Полето е задължително да бъде попълнено." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Качване на файлове" }, + "upload": { + "message": "Качване" + }, "acceptedFormats": { "message": "Поддържани формати:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Добавяне на поле" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Елементи" }, @@ -9073,21 +9164,21 @@ "current": { "message": "Текущо" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Вашият абонамент за Управлението на тайни ще бъде надграден според избрания план" }, "bitwardenPasswordManager": { "message": "Bitwarden — управител на пароли" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Вашият безплатен едногодишен абонамент за Управлението на пароли ще бъде надграден до избрания план. Няма да бъдете таксуван(а), докато не изтече безплатния период." }, "fileSavedToDevice": { "message": "Файлът е запазен на устройството. Можете да го намерите в мястото за сваляния на устройството." }, "publicApi": { "message": "Публичен ППИ", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Показване на броя знаци" diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index cdb4a353f64..85bfe41eeb2 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "বুলিয়ান" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "সরান" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "বস্তু দেখুন" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "সেটিংস" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "পাসওয়ার্ড ইঙ্গিত" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index cfafb9990e1..ea220398955 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Logička varijabla" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Povezano sa", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Uklonite" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Prikaz Stavke" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopirajte URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Ja" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Podešavanja" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Nagovještaj lozinke" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 5aee2022f7d..66f62d015a4 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleà" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Enllaçat", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Suprimeix" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Visualitza l'element" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copia URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Jo" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Configuració" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista de la contrasenya" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Temps d'espera de la caixa forta" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Trieu quan es tancarà la vostra caixa forta i feu l'acció seleccionada." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Bloqueja", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Paperera", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Suprimeix alguna la col·lecció" }, - "editAssignedCollections": { - "message": "Edita col·leccions asignades" - }, - "deleteAssignedCollections": { - "message": "Suprimeix col·leccions asignades" - }, "manageGroups": { "message": "Administra els Grups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès de la caixa forta és de $HOURS$ hores i $MINUTES$ minuts. L'acció de temps d'espera de la caixa forta està definida en $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Temps d'espera a la caixa forta personalitzat" - }, "vaultTimeoutToLarge": { "message": "El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Última sincronització", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Patrocinis autoallotjats sincronitzats." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Aprovisionament SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Proporcioneu automàticament usuaris i grups amb el vostre proveïdor d'identitat preferit mitjançant el subministrament SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Habilita SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Configureu el vostre proveïdor d'identitat preferit configurant l'URL i la clau de l'API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Aquesta clau d'API té accés per gestionar els usuaris de la vostra organització. S'ha de mantenir en secret." }, "copyScimKey": { "message": "Copieu la clau de l'API SCIM al porta-retalls", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Gira la clau de l'API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Esteu segur que voleu girar la clau de l'API SCIM? La clau actual ja no funcionarà per a cap integració existent.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Gira la clau" }, "scimApiKey": { "message": "Gira la clau de l'API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copia l'URL del punt final d'SCIM al porta-retalls", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL d'SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "La clau de l'API SCIM s'ha girat correctament", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "La configuració de SCIM s'ha guardat correctament", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Es requereix una entrada." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Càrrega de fitxers" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Formats acceptats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Afig un camp" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Elements" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 84042618a2e..eb652cfd0da 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Propojeno", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Odebrat" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Zobrazit položku" }, + "newItemHeader": { + "message": "Nové $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Upravit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Zobrazit $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopírovat URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Kopírovat $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopírovat webovou stránku" + }, + "copyNotes": { + "message": "Kopírovat poznámku" + }, + "copyAddress": { + "message": "Kopírovat adresu" + }, + "copyPhone": { + "message": "Kopírovat telefon" + }, + "copyEmail": { + "message": "Kopírovat e-mail" + }, + "copyCompany": { + "message": "Kopírovat společnost" + }, + "copySSN": { + "message": "Kopírovat rodné číslo" + }, + "copyPassportNumber": { + "message": "Kopírovat číslo pasu" + }, + "copyLicenseNumber": { + "message": "Kopírovat číslo dokladu totožnosti" + }, + "copyName": { + "message": "Kopírovat název" + }, "me": { "message": "Já" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Nastavení" }, + "accountEmail": { + "message": "E-mail účtu" + }, + "requestHint": { + "message": "Vyžádat nápovědu" + }, + "requestPasswordHint": { + "message": "Vyžádat nápovědu k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadejte svou e-mailovou adresu, na kterou Vám zašleme nápovědu k heslu" + }, "passwordHint": { "message": "Nápověda pro heslo" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Časový limit trezoru" }, + "vaultTimeout1": { + "message": "Časový limit" + }, "vaultTimeoutDesc": { "message": "Vyberte, kdy vyprší bezpečnostní limit trezoru. Poté bude provedena vybraná akce." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Zamknout", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Koš", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Smazání jakékoli kolekce" }, - "editAssignedCollections": { - "message": "Úprava přiřazených kolekcí" - }, - "deleteAssignedCollections": { - "message": "Smazání přiřazené kolekce" - }, "manageGroups": { "message": "Správa skupin" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximálně $HOURS$ hodin a $MINUTES$ minut.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Pravidla Vaší organizace mají vliv na časový limit trezoru. Maximální povolený časový limit trezoru je $HOURS$ hodin a $MINUTES$ minut. Akce po časovém limitu trezoru je nastavena na $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Vlastní časový limit trezoru" - }, "vaultTimeoutToLarge": { "message": "Časový limit Vašeho trezoru překračuje omezení stanovená Vaší organizací." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "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\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Sponzoringy na vlastním hostingu byly synchronizovány." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Poskytování SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "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." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Povolit SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "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." + "description": "the text, 'SCIM', is an acronym 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." }, "copyScimKey": { "message": "Kopírovat klíč SCIM API do schránky", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Měnit klíč SCIM API", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "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." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Změnit klíč" }, "scimApiKey": { "message": "Klíč SCIM API", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopírovat URL koncového bodu SCIM do schránky", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Klíč SCIM API byl úspěšně změněn", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Nastavení SCIM bylo uloženo", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Je vyžadován vstup." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Nahrát soubor" }, + "upload": { + "message": "Nahrát" + }, "acceptedFormats": { "message": "Povolené formáty:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Přidat pole" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Položky" }, @@ -9073,7 +9164,7 @@ "current": { "message": "Aktuální" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Vaše předplatné Správce tajných klíčů bude aktualizováno na základě vybraného tarifu" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Veřejné API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Zobrazit počet znaků" diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index fe2ce4032ee..50729f5c46a 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 4cb84814411..15473e7b2d9 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolsk" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linket", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Fjern" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Vis emne" }, + "newItemHeader": { + "message": "Nyt $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Redigér $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Vis $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopiér URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Kopiér $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiér websted" + }, + "copyNotes": { + "message": "Kopiér notater" + }, + "copyAddress": { + "message": "Kopiér adresse" + }, + "copyPhone": { + "message": "Kopiér telefon" + }, + "copyEmail": { + "message": "Kopiér e-mail" + }, + "copyCompany": { + "message": "Kopiér firma" + }, + "copySSN": { + "message": "Kopiér Personnummer" + }, + "copyPassportNumber": { + "message": "Kopiér pasnummer" + }, + "copyLicenseNumber": { + "message": "Kopiér licensenummer" + }, + "copyName": { + "message": "Kopiér navn" + }, "me": { "message": "Mig" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Indstillinger" }, + "accountEmail": { + "message": "Konto-e-mail" + }, + "requestHint": { + "message": "Anmod om tip" + }, + "requestPasswordHint": { + "message": "Anmod om adgangskodetip" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Angiv kontoens e-mailadresse og få et adgangskodetip fremsendt" + }, "passwordHint": { "message": "Adgangskodetip" }, @@ -1153,7 +1231,7 @@ "message": "Yubico OTP-sikkerhedsnøgle" }, "yubiKeyDesc": { - "message": "Benyt en YubiKey for at tilgå din konto. Fungerer med YubiKey 4-/5-serien samt NEO-enheder." + "message": "Benyt en YubiKey 4-, 5- eller NEO-enhed." }, "duoDescV2": { "message": "Angiv en kode genereret af Duo Security.", @@ -1170,10 +1248,10 @@ "message": "FIDO U2F-sikkerhedsnøgle" }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn" + "message": "Adgangsnøgle" }, "webAuthnDesc": { - "message": "Benyt enhver WebAuthn-kompatibel sikkerhedsnøgle for at tilgå din konto." + "message": "Benyt enhedens biometri eller en FIDO2-kompatibel sikkerhedsnøgle." }, "webAuthnMigrated": { "message": "(Migreret fra FIDO)" @@ -1224,7 +1302,7 @@ "message": "Sikker på, at du vil fortsætte?" }, "moveSelectedItemsDesc": { - "message": "Vælg en mappe som du ønsker at tilføje $COUNT$ valgte element(er) til.", + "message": "Vælg en mappe, hvor valgte emne(r) fra $COUNT$ ønskes tilføjet.", "placeholders": { "count": { "content": "$1", @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Boks timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Vælg hvornår din boks skal udføre timeout-handlingen." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Slet enhver samling" }, - "editAssignedCollections": { - "message": "Redigér tildelte samlinger" - }, - "deleteAssignedCollections": { - "message": "Slet tildelte samlinger" - }, "manageGroups": { "message": "Håndtér grupper" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ time(r) og $MINUTES$ minut(ter) maks.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Organisationspolitikkerne påvirker boks-timeout. Maks. tilladt boks-timeout er $HOURS$ time(r) og $MINUTES$ minut(ter). Boks-timeouthandlingen er pt. sat til $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Tilpasset boks-timeout" - }, "vaultTimeoutToLarge": { "message": "Din boks-timeout overskrider den organisationsfastsatte begrænsning." }, @@ -5927,34 +6012,34 @@ "message": "selv-hostet" }, "customEnvironment": { - "message": "Custom environment" + "message": "Tilpasset miljø" }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "Angiv basis-URL'en for den lokalt-hosted Bitwarden-installation. Eks.: https://bitwarden.firma.dk" }, "selfHostedCustomEnvHeader": { - "message": "For advanced configuration, you can specify the base URL of each service independently." + "message": "Til avancerede brugere. Man kan angive basis-URL'en for hver tjeneste uafhængigt." }, "selfHostedEnvFormInvalid": { - "message": "Du skal tilføje enten den grundlæggende server URL eller mindst et brugerdefineret miljø." + "message": "Der skal tilføjes enten basis Server-URL'en eller mindst ét tilpasset miljø." }, "apiUrl": { - "message": "API server URL" + "message": "API-server URL" }, "webVaultUrl": { - "message": "Web vault server URL" + "message": "Web-boks server-URL" }, "identityUrl": { - "message": "Identity server URL" + "message": "Identitetsserver-URL" }, "notificationsUrl": { - "message": "Notifications server URL" + "message": "Notifikationsserver-URL" }, "iconsUrl": { - "message": "Icons server URL" + "message": "Ikonserver-URL" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "Miljø-URL'er gemt" }, "selfHostingTitle": { "message": "Selvhosting" @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Seneste synk", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Selv-hostet sponsorater synket." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM-provisionering", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Tildel automatisk brugere og grupper den foretrukne identitetsudbyder via SCIM-provisionering", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Aktivér SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Opsæt foretrukken identitetsudbyder ved at opsætte URL samt SCIM API-nøgle", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Denne API-nøgle har adgang til at håndtere organisationsbrugere. Den bør holdes hemmelig." }, "copyScimKey": { "message": "Kopiér SCIM API-nøglen til udklipsholderen", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotér SCIM API-nøglen", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Sikker på, at SCIM API-nøglen skal roteres? Nøglen vil i så fald ikke længere fungere for eksisterende integrationer.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotér nøgle" }, "scimApiKey": { "message": "SCIM API-nøgle", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopiér SCIM-slutpunktets URL til udklipsholderen", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API-nøglen er hermed roteret", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM-ændringer er hermed gemt", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input obligatorisk." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Fil-upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Gyldige formater:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Tilføj felt" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Emner" }, @@ -8883,7 +8974,7 @@ "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'." }, "contactBitwardenSupport": { - "message": "kontakt Bitwarden support.", + "message": "kontakt Bitwarden-supporten.", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'. 'Bitwarden' should not be translated" }, "sponsored": { @@ -9073,8 +9164,8 @@ "current": { "message": "Nuværende" }, - "secretsManagerSubInfo": { - "message": "Secrets Manager-abonnementet vil opgradere baseret på den valgte plan" + "secretsManagerSubscriptionInfo": { + "message": "Secrets Manager-abonnementet opgraderes baseret på den valgte abonnementstype" }, "bitwardenPasswordManager": { "message": "Bitwarden Adgangskodehåndtering" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Offentlig API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Vis tegnantal" diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 1573a381af5..0ad103379ab 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -144,7 +144,7 @@ "message": "Kartenprüfnummer (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Sicherheitscode / CVV" }, "identityName": { "message": "Identitätsname" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolescher Wert" }, + "cfTypeCheckbox": { + "message": "Kontrollkästchen" + }, "cfTypeLinked": { "message": "Verknüpft", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Feldtyp" + }, + "fieldLabel": { + "message": "Feldbezeichnung" + }, "remove": { "message": "Entfernen" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Eintrag anzeigen" }, + "newItemHeader": { + "message": "Neue $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ bearbeiten", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "$ITEMTYPE$ anzeigen", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Erfolgreich kopiert" }, "copyValue": { "message": "Wert kopieren", @@ -592,6 +619,45 @@ "message": "URI kopieren", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "$FIELD$ kopieren", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Website kopieren" + }, + "copyNotes": { + "message": "Notizen kopieren" + }, + "copyAddress": { + "message": "Adresse kopieren" + }, + "copyPhone": { + "message": "Telefonnummer kopieren" + }, + "copyEmail": { + "message": "E-Mail-Adresse kopieren" + }, + "copyCompany": { + "message": "Unternehmen kopieren" + }, + "copySSN": { + "message": "Sozialversicherungsnummer kopieren" + }, + "copyPassportNumber": { + "message": "Passnummer kopieren" + }, + "copyLicenseNumber": { + "message": "Lizenznummer kopieren" + }, + "copyName": { + "message": "Name kopieren" + }, "me": { "message": "Ich" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Einstellungen" }, + "accountEmail": { + "message": "E-Mail-Adresse des Kontos" + }, + "requestHint": { + "message": "Hinweis anfragen" + }, + "requestPasswordHint": { + "message": "Passwort-Hinweis anfragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" + }, "passwordHint": { "message": "Passwort-Hinweis" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Aktualisierung des Verschlüsselungsschlüssels kann nicht fortgesetzt werden" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Beim Aktualisieren deines Verschlüsselungsschlüssels konnten deine Ordner nicht entschlüsselt werden. Um mit der Aktualisierung fortzufahren, müssen deine Ordner gelöscht werden. Es werden keine Tresor-Einträge gelöscht, wenn du fortfährst." }, "keyUpdated": { "message": "Schlüssel aktualisiert" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Tresor-Timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Lege einen Timeout für den Tresor und die auszuführende Aktion fest." }, @@ -4048,7 +4129,7 @@ "message": "Ausgewählt" }, "recommended": { - "message": "Recommended" + "message": "Empfohlen" }, "ownership": { "message": "Eigentümer" @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Sperren", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papierkorb", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Jede Sammlung löschen" }, - "editAssignedCollections": { - "message": "Zugewiesene Sammlungen bearbeiten" - }, - "deleteAssignedCollections": { - "message": "Zugewiesene Sammlungen löschen" - }, "manageGroups": { "message": "Gruppen verwalten" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Deine Organisationsrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt $HOURS$ Stunde(n) und $MINUTES$ Minute(n). Deine Tresor-Timeout-Aktion ist auf $ACTION$ gesetzt.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Benutzerdefinierter Tresor-Timeout" - }, "vaultTimeoutToLarge": { "message": "Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegte Beschränkung." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Zuletzt synchronisiert:", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Selbst gehostetes Sponsoring synchronisiert." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM-Bereitstellung", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Über SCIM-Bereitstellung automatisch Benutzer und Gruppen mit deinem bevorzugten Identitätsanbieter zur Verfügung stellen", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM aktivieren", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Richte deinen bevorzugten Identitätsanbieter ein, indem du die URL und den SCIM API-Schlüssel konfigurierst", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Dieser API-Schlüssel hat Zugriff auf die Verwaltung von Benutzern innerhalb deiner Organisation. Er sollte geheim gehalten werden." }, "copyScimKey": { "message": "Den SCIM API-Schlüssel in deine Zwischenablage kopieren", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Den SCIM API-Schlüssel erneuern", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Bist du sicher, dass du den SCIM API-Schlüssel erneuern möchtest? Der aktuelle Schlüssel wird für bestehende Integrationen nicht mehr funktionieren.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Schlüssel erneuern" }, "scimApiKey": { "message": "SCIM API-Schlüssel", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopiere die SCIM Endpunkt-URL in deine Zwischenablage", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Der SCIM API-Schlüssel wurde erfolgreich erneuert", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM Einstellungen gespeichert", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Eingabe ist erforderlich." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Datei-Upload" }, + "upload": { + "message": "Hochladen" + }, "acceptedFormats": { "message": "Akzeptierte Formate:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Feld hinzufügen" }, + "editField": { + "message": "Feld bearbeiten" + }, "items": { "message": "Einträge" }, @@ -8772,25 +8863,25 @@ "message": "Kontrolliere den Zugriff von Organisationsmitgliedern auf Gruppen, Sammlungen und Sammlungseinträgen. Der CSV-Export bietet eine detaillierte Aufschlüsselung pro Mitglied, einschließlich Informationen über Sammlungsberechtigungen und Kontenkonfigurationen." }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(Keine Sammlung)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(Keine Sammlungsberechtigung)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(Keine Gruppe)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "Ein" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Aus" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "Ein" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Aus" }, "higherKDFIterations": { "message": "Höhere KDF-Iterationen können helfen, dein Master-Passwort vor Brute-Force-Attacken durch einen Angreifer zu schützen." @@ -8996,7 +9087,7 @@ } }, "upgradePlans": { - "message": "Upgrade your plan to invite members and experience powerful security features." + "message": "Upgrade deinen Tarif, um Mitglieder einzuladen und leistungsstarke Sicherheitsfunktionen zu nutzen." }, "upgradeDiscount": { "message": "$AMOUNT$% sparen", @@ -9008,10 +9099,10 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Advanced capabilities for larger organizations" + "message": "Erweiterte Möglichkeiten für größere Organisationen" }, "teamsPlanUpgradeMessage": { - "message": "Resilient protection for growing teams" + "message": "Widerstandsfähiger Schutz für wachsende Teams" }, "teamsInviteMessage": { "message": "Unbegrenzte Mitglieder einladen" @@ -9023,7 +9114,7 @@ "message": "Gruppen und Benutzer aus einem Verzeichnis synchronisieren" }, "familyPlanUpgradeMessage": { - "message": "Secure your family logins" + "message": "Schütze deine Familien-Zugangsdaten" }, "accessToPremiumFeatures": { "message": "Zugriff auf Premium Funktionen" @@ -9073,21 +9164,21 @@ "current": { "message": "Aktuell" }, - "secretsManagerSubInfo": { - "message": "Dein Secrets Manager Abonnement wird sich auf Grundlage des ausgewählten Plan upgraden" + "secretsManagerSubscriptionInfo": { + "message": "Dein Secrets Manager Abonnement wird sich auf Grundlage des ausgewählten Tarifs upgraden" }, "bitwardenPasswordManager": { "message": "Bitwarden Passwortmanager" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Dein kostenloses einjähriges Passwortmanager-Abonnement wird auf den ausgewählten Tarif umgestellt. Dir wird nichts berechnet, bis der kostenlose Zeitraum abgelaufen ist." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Datei auf Gerät gespeichert. Greife darauf über die Downloads deines Geräts zu." }, "publicApi": { "message": "Öffentliche API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Zeichenanzahl anzeigen" diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 2fb7adf1ca3..5334208a07a 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Δυαδικό" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Συνδεδεμένο", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Αφαίρεση" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Προβολή Στοιχείου" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Αντιγραφή URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Εγώ" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Ρυθμίσεις" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Υπόδειξη Κωδικού" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Χρόνος Λήξης Vault" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Επιλέξτε πότε θα λήξει το vault και πραγματοποιήστε την επιλεγμένη ενέργεια." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Κλείδωμα", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Κάδος Απορριμάτων", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Διαγραφή Οποιασδήποτε Συλλογής" }, - "editAssignedCollections": { - "message": "Επεξεργασία Αντιστοιχισμένων Συλλογών" - }, - "deleteAssignedCollections": { - "message": "Διαγραφή Ανατεθειμένων Συλλογών" - }, "manageGroups": { "message": "Διαχείριση Ομάδων" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Προσαρμοσμένο Χρονικό Όριο Vault" - }, "vaultTimeoutToLarge": { "message": "Το χρονικό όριο του vault υπερβαίνει τον περιορισμό που ορίστηκε από τον οργανισμό σας." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Τελευταίος συγχρονισμός", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Περιστροφή κλειδιού" }, "scimApiKey": { "message": "Κλειδί API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Μεταφόρτωση αρχείου" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 86b3be94bef..02667bee6b9 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy licence number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organisation 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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organisation." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organisation. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9073,7 +9164,7 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 434f01df5a6..3b248c19996 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy licence number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will timeout and perform the selected action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage Groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organisation 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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organisation." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organisation. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9073,7 +9164,7 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 6ada709f4d8..454fd0cd278 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Bulea" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Ligita", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Forigi" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Vidigi Artikolon" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopii URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Mi" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Agordoj" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pasvorta Konsilo" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Tempolimo de trezorejo" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Elektu kiam via trezorejo eksvalidiĝos kaj plenumos la elektitan agon." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Ŝlosi", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Rubujo", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Administri Grupojn" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotaciigu Ŝlosilon" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Enigo estas deviga." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 2512c1e31bd..371adaa2e94 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Conectado", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Eliminar" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Ver elemento" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copiar URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Yo" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Configuración" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista de contraseña" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Tiempo de espera de la caja fuerte excedido" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Elije cuando se agotará el tiempo de espera de tu caja fuerte y se ejecutará la acción seleccionada." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papelera", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Eliminar cualquier colección" }, - "editAssignedCollections": { - "message": "Editar colecciones asignadas" - }, - "deleteAssignedCollections": { - "message": "Eliminar colecciones asignadas" - }, "manageGroups": { "message": "Administrar grupos" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Las políticas de su organización están afectando al tiempo de espera de tu caja fuerte. El tiempo de espera de tu caja fuerte máximo permitido es de $HOURS$ hora(s) y $MINUTES$ minuto(s). La acción de tiempo de espera de tu caja fuerte está establecida en $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Tiempo de espera personalizado para la caja fuerte" - }, "vaultTimeoutToLarge": { "message": "El tiempo de espera de tu caja fuerte excede la restricción establecida por tu organización." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Última sincronización", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Los patrocinios autohospedados están sincronizados." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Aprovisionamiento de SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Provisionar automáticamente a los usuarios y grupos con su proveedor de identidad preferido a través de la provisión SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Activar SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Configura tu proveedor de identidad preferido configurando la URL y la clave API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Esta clave API tiene acceso para administrar usuarios dentro de su organización. Debe mantenerse en secreto." }, "copyScimKey": { "message": "Copiar la clave de la API de SCIM al portapapeles", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotar la clave API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "¿Está seguro de que desea rotar la clave API SCIM? La clave actual no funcionará para ninguna integración existente.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Regenerar clave" }, "scimApiKey": { "message": "Clave API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copiar la URL del endpoint SCIM al portapapeles", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "La clave de API de SCIM se ha rotado correctamente", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Los ajustes de SCIM se han guardado correctamente", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Entrada requerida." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Subir archivo" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Formatos aceptados:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Elementos" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index f2c83d2b859..7944cc96f30 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Seotud", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Eemalda" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Kirje vaatamine" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Vaata $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopeeri URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Mina" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Seaded" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Parooli vihje" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Hoidla ajalõpp" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Vali aeg, peale mida sooritatakse allpool valitud tegevus." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lukusta", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prügikast", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Kustutada mistahes kollektsiooni" }, - "editAssignedCollections": { - "message": "Hallata määratud kollektsioone" - }, - "deleteAssignedCollections": { - "message": "Kustutada määratud kollektsioone" - }, "manageGroups": { "message": "Gruppide haldamine" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Viimane sünkroniseerimine", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Sisestus on nõutav." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Sinu Secrets Manageri tellimus uueneb vastavalt sinu valitud plaanile" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 7b42de91fc0..1b3ac9858a6 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolearra" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Konektatuta", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Ezabatu" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Bistaratu elementua" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopiatu URIa", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Ni" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Ezarpenak" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pasahitza gogoratzeko pista" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Kutxa gotorraren itxaronaldia" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Aukeratu kutxa gotorraren itxaronaldia eta egingo den ekintza." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Blokeatu", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Zakarrontzia", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Ezabatu edozein bilduma" }, - "editAssignedCollections": { - "message": "Editatu esleitutako bildumak" - }, - "deleteAssignedCollections": { - "message": "Ezabatu esleitutako bildumak" - }, "manageGroups": { "message": "Kudeatu taldeak" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Ezarri kutxa gotorreko itxaronaldia" - }, "vaultTimeoutToLarge": { "message": "Zure kutxa gotorreko itxaronaldiak, zure erakundeak ezarritako murrizpen bat gainditzen ditu." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Azken sinkronizazioa", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Ostatatze propioko babesleak sinkronizatuta." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM hornitzailea", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Eman automatikoki erabiltzaileei eta taldeei zure identitate-hornitzaile gogokoenarekin, SCIM hornitzaile bidez", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM gaituta", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Ezarri zure identitate-hornitzaile gogokoena URL eta SCIM API gakoak ezarriz", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "API gako honek zure erakundeko erabiltzaileak kudeatzeko aukera ematen du. Sekretupean gorde beharko litzake." }, "copyScimKey": { "message": "Kopiatu SCIM API gakoa zure arbelean", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Berritu SCIM API gakoa", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Ziur al zaude SCIM API gakoa berritu nahi duzula? Uneko gakoak ez du balioko lehendik ezarrita dauden integrazioetarako.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Berritu gakoa" }, "scimApiKey": { "message": "SCIM API gakoa", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopiatu SCIM endpoint URL-a zure arbelean", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL-a", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API gakoa ongi berritu da", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM ezarpenak behar bezala gorde dira", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Sarrera behar da." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index a6a31f45895..0471d3034ad 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "منطقی" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "پیوند شده", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "حذف" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "مشاهده مورد" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "کپی نشانی اینترنتی", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "من" }, @@ -960,6 +1026,18 @@ "settings": { "message": "تنظیمات" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "یادآور کلمه عبور" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "متوقف شدن گاو‌صندوق" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "انتخاب کنید که گاو‌صندوق شما چه زمانی عمل توقف زمانی گاوصندوق را انجام دهد." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "قفل", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "زباله‌ها", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "هر مجموعه ای را حذف کنید" }, - "editAssignedCollections": { - "message": "ویرایش مجموعه های اختصاص داده شده" - }, - "deleteAssignedCollections": { - "message": "حذف مجموعه های اختصاص داده شده" - }, "manageGroups": { "message": "مدیریت گروه‌ها" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "پایان زمان گاوصندوق سفارشی" - }, "vaultTimeoutToLarge": { "message": "مهلت زمانی شما بیش از محدودیت تعیین شده توسط سازمانتان است." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "آخرین همگام‌سازی", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "حمایت‌های مالی خود میزبان همگام‌سازی شد." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "تأمین SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "به‌طور خودکار کاربران و گروه‌ها را با ارائه‌دهنده هویت ترجیحی خود از طریق تأمین SCIM فراهم کنید", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM را فعال کنید", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "با پیکربندی نشانی اینترنتی و کلید SCIM API، ارائه دهنده هویت ترجیحی خود را تنظیم کنید", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "این کلید API به مدیریت کاربران در سازمان شما دسترسی دارد. که باید مخفی بماند." }, "copyScimKey": { "message": "کلید SCIM API را در کلیپ بورد خود کپی کنید", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "کلید SCIM API را بچرخانید", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "آیا مطمئنید که می‌خواهید کلید SCIM API را بچرخانید؟ کلید فعلی دیگر برای ادغام‌های موجود کار نخواهد کرد.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "چرخاندن توکن" }, "scimApiKey": { "message": "کلید SCIM API", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "نشانی اینترنتی نقطه پایانی SCIM را در کلیپ بورد خود کپی کنید", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "نشانی اینترنتی SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "کلید SCIM API با موفقیت چرخید", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "تنظیمات SCIM ذخیره شد", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "ورودی مورد نیاز است." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "بارگذاری فایل" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "فرمت های پذیرفته شده:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index f47ee7f89ae..913b92e6d40 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -144,7 +144,7 @@ "message": "Turvakoodi (CVC/CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Turvakoodi (CVC/CVV)" }, "identityName": { "message": "Henkilöllisyyden nimi" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Totuusarvo" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linkitetty", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Poista" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Näytä kohde" }, + "newItemHeader": { + "message": "Uusi $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Muokkaa: $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Näytä $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiointi onnistui" }, "copyValue": { "message": "Kopioi arvo", @@ -592,6 +619,45 @@ "message": "Kopioi URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Kopioi $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopioi verkkosivusto" + }, + "copyNotes": { + "message": "Kopioi merkinnät" + }, + "copyAddress": { + "message": "Kopioi osoite" + }, + "copyPhone": { + "message": "Kopioi puhelinnumero" + }, + "copyEmail": { + "message": "Kopioi sähköpostiosoite" + }, + "copyCompany": { + "message": "Kopioi yritys" + }, + "copySSN": { + "message": "Kopioi henkilötunnus" + }, + "copyPassportNumber": { + "message": "Kopioi passin numero" + }, + "copyLicenseNumber": { + "message": "Kopioi ajokortin numero" + }, + "copyName": { + "message": "Kopioi nimi" + }, "me": { "message": "Minä" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Asetukset" }, + "accountEmail": { + "message": "Tilin sähköpostiosoite" + }, + "requestHint": { + "message": "Pyydä vihje" + }, + "requestPasswordHint": { + "message": "Pyydä salasanan vihje" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" + }, "passwordHint": { "message": "Salasanavihje" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Holvin aikakatkaisu" }, + "vaultTimeout1": { + "message": "Aikakatkaisu" + }, "vaultTimeoutDesc": { "message": "Määritä milloin holvin aikakatkaisutoiminto suoritetaan." }, @@ -4048,7 +4129,7 @@ "message": "Valittu" }, "recommended": { - "message": "Recommended" + "message": "Suositeltu" }, "ownership": { "message": "Omistus" @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lukitse", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Roskakori", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Poista kokoelmia" }, - "editAssignedCollections": { - "message": "Muokkaa kokoelmamäärityksiä" - }, - "deleteAssignedCollections": { - "message": "Poista kokoelmamäärityksiä" - }, "manageGroups": { "message": "Ryhmien hallinta" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Enintään $HOURS$ tunti(a) ja $MINUTES$ minuutti(a).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) $MINUTES$ minuutti(a). Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Mukautettu holvin aikakatkaisu" - }, "vaultTimeoutToLarge": { "message": "Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Viimeisin synkronointi", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Itse ylläpidetyt sponsoroinnit on synkronoitu." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM-provisiointi", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Provisioi käyttäjät ja ryhmät automaattisesti haluamasi identiteettitoimittajan kanssa SCIM-provisioinnilla", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Ota SCIM käyttöön", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Määritä haluamasi identiteettitoimittaja määrittämällä sen URL-osoite ja SCIM API -avain", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Tällä API-avaimella on oikeus hallita organisaation käyttäjiä. Se tulee pitää salassa." }, "copyScimKey": { "message": "Kopioi SCIM API-avain leikepöydälle", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Uudista SCIM API-avain", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Haluatko varmasti uudistaa SCIM API-avaimen? Nykyinen avain ei enää toimi olemassa oleville integraatioille.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Uudista avain" }, "scimApiKey": { "message": "SCIM API-avain", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopioi SCIM-päätteen URL-osoite leikepöydälle", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API-avain uudistettiin", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM-asetukset tallennettiin", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Syöte vaaditaan." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Valitse tuotava tiedosto" }, + "upload": { + "message": "Lähetä" + }, "acceptedFormats": { "message": "Hyväksytyt muodot:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Lisää kenttä" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Kohteet" }, @@ -8772,25 +8863,25 @@ "message": "Tarkastele organisaation jäsenten käyttöoikeuksia ryhmiin, kokoelmiin ja kokoelmien kohteisiin. CSV-vienti tuottaa yksityiskohtaisen jäsenkohtaisen erittelyn, joka sisältää kokoelmaoikeudet ja tilimääritykset." }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(Ei kokoelmaa)" }, "memberAccessReportNoCollectionPermission": { "message": "(No Collection Permission)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(Ei ryhmää)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "Käytössä" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Ei käytössä" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "Käytössä" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Ei käytössä" }, "higherKDFIterations": { "message": "Korkeampi KDF-toistojen määrä vahvistaa pääsalasanasi suojausta väsytyshyökkäyksien varalta." @@ -9023,7 +9114,7 @@ "message": "Ryhmien ja käyttäjien synkronointi hakemistosta" }, "familyPlanUpgradeMessage": { - "message": "Secure your family logins" + "message": "Suojaa perheesi kirjautumistiedot" }, "accessToPremiumFeatures": { "message": "Premium-ominaisuuksien käyttöoikeus" @@ -9073,8 +9164,8 @@ "current": { "message": "Nykyinen" }, - "secretsManagerSubInfo": { - "message": "Salaisuushallinta-tilauksesi päivittyy valittua tilausta vastaavaksi" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Salasanahallinta" @@ -9083,17 +9174,17 @@ "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Tiedosto tallennettiin laitteelle. Hallitse sitä laitteesi latauksista." }, "publicApi": { "message": "Julkinen API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Näytä merkkimäärä" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Piilota merkkimäärä" }, "editAccess": { "message": "Muokkaa käyttöoikeuksia" diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index d174e6694a9..ba5276be623 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Naka-link", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Tanggalin" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Tingnan ang item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopyahin ang URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Ako" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Mga Setting" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Palatandaan ng password" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Piliin kung kailan gagawin ng iyong vault ang vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "I-lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Basurahan", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Tanggalin ang anumang koleksyon" }, - "editAssignedCollections": { - "message": "I-edit ang mga nakatalagang koleksyon" - }, - "deleteAssignedCollections": { - "message": "Tanggalin ang mga nakatalagang koleksyon" - }, "manageGroups": { "message": "Pamahalaan ang mga grupo" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Pasadyang timeout ng vault" - }, "vaultTimeoutToLarge": { "message": "Ang iyong vault timeout ay lumampas sa paghihigpit na itinakda ng iyong samahan." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Huling sinkronisasyon:", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Ang mga self host na sponsorship ay naka sync." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Awtomatikong pagbibigay ng mga user at grupo sa iyong ginustong identity provider sa pamamagitan ng SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Paganahin ang SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "I set up ang iyong ginustong tagapagbigay ng pagkakakilanlan sa pamamagitan ng pag configure ng URL at SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Ang API key na ito ay may access upang pamahalaan ang mga gumagamit sa loob ng iyong samahan. Dapat itong ilihim." }, "copyScimKey": { "message": "Kopyahin ang SCIM API key sa iyong clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Iikot ang SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Sigurado ka bang gusto mong i-rotate ang SCIM API Key? Ang kasalukuyang susi ay hindi na gagana para sa anumang umiiral na mga pagsasama.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "I-ikot ang susi" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopyahin ang SCIM endpoint URL sa iyong clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key matagumpay na inikot", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Nai-save ang mga setting ng SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Kailangan ang input." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Mag-upload ng File" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Tinatanggap na Mga Format:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 9e422b429e9..39347c3b1de 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booléen" }, + "cfTypeCheckbox": { + "message": "Case à cocher" + }, "cfTypeLinked": { "message": "Lié", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Type de champ" + }, + "fieldLabel": { + "message": "Étiquette du champ" + }, "remove": { "message": "Supprimer" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Afficher l'élément" }, + "newItemHeader": { + "message": "Nouveau $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Modifier $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Voir $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copier l'URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copier $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copier le site web" + }, + "copyNotes": { + "message": "Copier les notes" + }, + "copyAddress": { + "message": "Copier l'adresse" + }, + "copyPhone": { + "message": "Copier le téléphone" + }, + "copyEmail": { + "message": "Copier le courriel" + }, + "copyCompany": { + "message": "Copier l'entreprise" + }, + "copySSN": { + "message": "Copier le numéro de Sécurité Sociale" + }, + "copyPassportNumber": { + "message": "Copier le numéro de passeport" + }, + "copyLicenseNumber": { + "message": "Copier le numéro de permis de conduire" + }, + "copyName": { + "message": "Copier le nom" + }, "me": { "message": "Moi" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Paramètres" }, + "accountEmail": { + "message": "Courriel du compte" + }, + "requestHint": { + "message": "Demander l'indice" + }, + "requestPasswordHint": { + "message": "Demander l'indice du mot de passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Entrez l'adresse courriel de votre compte et l'indice de votre mot de passe vous sera envoyé" + }, "passwordHint": { "message": "Indice de mot de passe" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Délai d'expiration du coffre" }, + "vaultTimeout1": { + "message": "Délai d'expiration" + }, "vaultTimeoutDesc": { "message": "Choisissez quand votre coffre entreprendra l'action après le délai d'expiration du coffre." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Verrouiller", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Corbeille", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Supprimer n'importe quelle collection" }, - "editAssignedCollections": { - "message": "Modifier les collection assignées" - }, - "deleteAssignedCollections": { - "message": "Supprimer les collections assignées" - }, "manageGroups": { "message": "Gérer les groupes" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Les politiques de sécurité de votre organisation affectent le délai d'expiration de votre coffre. Le délai autorisé d'expiration du coffre est de $HOURS$ heure(s) et $MINUTES$ minute(s) maximum. L'action après délai d'expiration de votre coffre est fixée à $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Délai d'expiration du coffre personnalisé" - }, "vaultTimeoutToLarge": { "message": "Le délai d'expiration de votre coffre-fort dépasse les restrictions définies par votre organisation." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Dernière Synchronisation", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Des parrainages auto-hébergés ont été synchronisés." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Provisionnement SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Fournit automatiquement aux utilisateurs et aux groupes votre fournisseur d'identité préféré via l'approvisionnement SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Activer SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Configurez votre fournisseur d'identité préféré en configurant l'URL et la clé API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Cette clé API possède l'accès pour gérer les utilisateurs au sein de votre organisation. Elle devrait être tenue secrète." }, "copyScimKey": { "message": "Copiez la clé API SCIM dans votre presse-papiers", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Régénérer la clé API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Êtes-vous sûr de vouloir régénérer la clé API SCIM ? La clé actuelle ne fonctionnera plus pour aucune intégration existante.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Régénérer la clé" }, "scimApiKey": { "message": "Clé API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copiez l'URL du point de terminaison SCIM dans votre presse-papiers", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Clé API SCIM régénérée avec succès", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Les paramètres SCIM ont été enregistrés avec succès", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Entrée requise." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Chargement du fichier" }, + "upload": { + "message": "Téléverser" + }, "acceptedFormats": { "message": "Formats acceptés :" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Ajouter un champ" }, + "editField": { + "message": "Modifier le champ" + }, "items": { "message": "Éléments" }, @@ -9073,7 +9164,7 @@ "current": { "message": "Actuel" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Votre abonnement au Secrets Manager sera mis à niveau selon le plan sélectionné" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "API publique", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Afficher le nombre de caractères" diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 25bed9fd572..1285661d94d 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Ver elemento" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 28b3cbf0a1a..d873b52c217 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "אמת או שקר" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "מקושר", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "הסר" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "הצג פריט" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "העתק שורת כתובת", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "הגדרות" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "רמז לסיסמה" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "משך זמן מירבי עבור חיבור לכספת" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "בחר כמה זמן יעבור כדי שהכספת תסגר לאחר חוסר פעילות ותבצע את הפעולה שנבחרה." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "נעילה", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "סל המחזור", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 3eba1125258..c4fb10fa487 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "बूलियन" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "हटाएं" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "URI को कॉपी करें", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "मैं" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 186999d1fed..881984f7c34 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -144,7 +144,7 @@ "message": "Kontrolni broj" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Kontrolni broj" }, "identityName": { "message": "Ime identiteta" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Povezano", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Ukloni" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Prikaz stavke" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Pogledaj $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiranje uspješno" }, "copyValue": { "message": "Kopiraj vrijednost", @@ -592,6 +619,45 @@ "message": "Kopiraj URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Kopiraj $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiraj web stranicu" + }, + "copyNotes": { + "message": "Kopiraj bilješke" + }, + "copyAddress": { + "message": "Kopiraj adresu" + }, + "copyPhone": { + "message": "Kopiraj telefon" + }, + "copyEmail": { + "message": "Kopiraj e-poštu" + }, + "copyCompany": { + "message": "Kopiraj tvrtku" + }, + "copySSN": { + "message": "Kopiraj OIB" + }, + "copyPassportNumber": { + "message": "Kopiraj broj putovnice" + }, + "copyLicenseNumber": { + "message": "Kopiraj broj osobne" + }, + "copyName": { + "message": "Kopiraj ime" + }, "me": { "message": "Ja" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Postavke" }, + "accountEmail": { + "message": "e-pošta računa" + }, + "requestHint": { + "message": "Zatraži podsjetnik" + }, + "requestPasswordHint": { + "message": "Zatraži podsjetnik lozinke" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Unesi svoju adresu e-pošte računa i poslat ćemo ti tvoj podsjetnik" + }, "passwordHint": { "message": "Podsjetnik za lozinku" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Ažuriranje ključa za šifriranje ne može se nastaviti" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Prilikom ažuriranja tvojeg ključa za šifriranje, mape se nisu mogle dešifrirati. Za nastavak ažuriranja, tvoje mape moraju biti izbrisane. Nijedna stavka iz trezora neće biti izbrisana ako nastaviš." }, "keyUpdated": { "message": "Ključ ažuriran" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Istek trezora" }, + "vaultTimeout1": { + "message": "Vrijeme isteka" + }, "vaultTimeoutDesc": { "message": "Odaberi kada će isteći trezor i koja će se radnja izvršiti." }, @@ -4048,7 +4129,7 @@ "message": "Odabrano" }, "recommended": { - "message": "Recommended" + "message": "Preporučeno" }, "ownership": { "message": "Vlasništvo" @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Zaključaj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smeće", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Obriši zbirku" }, - "editAssignedCollections": { - "message": "Uredi dodijeljene zbirke" - }, - "deleteAssignedCollections": { - "message": "Obriši dodijeljene zbirke" - }, "manageGroups": { "message": "Upravljanje grupama" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Najviše: $HOURS$:$MINUTES$", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je $HOURS$:$MINUTES$ h. Tvoja radnja nakon isteka trezora je: $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Osobni istek trezora" - }, "vaultTimeoutToLarge": { "message": "Vrijeme isteka premašuje ograničenje koje je postavila tvoja organizacija." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Zadnja sinkronizacija", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Sinkronizirana sponzorstva na vlastitom poslužitelju." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM docijeljivanje", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatski korisnicima i grupama dodijeli željenog pružatelja identiteta putem SCIM dodjeljivanja", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Uključi SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Postavite željenog pružatelja identiteta konfiguriranjem URL-a i SCIM API ključa", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Ovaj API ključ ima pristup upravljanju korisnicima unutar tvoje organizacije. To treba držati u tajnosti." }, "copyScimKey": { "message": "Kopiraj SCIM API ključ u svoj međuspremnik", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotiraj SCIM API ključ", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Sigurno želiš rotirati SCIM API ključ? Postojeći ključ više neće vrijediti u svim postojećim integracijama.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotiraj ključ" }, "scimApiKey": { "message": "SCIM API ključ", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopiraj URL SCIM krajnje točke u međuspremnik", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API ključ rotiran", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM postavke spremljene", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Potreban je unos." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Prenesi datoteku" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Prihvaćeni formati:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Dodaj polje" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Stavke" }, @@ -8772,25 +8863,25 @@ "message": "Provjeri pristup članova organizacije u grupama, zbirkama i stavkama zbirke. CSV izvoz pruža detaljnu raščlambu po članu, uključujući informacije o dozvolama za prikupljanje i konfiguracijama računa." }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(nema zbirke)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(nema dozvole za zbirke)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(nema grupe)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "Uklj." }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Isklj." }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "Uklj." }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Isklj." }, "higherKDFIterations": { "message": "Veće KDF iteracije mogu pomoći u zaštiti tvoje glavne lozinke od napadača." @@ -8996,7 +9087,7 @@ } }, "upgradePlans": { - "message": "Upgrade your plan to invite members and experience powerful security features." + "message": "Za pozivanje članova nadogradi svoj plan i iskusi moćne sigurnosne značajke." }, "upgradeDiscount": { "message": "Uštedi $AMOUNT$ %", @@ -9008,10 +9099,10 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Advanced capabilities for larger organizations" + "message": "Napredne mogućnosti za veće tvrtke" }, "teamsPlanUpgradeMessage": { - "message": "Resilient protection for growing teams" + "message": "Otporna zaštita za rastuće timove" }, "teamsInviteMessage": { "message": "Pozovi neograničen broj članova" @@ -9023,7 +9114,7 @@ "message": "Sinkroniziraj grupe i korisnike iz imenika" }, "familyPlanUpgradeMessage": { - "message": "Secure your family logins" + "message": "Osiguraj obiteljske prijave svoje obitelji" }, "accessToPremiumFeatures": { "message": "Pristup Premium značajkama" @@ -9073,27 +9164,27 @@ "current": { "message": "Trenutno" }, - "secretsManagerSubInfo": { - "message": "Tvoja pretplata na Secrets Manager će se nadograditi na temelju odabranog plana" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden upravitelj lozinki" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Tvoja besplatna jednogodišnja pretplata na Password Manager nadogradit će se na odabrani plan. Neće ti ništa biti naplaćeno dok besplatno razdoblje ne završi." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Datoteka spremljena na uređaj. Upravljaj u preuzimanjima svog uređaja." }, "publicApi": { "message": "Javni API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Prikaži broj znakova" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Sakrij broj znakova" }, "editAccess": { "message": "Uredi pristup" diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 4e66cbc710c..4ae7cae7a9b 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -144,7 +144,7 @@ "message": "Biztonsági kód (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Biztonsági kód / CVV" }, "identityName": { "message": "Személyazonosság megnevezés" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Logikai" }, + "cfTypeCheckbox": { + "message": "Jelölődoboz" + }, "cfTypeLinked": { "message": "Csatolt", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Mezőtípus" + }, + "fieldLabel": { + "message": "Mezőfelirat" + }, "remove": { "message": "Eltávolítás" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Elem megtekintése" }, + "newItemHeader": { + "message": "Új $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ szerkesztése", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "$ITEMTYPE$ megtekintése", "placeholders": { @@ -592,6 +619,45 @@ "message": "URI másolása", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "$FIELD$ másolása", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Webhely másolása" + }, + "copyNotes": { + "message": "Jegyzet másolása" + }, + "copyAddress": { + "message": "Postai cím másolása" + }, + "copyPhone": { + "message": "Telefonszám másolása" + }, + "copyEmail": { + "message": "Email cím másolása" + }, + "copyCompany": { + "message": "Cég másolása" + }, + "copySSN": { + "message": "Társadalombiztosítási szám másolása" + }, + "copyPassportNumber": { + "message": "Útlevélszám másolása" + }, + "copyLicenseNumber": { + "message": "Vezetői engedély szám másolása" + }, + "copyName": { + "message": "Név másolása" + }, "me": { "message": "Én" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Beállítások" }, + "accountEmail": { + "message": "Fiók email cím" + }, + "requestHint": { + "message": "Tipp kérése" + }, + "requestPasswordHint": { + "message": "Jelszó emlékeztető kérése" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Adjuk meg fiók email címét és elküldésre kerül a jelszóra vonatkozó tipp." + }, "passwordHint": { "message": "Jelszó emlékeztető" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Széf időkifutás" }, + "vaultTimeout1": { + "message": "Időtúllépés" + }, "vaultTimeoutDesc": { "message": "Válasszuk ki, hogy a széfnél mikor legyen időkifutás és a kiválasztott művelet végrehajtása." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lezárás", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lomtár", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Bármely gyűjtemény törlése" }, - "editAssignedCollections": { - "message": "Hozzárendelt gyűjtemények szerkesztése" - }, - "deleteAssignedCollections": { - "message": "Hozzárendelt gyűjtemények törlése" - }, "manageGroups": { "message": "Csoportok kezelése" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ óra és $MINUTES$ perc maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "A szervezeti házirendek hatással vannak a széf időkorlátjára. A széf időkorlátja legfeljebb $HOURS$ óra és $MINUTES$ perc lehet. A széf időkifutási művelete $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Egyedi széf időkifutás" - }, "vaultTimeoutToLarge": { "message": "A széf időkorlátja túllépi a szervezet által beállított korlátozást." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Utolsó szinkronizálás", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "A saját üzemeltetésű szponzorálások szinkronizálásra kerültek." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM ellátás", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "A felhasználók és csoportok automatikusan biztosítása a kívánt identitás szolgáltatóval a SCIM szolgáltatáson keresztül.", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM engedélyezése", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Állítsuk be a kívánt azonosító szolgáltatót a webcím és a SCIM API kulcs konfigurálásával.", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Ez az API kulcs hozzáféréssel rendelkezik a szervezeten belüli felhasználók kezeléséhez. Célszerű titokban tartani." }, "copyScimKey": { "message": "A SCIM API kulcs másolása a vágólapra", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "A SCIM API kulcs forgatása", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Biztosan forgatni akarjuk a SCIM API kulcsot? A jelenlegi kulcs már nem működik egyik meglévő integrációhoz sem.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Kulcs forgatása" }, "scimApiKey": { "message": "SCIM API kulcs", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "A SCIM cégpont webcím másolása a vágólapra", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM webcím", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "A SCIM API kulcs sikeresen forgatásra került.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "A SCIM beállítások sikeresen mentésre kerültek.", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Az adatbevitel kötelező." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Fájlfeltöltés" }, + "upload": { + "message": "Feltöltés" + }, "acceptedFormats": { "message": "Elfogadott formátumok:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Mező hozzáadása" }, + "editField": { + "message": "Mező szerkesztése" + }, "items": { "message": "Elemek" }, @@ -9073,7 +9164,7 @@ "current": { "message": "Jelenlegi" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "A Titkos kód kezelő előfizetés a kiválasztott csomag alapján frissül." }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Nyilvános API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Karakterszámláló megjelenítése" diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 165d513febb..eb2d40161a0 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Terhubung", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Hapus" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Lihat Item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Salin URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Saya" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Setelan" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Petunjuk Kata Sandi" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Batas Waktu Brankas" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Pilih batas waktu untuk brankas Anda mengambil tindakan yang dipilih." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Mengunci", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Sampah", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Hapus Koleksi" }, - "editAssignedCollections": { - "message": "Edit koleksi yang ditetapkan" - }, - "deleteAssignedCollections": { - "message": "Hapus koleksi yang ditetapkan" - }, "manageGroups": { "message": "Kelola Grup" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API Key berhasil dirotasi", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Pengaturan SCIM berhasil disimpan", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Data input diperlukan." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index e85779431a7..8f8c396913a 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -144,7 +144,7 @@ "message": "Codice di sicurezza (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Codice di sicurezza (CVV)" }, "identityName": { "message": "Nome identità" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Collegato", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Rimuovi" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Visualizza elemento" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Visualizza $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copia URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Io" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Impostazioni" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Suggerimento per la password" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Non è possibile procedere con l'aggiornamento della chiave di cifratura" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Quando si aggiorna la chiave di cifratura, le cartelle non possono essere decifrate. Per continuare con l'aggiornamento, le cartelle devono essere eliminate. Nessun elemento della cassaforte verrà eliminato se si procede." }, "keyUpdated": { "message": "Chiave aggiornata" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Timeout cassaforte" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Scegli quando la tua cassaforte eseguirà l'azione di timeout." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Blocca", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Cestino", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Elimina tutte le raccolte" }, - "editAssignedCollections": { - "message": "Modifica le raccolte assegnate" - }, - "deleteAssignedCollections": { - "message": "Elimina raccolte assegnate" - }, "manageGroups": { "message": "Gestisci i gruppi" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Le politiche della tua organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti. La tua azione di timeout della cassaforte è impostata su $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Timeout della cassaforte personalizzato" - }, "vaultTimeoutToLarge": { "message": "Il timeout della tua cassaforte supera le restrizioni impostate dalla tua organizzazione." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Ultima sincronizzazione", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Sponsorizzazione self-hosted sincronizzata." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Approvvigionamento SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Approvvigiona utenti e gruppi automaticamente con il tuo fornitore di identità preferito tramite l'approvvigionamento SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Abilita SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Imposta il tuo fornitore di identità preferito configurando l'URL e la chiave API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Questa chiave API ha accesso alla gestione gli utenti all'interno della tua organizzazione. Deve essere tenuta segreta." }, "copyScimKey": { "message": "Copia la chiave API SCIM negli appunti", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Ruota la chiave API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Sei sicuro di voler ruotare la chiave API SCIM? La chiave corrente non funzionerà più per nessuna integrazione esistente.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Ruota chiave" }, "scimApiKey": { "message": "Chiave API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copia l'URL dell'endpoint SCIM negli appunti", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Chiave API SCIM ruotata", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Impostazioni di SCIM salvate", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input obbligatorio." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Carica file" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Formati accettati:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Aggiungi campo" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Elementi" }, @@ -9073,21 +9164,21 @@ "current": { "message": "Attuale" }, - "secretsManagerSubInfo": { - "message": "Il tuo abbonamento a Secrets Manager si aggiornerà a seconda del piano selezionato" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Il tuo abbonamento complementare a Password Manager di un anno verrà aggiornato al piano selezionato. Non ti verrà addebitato nessun costo fino a quando il periodo gratuito non sarà terminato." }, "fileSavedToDevice": { "message": "File salvato sul dispositivo. Gestisci dai download del dispositivo." }, "publicApi": { "message": "API pubblica", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index a7f51d31363..109a48f53c1 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "真偽値" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "リンク済", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "削除" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "アイテムの表示" }, + "newItemHeader": { + "message": "$TYPE$ を新規作成", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ を編集", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "$ITEMTYPE$ を表示", "placeholders": { @@ -592,6 +619,45 @@ "message": "URI のコピー", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "$FIELD$ をコピー", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "ウェブサイトをコピー" + }, + "copyNotes": { + "message": "メモをコピー" + }, + "copyAddress": { + "message": "住所をコピー" + }, + "copyPhone": { + "message": "電話番号をコピー" + }, + "copyEmail": { + "message": "メールアドレスをコピー" + }, + "copyCompany": { + "message": "会社名をコピー" + }, + "copySSN": { + "message": "社会保障番号をコピー" + }, + "copyPassportNumber": { + "message": "パスポート番号をコピー" + }, + "copyLicenseNumber": { + "message": "免許証番号をコピー" + }, + "copyName": { + "message": "名前をコピー" + }, "me": { "message": "自分" }, @@ -960,6 +1026,18 @@ "settings": { "message": "設定" }, + "accountEmail": { + "message": "アカウントのメールアドレス" + }, + "requestHint": { + "message": "ヒントを要求" + }, + "requestPasswordHint": { + "message": "パスワードのヒントを要求する" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "アカウントのメールアドレスを入力すると、パスワードのヒントが送信されます" + }, "passwordHint": { "message": "パスワードのヒント" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "保管庫のタイムアウト" }, + "vaultTimeout1": { + "message": "タイムアウト" + }, "vaultTimeoutDesc": { "message": "保管庫がタイムアウトし、選択したアクションを実行するタイミングを選択します。" }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "ロック", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ごみ箱", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "任意のコレクションを削除" }, - "editAssignedCollections": { - "message": "割り当てられたコレクションを編集" - }, - "deleteAssignedCollections": { - "message": "割り当てられたコレクションを削除" - }, "manageGroups": { "message": "グループを管理" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ 時間と $MINUTES$ 分が最大です。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "組織のポリシーがデータ保管庫のタイムアウトに影響しています。保管庫のタイムアウトの最大許容値は、$HOURS$時間$MINUTES$分です。保管庫タイムアウト時のアクションは、$ACTION$に設定されています。", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "個別の保管庫のタイムアウト" - }, "vaultTimeoutToLarge": { "message": "保管庫のタイムアウトが組織によって設定された制限を超えています。" }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "前回の同期", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "セルフホストのスポンサーシップが同期されました。" @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM プロビジョニング", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "SCIM プロビジョニングにより、ユーザーとグループを希望する ID プロバイダーで自動的にプロビジョニングします。", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM を有効にする", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "URL と SCIM API キーを設定して、ご希望の ID プロバイダーを設定します", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "この API キーは、組織内のユーザーを管理するためのアクセス権を持っています。慎重に取り扱ってください。" }, "copyScimKey": { "message": "SCIM API キーをクリップボードにコピー", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "SCIM API キーをローテーション", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "SCIM API キーをローテーションさせてもよろしいですか?現在のキーでは動作しなくなります。", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "キーをローテーション" }, "scimApiKey": { "message": "SCIM API キー", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "SCIM エンドポイント URL をクリップボードにコピー", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API キーのローテーションに成功しました", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM 設定を保存しました。", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "入力が必要です。" @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "ファイルのアップロード" }, + "upload": { + "message": "アップロード" + }, "acceptedFormats": { "message": "利用できる形式:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "フィールドを追加" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "アイテム" }, @@ -9073,7 +9164,7 @@ "current": { "message": "現在" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "シークレットマネージャーのサブスクリプションは、選択されたプランを基準にアップグレードされます" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "公開 API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "文字数を表示" diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 29346aa946b..fc5387b8293 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "ბულის ცვლადი" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "დაკავშირებული", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "ამოღება" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "ნახვა საგნის" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "ასლირება URI-ის", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "მე" }, @@ -960,6 +1026,18 @@ "settings": { "message": "პარამეტრები" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "პაროლის მინიშნება" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index d0be45fdc2c..c47975bdfea 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 07d77b4a4a3..018c3b09189 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "ಬೂಲಿಯನ್" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "ಸಂಪರ್ಕಿತ", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "ತೆಗೆ" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "ಐಟಂ ವೀಕ್ಷಿಸಿ" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "ಯು ಆರ್ ಐ ಅನ್ನು ನಕಲಿಸಿ", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "ನನ್ನ" }, @@ -960,6 +1026,18 @@ "settings": { "message": "ಸೆಟ್ಟಿಂಗ್‍ಗಳು" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "ವಾಲ್ಟ್ ಕಾಲಾವಧಿ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "ನಿಮ್ಮ ಕಮಾನು ಸಮಯ ಮೀರಲಿ ಮತ್ತು ಆಯ್ದ ಕ್ರಮವನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಆರಿಸಿಕೊಳ್ಳಿ." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "ಲಾಕ್‌", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ಅನುಪಯುಕ್ತ", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "ಗುಂಪುಗಳನ್ನು ನಿರ್ವಹಿಸಿ" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 459d16b7618..69ae834165c 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "참 / 거짓" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "연결됨", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "제거" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "항목 보기" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "URI 복사", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "나" }, @@ -960,6 +1026,18 @@ "settings": { "message": "설정" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "비밀번호 힌트" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "보관함 시간 제한" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "보관함이 언제까지 시간을 제한하고 선택된 행동을 수행하지 선택해주세요." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "잠금", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "휴지통", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "아무 컬렉션 삭제" }, - "editAssignedCollections": { - "message": "할당된 컬렉션 수정" - }, - "deleteAssignedCollections": { - "message": "할당된 컬렉션 삭제" - }, "manageGroups": { "message": "그룹 관리" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "사용자 지정 보관함 시간 제한" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "파일 업로드" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 0d97c52f6e9..6ca929d460b 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -46,7 +46,7 @@ "message": "Kartes īpašnieka vārds" }, "loginCredentials": { - "message": "Login credentials" + "message": "Pieteikšanās dati" }, "personalDetails": { "message": "Personiskā informācija" @@ -73,7 +73,7 @@ "message": "Vienuma vēsture" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Autentificētāja atslēga" }, "autofillOptions": { "message": "Automātiskās aizpildes iespējas" @@ -237,13 +237,13 @@ "message": "Autentificētāja atslēga (TOTP)" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "Padarīt divpakāpju apliecināšanu plūdenu" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden var glabāt un aizpildīt divpakāpju apliecināšanas kodus. Atslēga jāievieto starpliktuvē un jāielīmē šajā laukā." }, "totpHelperWithCapture": { - "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + "message": "Bitwarden var glabāt un aizpildīt divpakāpju apliecināšanas kodus. Jāizvēlas kameras ikona, lai veiktu tīmekļvietnes autentificētāja kvadrātkoda ekrānuzņēmumu, vai jāievieto starpliktuvē atslēga un jāielīmē šajā laukā." }, "learnMoreAboutAuthenticators": { "message": "Uzzināt vairāk par autentificētājiem" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Patiesuma vērtība" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Saistīts", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Noņemt" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Skatīt vienumu" }, + "newItemHeader": { + "message": "Jauns/a $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Labot $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Apskatīt $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Ievietot URI starpliktuvē", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Ievietot $FIELD$ starpliktuvē", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Ievietot tīmekļvietni starpliktuvē" + }, + "copyNotes": { + "message": "Ievietot piezīmes starpliktuvē" + }, + "copyAddress": { + "message": "Ievietot adresi starpliktuvē" + }, + "copyPhone": { + "message": "Ievietot tālruņa numuru starpliktuvē" + }, + "copyEmail": { + "message": "Ievietot e-pasta adresi starpliktuvē" + }, + "copyCompany": { + "message": "Ievietot uzņēmumu starpliktuvē" + }, + "copySSN": { + "message": "Ievietot sociālās nodrošināšanas numuru starpliktuvē" + }, + "copyPassportNumber": { + "message": "Ievietot pases numuru starpliktuvē" + }, + "copyLicenseNumber": { + "message": "Ievietot licences numuru starpliktuvē" + }, + "copyName": { + "message": "Ievietot nosaukumu starpliktuvē" + }, "me": { "message": "Es" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Iestatījumi" }, + "accountEmail": { + "message": "Konta e-pasta adrese" + }, + "requestHint": { + "message": "Pieprasīt norādi" + }, + "requestPasswordHint": { + "message": "Pieprasīt paroles norādi" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosūtīta" + }, "passwordHint": { "message": "Paroles norāde" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Glabātavas noildze" }, + "vaultTimeout1": { + "message": "Noildze" + }, "vaultTimeoutDesc": { "message": "Izvēlēties, kad glabātavai iestāsies noildze un tiks izpildīta atlasītā darbība." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Aizslēgt", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Atkritne", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Izdzēst jebkuru kolekciju" }, - "editAssignedCollections": { - "message": "Labot norīkotos krājumus" - }, - "deleteAssignedCollections": { - "message": "Izdzēst norīkotos krājumus" - }, "manageGroups": { "message": "Pārvaldīt kopas" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Ne vairāk kā $HOURS$ stunda(s) un $MINUTES$ minūte(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Apvienības nosacījumi ietekmē glabātavas noildzi. Lielākā atļautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minūte(s). Kā glabātavas noildzes darbība ir uzstādīta $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Pielāgota glabātavas noildze" - }, "vaultTimeoutToLarge": { "message": "Glabātavas noildze pārsniedz apvienības uzstādītos ierobežojumus." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Pēdējā sinhronizācija", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Pašizvietotās pabalstītājdarbības vienādotas." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM nodrošināšana", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automātiski nodrošina lietotājus un kopas ar vēlamo identitātes nodrošinātāju, izmantojot SCIM nodrošināšanu", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Iespējot SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Uzstādīt vēlamo identitātes nodrošinātāju ar URL un SCIM API atslēgas iestatīšanu", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Šai API atslēgai ir piekļuve pāŗvaldīt apvienības lietotājus. Tā ir jātur noslēpumā." }, "copyScimKey": { "message": "Ievietot SCIM API atslēgu starpliktuvē", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Nomainīt SCIM API atslēgu", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Vai tiešām nomainīt SCIM API atslēgu? Pašreizējā atslēga vairs nedarbosies nekur, kur tā ir norādīta.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Mainīt atslēgu" }, "scimApiKey": { "message": "SCIM API atslēga", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Ievietot SCIM galapunkta URL starpliktuvē", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API atslēga ir veiksmīgi nomainīta", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM iestatījumi ir veiksmīgi saglabāti", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Jāievada vērtība." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Datņu augšupielāde" }, + "upload": { + "message": "Augšupielādēt" + }, "acceptedFormats": { "message": "Pieļaujamie veidi:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Pievienot lauku" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Vienumi" }, @@ -9073,7 +9164,7 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Noslēpumu pārvaldnieka abonements tiks uzlabots atbilstoši izvēlētajam plānam" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Publiskais API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Rādīt rakstzīmju skaitu" diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 5e0efafcedf..581c7c90f5e 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "ബൂളിയൻ" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "നീക്കംചെയ്യുക" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "ഇനം കാണുക" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "URL പകർത്തുക", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "ക്രമീകരണങ്ങള്‍" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "പാസ്‌വേഡ് സൂചനാ" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "വാൾട് ടൈംഔട്ട്" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "തങ്ങളുടെ വാൾട് എപ്പോൾ ടൈംഔട്ട് ആകും എന്ന് നിശ്ചയിക്കുക. തിരഞ്ഞെടുത്ത പ്രവർത്തനം നടത്തുക." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "പൂട്ടുക", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ട്രാഷ്", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "ഗ്രൂപ്പുകൾ നിയന്ത്രിക്കുക" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index d0be45fdc2c..c47975bdfea 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index d0be45fdc2c..c47975bdfea 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 1f1be7b04ed..98df867e6bf 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolsk verdi" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Tilknyttet", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Fjern" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Vis elementet" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopier URIen", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Meg" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Innstillinger" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Passordhint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Pause for hvelvet" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Velg når hvelvet ditt skal ta pause og utføre den valgte handlingen." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Slett enhver samling" }, - "editAssignedCollections": { - "message": "Rediger tildelte samlinger" - }, - "deleteAssignedCollections": { - "message": "Slett tildelte samlinger" - }, "manageGroups": { "message": "Administrer grupper" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Egendefinert hvelv tidsavbrudd" - }, "vaultTimeoutToLarge": { "message": "Tidsavbrudd i hvelvet ditt overskrider begrensningen fastsatt av organisasjonen din." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Forrige synkronisering", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Selv-hosted sponsorater synkronisert." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM klargjøring", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Genererer brukere og grupper automatisk med den foretrukne identitetstjenesten din via SCIM-klargjøring", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Skru på SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Sett opp din foretrukne identitetstjeneste ved å konfigurere URL og SCIM API nøkkel", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Denne API nøkkelen har tilgang til å administrere brukere i din organisasjon. Den bør holdes hemmelig." }, "copyScimKey": { "message": "Kopier SCIM API nøkkelen til utklippstavlen", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Skift SCIM API nøkkelen", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Er du sikker du vil skifte SCIM API nøkkelen? Den nåværende nøkkelen vil ikke lenger fungere for eksisterende integrasjoner.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Skift nøkkel" }, "scimApiKey": { "message": "SCIM API-nøkkel", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopier SCIM-endepunkt URL til utklippstavlen", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM-URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API-nøkkel ble skiftet ut", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM innstillinger lagret", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Inndata er påkrevd." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Filopplasting" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Aksepterte formater:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index f758c6d360a..14c7f61fbe7 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index e09fdb78dd7..96ae8d48182 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -144,7 +144,7 @@ "message": "Beveiligingscode (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Veiligheidscode / CVV" }, "identityName": { "message": "Identiteitsnaam" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Selectievakje" + }, "cfTypeLinked": { "message": "Gekoppeld", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Veldtype" + }, + "fieldLabel": { + "message": "Veldlabel" + }, "remove": { "message": "Verwijderen" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Item weergeven" }, + "newItemHeader": { + "message": "Nieuwe $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "$TYPE$ bewerken", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "$ITEMTYPE$ weergeven", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiëren gelukt" }, "copyValue": { "message": "Waarde kopiëren", @@ -592,6 +619,45 @@ "message": "URI kopiëren", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "$FIELD$ kopiëren", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Website kopiëren" + }, + "copyNotes": { + "message": "Notities kopiëren" + }, + "copyAddress": { + "message": "Adres kopiëren" + }, + "copyPhone": { + "message": "Telefoonnummer kopiëren" + }, + "copyEmail": { + "message": "E-mail kopiëren" + }, + "copyCompany": { + "message": "Bedrijf kopiëren" + }, + "copySSN": { + "message": "Burgerservicenummer kopiëren" + }, + "copyPassportNumber": { + "message": "Paspoortnummer kopiëren" + }, + "copyLicenseNumber": { + "message": "Kenteken kopiëren" + }, + "copyName": { + "message": "Naam kopiëren" + }, "me": { "message": "Ik" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Instellingen" }, + "accountEmail": { + "message": "E-mailadres van account" + }, + "requestHint": { + "message": "Hint vragen" + }, + "requestPasswordHint": { + "message": "Hoofdwachtwoordhint vragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" + }, "passwordHint": { "message": "Wachtwoordhint" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Bijwerken encryptiesleutel kan niet verder gaan" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Bij het bijwerken van je encryptiesleutel konden we je mappen niet decoderen. Om door te gaan met de update, moeten je mappen worden verwijderd. Geen kluisitems worden verwijderd als je doorgaat." }, "keyUpdated": { "message": "Sleutel bijgewerkt" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Time-out van de kluis" }, + "vaultTimeout1": { + "message": "Time-out" + }, "vaultTimeoutDesc": { "message": "Stel de time-out van de kluis en de bijbehorende actie in." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Vergrendelen", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prullenbak", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Iedere verzameling verwijderen" }, - "editAssignedCollections": { - "message": "Toegewezen verzamelingen bewerken" - }, - "deleteAssignedCollections": { - "message": "Toegewezen verzamelingen verwijderen" - }, "manageGroups": { "message": "Groepen beheren" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ uren en $MINUTES$ minu(u)t(en) maximaal.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "De beleidsinstellingen van je organisatie hebben invloed op de time-out van je kluis. De maximale toegestane kluis time-out is $HOURS$ uur en $MINUTES$ minuten. Jouw time-out is ingesteld op $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Aangepaste time-out van de kluis" - }, "vaultTimeoutToLarge": { "message": "Je kluis time-out is hoger dan het maximum van jouw organisatie." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Laatste synchronisatie", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Zelf-gehoste sponsors gesynchroniseerd." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM-provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatisch in gebruikers en groepen voorzien via SCIM-provisioning van je voorkeursprovider", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM inschakelen", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Stel je voorkeurs voorkeursprovider voor identiteiten in door de URL SCIM API-sleutel te configureren", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Deze API-sleutel heeft toegang tot het beheer van gebruikers binnen je organisatie. Het moet geheim blijven." }, "copyScimKey": { "message": "Kopieer de SCIM API-sleutel naar je klembord", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "De SCIM API-sleutel roteren", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Weet je zeker dat je de SCIM API-sleutel wilt roteren? De huidige sleutel werkt niet meer voor bestaande integraties.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Sleutel roteren" }, "scimApiKey": { "message": "SCIM API-sleutel", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Kopieer de URL van het SCIM-eindpunt naar je klembord", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM-URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "De SCIM API-sleutel is met succes veranderd", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM-instellingen opgeslagen", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Invoer vereist." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Bestand uploaden" }, + "upload": { + "message": "Uploaden" + }, "acceptedFormats": { "message": "Toegestane formaten:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Veld toevoegen" }, + "editField": { + "message": "Veld bewerken" + }, "items": { "message": "Items" }, @@ -9073,21 +9164,21 @@ "current": { "message": "Huidig" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Je Secrets Manager-abonnement zal upgraden naar het geselecteerde abonnement" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Je gratis eenjarige Password Manager-abonnement zal veranderen naar het geselecteerde abonnement. Er worden pas kosten in rekening gebracht als de gratis periode voorbij is." }, "fileSavedToDevice": { "message": "Bestand op apparaat opgeslagen. Beheer vanaf de downloads op je apparaat." }, "publicApi": { "message": "Openbare API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Aantal tekens weergeven" diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 3c89cddd65b..db857e8de66 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolsk" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Tilknytt", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Fjerna" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Sjå oppføring" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Skriv av URI-en", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Eg" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Innstillingar" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Passordvink" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Boss", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index d0be45fdc2c..c47975bdfea 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 4461717618f..438733db707 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Wartość logiczna" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Powiązane pole", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Usuń" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Zobacz element" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopiuj URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Ja" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Ustawienia" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Podpowiedź do hasła" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Blokowanie sejfu" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Wybierz kiedy sejf zostanie zablokowany i wykonaj następującą akcję." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Zablokuj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kosz", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Usuń dowolną kolekcję" }, - "editAssignedCollections": { - "message": "Edytuj przypisane kolekcje" - }, - "deleteAssignedCollections": { - "message": "Usuń przypisane kolekcje" - }, "manageGroups": { "message": "Zarządzaj grupami" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min. Twój czas blokowania sejfu to $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Niestandardowy czas blokowania sejfu" - }, "vaultTimeoutToLarge": { "message": "Czas blokowania sejfu przekracza limit określony przez organizację." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Ostatnia synchronizacja", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Zsynchronizowano sponsorowanie na własnym hostingu." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Aprowizacja SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatycznie aprowiduj użytkowników i grupy z preferowanym dostawcą tożsamości poprzez aprowizację SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Włącz SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Skonfiguruj preferowanego dostawcę tożsamości poprzez konfigurowanie adresu URL i klucza API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Ten klucz API ma dostęp do zarządzania użytkownikami w Twojej organizacji. Powinien być zachowany w tajemnicy." }, "copyScimKey": { "message": "Kopiuj klucz API SCIM do schowka", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Zmień klucz API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Czy na pewno chcesz zmienić klucz interfejsu API SCIM? Obecny klucz nie będzie już działał dla żadnych istniejących integracji.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Zmień klucz" }, "scimApiKey": { "message": "Klucz API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Skopiuj adres URL SCIM do schowka", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "Adres SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Klucz API SCIM został zmieniony", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Ustawienia SCIM zostały zapisane", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Dane wejściowe są wymagane." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Przesyłanie plików" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Dozwolone formaty:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Dodaj pole" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Elementy" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 341c2c9db05..552a00d074d 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Vinculado", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remover" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Visualizar Item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Visualizar $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copiar URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Eu" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Configurações" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Dica da senha" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Tempo Limite do Cofre" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Escolha quando o tempo limite do seu cofre irá se esgotar e execute a ação selecionada." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixeira", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Excluir Qualquer Coleção" }, - "editAssignedCollections": { - "message": "Editar Coleções Atribuídas" - }, - "deleteAssignedCollections": { - "message": "Excluir Coleções Atribuídas" - }, "manageGroups": { "message": "Gerenciar Grupos" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. O Tempo Limite Máximo permitido do Cofre é {0} hora(s) e {1} minuto(s). Seu tempo limite do cofre está definido em {2}.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Tempo Limite do Cofre Personalizado" - }, "vaultTimeoutToLarge": { "message": "O tempo limite do seu cofre excede a restrição definida por sua organização." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Última Sincronização", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Patrocínios auto-hospedados sincronizados." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Provisionamento de SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Provisionar automaticamente usuários e grupos com seu provedor de identidade preferido via provisionamento de SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Habilitar SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Configure seu provedor de identidade preferido, configurando a URL e a chave de API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Esta chave de API tem acesso para gerenciar os usuários da sua organização. Deve ser mantida em segredo." }, "copyScimKey": { "message": "Copie a chave API do SCIM para a área de transferência", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotacionar a chave API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Você tem certeza que deseja rotacionar a chave de API SCIM? A chave atual não funcionará mais para quaisquer integrações existentes.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotacionar chave" }, "scimApiKey": { "message": "Chave de API do SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copie a URL do endpoint SCIM para a área de transferência", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL do SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "A chave de API SCIM foi rotacionada com sucesso", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "As configurações de SCIM foram salvas com sucesso", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Entrada necessária." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Enviar de arquivo" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Formatos Aceitos:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Adicionar campo" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Itens" }, @@ -9073,8 +9164,8 @@ "current": { "message": "Atual" }, - "secretsManagerSubInfo": { - "message": "Sua assinatura do Gerenciador de Segredos irá atualizar a base do plano selecionado" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Gerenciador de Senhas Bitwarden" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 9cc1d8dd5fc..61bc9352918 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -144,7 +144,7 @@ "message": "Código de segurança (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Código de segurança / CVV" }, "identityName": { "message": "Nome da identidade" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleano" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Associado", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remover" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Ver item" }, + "newItemHeader": { + "message": "Novo(a) $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Editar $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Ver $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Cópia bem-sucedida" }, "copyValue": { "message": "Copiar valor", @@ -592,6 +619,45 @@ "message": "Copiar URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Eu" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Definições" }, + "accountEmail": { + "message": "E-mail da conta" + }, + "requestHint": { + "message": "Pedir dica" + }, + "requestPasswordHint": { + "message": "Pedir dica da palavra-passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-á enviada a sua dica da palavra-passe" + }, "passwordHint": { "message": "Dica da palavra-passe" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "A atualização da chave de encriptação não pode prosseguir" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Ao atualizar a sua chave de encriptação, as suas pastas não puderam ser desencriptadas. Para continuar com a atualização, as suas pastas têm de ser eliminadas. Nenhum item do cofre será eliminado se prosseguir." }, "keyUpdated": { "message": "Chave atualizada" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Tempo limite do cofre" }, + "vaultTimeout1": { + "message": "Tempo limite" + }, "vaultTimeoutDesc": { "message": "Escolha quando é que o seu cofre executará a ação de tempo limite do cofre." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixo", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Eliminar qualquer coleção" }, - "editAssignedCollections": { - "message": "Editar coleções atribuídas" - }, - "deleteAssignedCollections": { - "message": "Eliminar coleções atribuídas" - }, "manageGroups": { "message": "Gerir grupos" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hora(s) e $MINUTES$ minuto(s) no máximo.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "As políticas da sua organização estão a afetar o tempo limite do cofre. O tempo limite máximo permitido do cofre é de $HOURS$ hora(s) e $MINUTES$ minuto(s). A sua ação de tempo limite do cofre está definida para $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Tempo limite do cofre personalizado" - }, "vaultTimeoutToLarge": { "message": "O tempo limite do seu cofre excede as restrições definidas pela sua organização." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Última sincronização a", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Patrocínios auto-hospedados sincronizados." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Aprovisionamento SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Aprovisione automaticamente utilizadores e grupos com o seu fornecedor de identidade preferido através do aprovisionamento SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Ativar SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Defina o seu fornecedor de identidade preferido, configurando o URL e a chave da API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Esta chave de API tem acesso para gerir utilizadores na sua organização. Deve ser mantida em segredo." }, "copyScimKey": { "message": "Copiar a chave da API SCIM para a área de transferência", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Regenerar a chave da API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Tem a certeza de que pretende regenerar a chave da API SCIM? A chave atual deixará de funcionar para quaisquer integrações existentes.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Regenerar chave" }, "scimApiKey": { "message": "Chave da API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copiar o URL do endpoint SCIM para a área de transferência", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL do SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Chave API SCIM regenerada com sucesso", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Definições SCIM guardadas", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Campo obrigatório." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Carregamento de ficheiros" }, + "upload": { + "message": "Carregar" + }, "acceptedFormats": { "message": "Formatos aceites:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Adicionar campo" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Itens" }, @@ -9050,7 +9141,7 @@ "message": "Integração de diretórios" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "SSO sem palavra-passe" }, "accountRecovery": { "message": "Recuperação de contas" @@ -9073,21 +9164,21 @@ "current": { "message": "Atual" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "A sua subscrição do Gestor de Segredos será atualizada com base no plano selecionado" }, "bitwardenPasswordManager": { "message": "Bitwarden - Gestor de Palavras-passe" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "A sua subscrição de cortesia de um ano do Gestor de Palavras-passe será atualizada para o plano selecionado. Não será cobrado até que o período de cortesia termine." }, "fileSavedToDevice": { "message": "Ficheiro guardado no dispositivo. Gira-o a partir das transferências do seu dispositivo." }, "publicApi": { "message": "API pública", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Mostrar contagem de caracteres" diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 603e7ef5ffe..651808b005f 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Valoare logică" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Conectat", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Ștergere" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Afișare articol" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copiere URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Eu" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Setări" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Indiciu parolă" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Timp de expirare seif" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Alegeți când seiful dvs. va efectua acțiunea de expirare a seifului." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Blocare", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Coș de reciclare", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Ștergere a oricărei colecții" }, - "editAssignedCollections": { - "message": "Editare a colecțiilor atribuite" - }, - "deleteAssignedCollections": { - "message": "Ștergere a colecțiilor atribuite" - }, "manageGroups": { "message": "Gestionare a grupurilor" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Timp de expirare seif personalizat" - }, "vaultTimeoutToLarge": { "message": "Timpul de expirare al seifului depășește restricția stabilită de organizația dvs." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Ultima sincronizare", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Sponsorizări auto-găzduite sincronizate." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Provizionare SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Furnizați automat utilizatorii și grupurile cu furnizorul dvs. preferat de identitate prin intermediul aprovizionării SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Activați SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Configurați furnizorul de identitate preferat prin configurarea URL-ului și a cheii API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Această cheie API are acces pentru a gestiona utilizatorii din cadrul organizației dumneavoastră. Ar trebui să fie păstrată secretă." }, "copyScimKey": { "message": "Copiere cheie API SCIM în clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Revocare cheie API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Sunteți sigur că doriți să revocați cheia API SCIM? Cheia actuală nu va mai funcționa pentru nicio integrare existentă.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Revocare cheie" }, "scimApiKey": { "message": "Cheia API SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copiați URL-ul punctului final SCIM în clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Revocarea cheii API SCIM s-a finalizat", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Setări SCIM salvate", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Este necesară o intrare." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 83e8dfdb532..026f4c57c42 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Логическое" }, + "cfTypeCheckbox": { + "message": "Флажок" + }, "cfTypeLinked": { "message": "Связано", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Тип поля" + }, + "fieldLabel": { + "message": "Метка поля" + }, "remove": { "message": "Удалить" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Просмотр элемента" }, + "newItemHeader": { + "message": "Новый $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Изменить $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Просмотр $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Скопировать URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Скопировать $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Скопировать сайт" + }, + "copyNotes": { + "message": "Скопировать заметки" + }, + "copyAddress": { + "message": "Скопировать адрес" + }, + "copyPhone": { + "message": "Скопировать телефон" + }, + "copyEmail": { + "message": "Скопировать email" + }, + "copyCompany": { + "message": "Скопировать компанию" + }, + "copySSN": { + "message": "Скопировать номер социального страхования" + }, + "copyPassportNumber": { + "message": "Скопировать номер паспорта" + }, + "copyLicenseNumber": { + "message": "Скопировать номер лицензии" + }, + "copyName": { + "message": "Скопировать имя" + }, "me": { "message": "Мое" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Настройки" }, + "accountEmail": { + "message": "Email аккаунта" + }, + "requestHint": { + "message": "Запросить подсказку" + }, + "requestPasswordHint": { + "message": "Запросить подсказку к паролю" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Введите email вашего аккаунта, и вам будет отправлена подсказка для пароля" + }, "passwordHint": { "message": "Подсказка к паролю" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Тайм-аут хранилища" }, + "vaultTimeout1": { + "message": "Тайм-аут" + }, "vaultTimeoutDesc": { "message": "Выберите тайм-аут для хранилища и действие, которое необходимо предпринять." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Блокировка", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Корзина", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Удалять любую коллекцию" }, - "editAssignedCollections": { - "message": "Изменять назначенные коллекции" - }, - "deleteAssignedCollections": { - "message": "Удалять назначенные коллекции" - }, "manageGroups": { "message": "Управлять группами" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Максимум $HOURS$ час. $MINUTES$ мин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин. Для вашего хранилища задан тайм-аут $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Пользовательский тайм-аут хранилища" - }, "vaultTimeoutToLarge": { "message": "Тайм-аут вашего хранилища превышает ограничение, установленное вашей организацией." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Последняя синхронизация", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Спонсирование собственного сервера синхронизировано." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Обеспечение SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Автоматически предоставлять пользователям и группам предпочитаемого поставщика удостоверений с помощью обеспечения SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Включить SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Установить предпочтительного поставщика идентификационных данных, настроив URL и ключ API SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Этот ключ API имеет доступ к управлению пользователями вашей организации. Его следует держать в секрете." }, "copyScimKey": { "message": "Скопировать API-ключ SCIM в буфер обмена", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Сменить API-ключ SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Вы уверены, что хотите сменить API-ключ SCIM? Текущий ключ перестанет работать для любых существующих интеграций.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Сменить ключ" }, "scimApiKey": { "message": "API-ключ SCIM", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Скопировать URL конечной точки SCIM в буфер обмена", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "API-ключ SCIM сменен успешно", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Настройки SCIM успешно сохранены", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Необходимо ввести данные." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Загрузить файл" }, + "upload": { + "message": "Загрузить" + }, "acceptedFormats": { "message": "Допустимые форматы:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Добавить поле" }, + "editField": { + "message": "Изменить поле" + }, "items": { "message": "Элементы" }, @@ -9073,8 +9164,8 @@ "current": { "message": "Текущий" }, - "secretsManagerSubInfo": { - "message": "Ваша подписка на Менеджер секретов будет обновляться в зависимости от выбранного тарифа" + "secretsManagerSubscriptionInfo": { + "message": "Ваша подписка на Менеджер секретов будет обновлена в зависимости от выбранного тарифа" }, "bitwardenPasswordManager": { "message": "Bitwarden - Менеджер паролей" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Публичный API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Показать количество символов" diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index e7fc8333893..cf12c847219 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "ඉවත් කරන්න" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "සැකසුම්" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 5e87aadf1e8..f465478db66 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Áno/Nie" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Prepojené", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Odstrániť" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Zobraziť položku" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Zobraziť $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopírovať URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Kopírovať $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopírovať webstránku" + }, + "copyNotes": { + "message": "Kopírovať poznámky" + }, + "copyAddress": { + "message": "Kopírovať adresu" + }, + "copyPhone": { + "message": "Kopírovať telefón" + }, + "copyEmail": { + "message": "Kopírovať email" + }, + "copyCompany": { + "message": "Kopírovať spoločnosť" + }, + "copySSN": { + "message": "Kopírovať číslo poistenca sociálnej poisťovne" + }, + "copyPassportNumber": { + "message": "Kopírovať číslo pasu" + }, + "copyLicenseNumber": { + "message": "Kopírovať číslo licencie" + }, + "copyName": { + "message": "Kopírovať meno" + }, "me": { "message": "Ja" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Nastavenia" }, + "accountEmail": { + "message": "E-mail účtu" + }, + "requestHint": { + "message": "Požiadať o nápoveď" + }, + "requestPasswordHint": { + "message": "Požiadať o nápoveď k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadajte e-mailovú adresu účtu a zašleme vám nápoveď k heslu" + }, "passwordHint": { "message": "Nápoveď k heslu" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Časový limit pre trezor" }, + "vaultTimeout1": { + "message": "Časový limit" + }, "vaultTimeoutDesc": { "message": "Vyberte kedy vyprší časový limit trezora a vykoná sa zvolená akcia." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Uzamknúť", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kôš", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Odstrániť ľubovoľnú zbierku" }, - "editAssignedCollections": { - "message": "Upraviť priradené zbierky" - }, - "deleteAssignedCollections": { - "message": "Odstrániť priradené zbierky" - }, "manageGroups": { "message": "Spravovať skupiny" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximálne $HOURS$ hodín a $MINUTES$ minút.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Zásady vašej organizácie ovplyvňujú časový limit trezoru. Maximálny povolený časový limit trezoru je $HOURS$ h a $MINUTES$ m. Nastavenie akcie pri vypršaní časového limitu je $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Vlastný časový limit pre trezor" - }, "vaultTimeoutToLarge": { "message": "Časový limit vášho trezora prekračuje obmedzenia nastavené vašou organizáciou." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Posledná synchronizácia", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Sponzorstvo s vlastným hostingom synchronizované." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Obnovte SCIM API kľúč", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Obnoviť kľúč" }, "scimApiKey": { "message": "SCIM API kľúč", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Vstup je povinný." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Nahrať súbor" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Akceptované formáty:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Pridať pole" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Položky" }, @@ -9073,8 +9164,8 @@ "current": { "message": "Aktuálne" }, - "secretsManagerSubInfo": { - "message": "Vaše predplatné Secrets Manager sa obnoví na základe vybraného plánu" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Správca Hesiel" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Verejné API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Zobraziť počítadlo znakov" diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 894dcffa26a..fd85410de5e 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Logična vrednost" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Povezano", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Odstrani" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Ogled elementa" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopiraj URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Jaz" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Nastavitve" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Namig za geslo" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Časovna omejitev trezorja" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Izberite, kaj naj se zgodi, ko časovna omejitev poteče." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Zakleni", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smetnjak", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Časovna omejitev po meri" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Vnos je obvezen" @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 79b6b47bfff..47028dc73d7 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -144,7 +144,7 @@ "message": "Безбедносни кôд (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Безбедносни кôд/CVV" }, "identityName": { "message": "Име идентитета" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Булове" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Повезано", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Уклони" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Види ставку" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Видети $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Успешно копирање" }, "copyValue": { "message": "Копирај вредност", @@ -592,6 +619,45 @@ "message": "Копирај УРЛ", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Копирати $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Копирати вебсајт" + }, + "copyNotes": { + "message": "Копирати белешке" + }, + "copyAddress": { + "message": "Копирати адресу" + }, + "copyPhone": { + "message": "Копирати телефон" + }, + "copyEmail": { + "message": "Копирати имејл" + }, + "copyCompany": { + "message": "Копирати фирму" + }, + "copySSN": { + "message": "Копирати број социјалног осигурања" + }, + "copyPassportNumber": { + "message": "Копирати број пасоша" + }, + "copyLicenseNumber": { + "message": "Копирати број лиценце" + }, + "copyName": { + "message": "Копирати име" + }, "me": { "message": "Ја" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Подешавања" }, + "accountEmail": { + "message": "Имејл налога" + }, + "requestHint": { + "message": "Захтевај савет" + }, + "requestPasswordHint": { + "message": "Затражити савет лозинке" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Унесите имејл свог налога и биће вам послат савет за лозинку" + }, "passwordHint": { "message": "Помоћ за лозинку" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Ажурирање кључа за шифровање не може да се настави" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Приликом ажурирања кључа за шифровање, ваше фасцикле нису могле да се дешифрују. Да бисте наставили са ажурирањем, ваше фасцикле морају бити избрисане. Ниједна ставка у сефу неће бити избрисана ако наставите." }, "keyUpdated": { "message": "Кључ је ажуриран" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Тајмаут сефа" }, + "vaultTimeout1": { + "message": "Истекло време" + }, "vaultTimeoutDesc": { "message": "Изаберите када ће сеф истећи и да изврши одабрану радњу." }, @@ -4048,7 +4129,7 @@ "message": "Изабано" }, "recommended": { - "message": "Recommended" + "message": "Препоручено" }, "ownership": { "message": "Власништво" @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Закључај", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Отпад", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Брише било коју колекцију" }, - "editAssignedCollections": { - "message": "Уреди додељеним колекцијама" - }, - "deleteAssignedCollections": { - "message": "Брише додељеним колекцијама" - }, "manageGroups": { "message": "Управљање групама" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Макимум $HOURS$ сат(а) и $MINUTES$ минут(а).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Смернице ваше организације утичу на временско ограничење сефа. Максимално дозвољено ограничење сефа је $HOURS$ сат(и) и $MINUTES$ минут(а). Ваша радња временског ограничења сефа је подешена на $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Прилагодити тајмаут сефа" - }, "vaultTimeoutToLarge": { "message": "Време истека вашег сефа је премашило дозвољена ограничења од стране ваше организације." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Последња синхронизација", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Упали SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Променити кључ" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM УРЛ", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API кључ успешно ротиран", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM подешавања сачувана", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Унос је потребан." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Отпремање датотеке" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Прихваћени формати:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Додај поље" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Ставке" }, @@ -8772,25 +8863,25 @@ "message": "Провера приступа чланова организације кроз групе, колекције и ставке колекције. ЦСВ извоз пружа детаљну анализу по члану, укључујући информације о дозволама за прикупљање и конфигурацијама налога." }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(Нема колекције)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(Без дозволе за колекцију)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(Нема групе)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "Да" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Не" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "Да" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Не" }, "higherKDFIterations": { "message": "Веће KDF итерације може помоћи у заштити ваше главне лозинке од грубе присиле од стране нападача." @@ -8996,7 +9087,7 @@ } }, "upgradePlans": { - "message": "Upgrade your plan to invite members and experience powerful security features." + "message": "Надоградите свој план да бисте позвали чланове и искусили моћне безбедносне функције." }, "upgradeDiscount": { "message": "Уштедите $AMOUNT$%", @@ -9008,10 +9099,10 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Advanced capabilities for larger organizations" + "message": "Напредне могућности за веће организације" }, "teamsPlanUpgradeMessage": { - "message": "Resilient protection for growing teams" + "message": "Отпорна заштита за растуће тимове" }, "teamsInviteMessage": { "message": "Invite unlimited members" @@ -9023,7 +9114,7 @@ "message": "Синхронизујте групе и кориснике из директоријума" }, "familyPlanUpgradeMessage": { - "message": "Secure your family logins" + "message": "Осигурајте своје породичне пријаве" }, "accessToPremiumFeatures": { "message": "Приступ Премиум функцијама" @@ -9073,27 +9164,27 @@ "current": { "message": "Тренутно" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Менаџер Лозинке" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Ваша комплементарна једногодишња претплата на Менаџер Лозинки ће надоградити на изабрани план. Неће вам бити наплаћено док се бесплатни период не заврши." }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, "publicApi": { "message": "Јавни API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Прикажи бројање слова" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Сакриј бројање слова" }, "editAccess": { "message": "Edit access" diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 4163b728bb5..655e4ab9c1e 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Logički Operator" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Ukloni" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopiraj URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Podešavanja" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kanta", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index db393954546..a9e0f922c71 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Booleskt värde" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Länkad", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Ta bort" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Visa objekt" }, + "newItemHeader": { + "message": "Ny $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Redigera $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Visa $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Kopiera URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Kopiera $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiera webbplats" + }, + "copyNotes": { + "message": "Kopiera anteckningar" + }, + "copyAddress": { + "message": "Kopiera adress" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Kopiera företag" + }, + "copySSN": { + "message": "Kopiera personnummer" + }, + "copyPassportNumber": { + "message": "Kopiera passnummer" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Kopiera namn" + }, "me": { "message": "Jag" }, @@ -807,7 +873,7 @@ "message": "Logga in med nyckel" }, "invalidPasskeyPleaseTryAgain": { - "message": "Ogiltig nyckel. Vänligen försök igen." + "message": "Ogiltig nyckel. Försök igen." }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { "message": "Tvåstegsverifiering stöds inte för nycklar. Uppdatera appen för att logga in." @@ -960,6 +1026,18 @@ "settings": { "message": "Inställningar" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Begär ledtråd" + }, + "requestPasswordHint": { + "message": "Begär lösenordsledtråd" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Lösenordsledtråd" }, @@ -1019,7 +1097,7 @@ "message": "E-postadress" }, "yourVaultIsLockedV2": { - "message": "Ditt valv är låst." + "message": "Ditt valv är låst" }, "uuid": { "message": "UUID" @@ -1170,7 +1248,7 @@ "message": "FIDO U2F-säkerhetsnyckel" }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn" + "message": "Nyckel" }, "webAuthnDesc": { "message": "Använd en WebAuthn-aktiverad säkerhetsnyckel för att komma åt ditt konto." @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Valvets tidsgräns" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Välj när valvets tidsgräns överskrids och den valda åtgärden utförs." }, @@ -4232,7 +4313,7 @@ "message": "Minsta antal ord" }, "overridePasswordTypePolicy": { - "message": "Password Type", + "message": "Lösenordstyp", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papperskorg", @@ -4520,7 +4601,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copyLink": { - "message": "Copy link" + "message": "Kopiera länk" }, "copySendLink": { "message": "Kopiera Send-länk", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Ta bort valfri samling" }, - "editAssignedCollections": { - "message": "Redigera tilldelade samlingar" - }, - "deleteAssignedCollections": { - "message": "Radera tilldelade samlingar" - }, "manageGroups": { "message": "Hantera grupper" }, @@ -5326,7 +5401,7 @@ "message": "Provider" }, "newClientOrganization": { - "message": "New client organization" + "message": "Ny klientorganisation" }, "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." @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Senaste synkronisering", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6337,7 +6422,7 @@ } }, "hostname": { - "message": "Hostname", + "message": "Värdnamn", "description": "Part of a URL." }, "apiAccessToken": { @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Aktivera SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Inmatning är obligatoriskt." @@ -7081,10 +7166,10 @@ "message": "Reverify domain" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "Kopiera DNS TXT-post" }, "dnsTxtRecord": { - "message": "DNS TXT record" + "message": "DNS TXT-post" }, "dnsTxtRecordInputHint": { "message": "Copy and paste the TXT record into your DNS Provider." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -7747,7 +7835,7 @@ "message": "Approve request" }, "noDeviceRequests": { - "message": "No device requests" + "message": "Inga enhetsförfrågningar" }, "noDeviceRequestsDesc": { "message": "Member device approval requests will appear here" @@ -7941,7 +8029,7 @@ } }, "collectionManagement": { - "message": "Collection management" + "message": "Samlingshantering" }, "collectionManagementDesc": { "message": "Manage the collection behavior for the organization" @@ -8010,7 +8098,7 @@ "message": "At least one member or group must have can manage permission." }, "typePasskey": { - "message": "Passkey" + "message": "Nyckel" }, "passkeyNotCopied": { "message": "Passkey will not be copied" @@ -8202,6 +8290,9 @@ "addField": { "message": "Lägg till fält" }, + "editField": { + "message": "Redigera fält" + }, "items": { "message": "Objekt" }, @@ -8302,7 +8393,7 @@ "description": "The title for the section that deals with machine accounts." }, "newMachineAccount": { - "message": "New machine account", + "message": "Nytt maskinkonto", "description": "Title for creating a new machine account." }, "machineAccountsNoItemsMessage": { @@ -8314,15 +8405,15 @@ "description": "Title to indicate that there are no machine accounts to display." }, "deleteMachineAccounts": { - "message": "Delete machine accounts", + "message": "Radera maskinkonton", "description": "Title for the action to delete one or multiple machine accounts." }, "deleteMachineAccount": { - "message": "Delete machine account", + "message": "Radera maskinkonto", "description": "Title for the action to delete a single machine account." }, "viewMachineAccount": { - "message": "View machine account", + "message": "Visa maskinkonto", "description": "Action to view the details of a machine account." }, "deleteMachineAccountDialogMessage": { @@ -8338,7 +8429,7 @@ "message": "Deleting machine accounts is permanent and irreversible." }, "deleteMachineAccountsConfirmMessage": { - "message": "Delete $COUNT$ machine accounts", + "message": "Radera $COUNT$ maskinkonton", "placeholders": { "count": { "content": "$1", @@ -8357,7 +8448,7 @@ "description": "Placeholder text for searching machine accounts." }, "editMachineAccount": { - "message": "Edit machine account", + "message": "Redigera maskinkonto", "description": "Title for editing a machine account." }, "machineAccountName": { @@ -8388,7 +8479,7 @@ "message": "Assign projects to this machine account. " }, "createMachineAccount": { - "message": "Create a machine account" + "message": "Skapa ett maskinkonto" }, "maPeopleWarningMessage": { "message": "Removing people from a machine 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 machine account." @@ -8560,16 +8651,16 @@ "message": "Select a plan" }, "thirtyFivePercentDiscount": { - "message": "35% Discount" + "message": "35% rabatt" }, "monthPerMember": { - "message": "month per member" + "message": "månad per medlem" }, "seats": { "message": "Seats" }, "addOrganization": { - "message": "Add organization" + "message": "Lägg till organisation" }, "createdNewClient": { "message": "Successfully created new client" @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Kontoåterställning" @@ -9065,19 +9156,19 @@ "message": "Obegränsat antal användare" }, "UpTo50MachineAccounts": { - "message": "Up to 50 machine accounts" + "message": "Upp till 50 maskinkonton" }, "UpTo20MachineAccounts": { - "message": "Up to 20 machine accounts" + "message": "Upp till 20 maskinkonton" }, "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { - "message": "Bitwarden Password Manager" + "message": "Bitwarden Lösenordshanterare" }, "secretsManagerComplimentaryPasswordManager": { "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." @@ -9087,13 +9178,13 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Visa antal tecken" + "message": "Visa teckenantal" }, "hideCharacterCount": { - "message": "Dölj antal tecken" + "message": "Dölj teckenantal" }, "editAccess": { "message": "Redigera åtkomst" diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index d0be45fdc2c..c47975bdfea 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Remove" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "View item" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Copy URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Me" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 71e56b40804..c81b481680f 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "ค่าบูลีน" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Linked", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "ลบ" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "ดูรายการ" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "คัดลอก URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "ฉัน" }, @@ -960,6 +1026,18 @@ "settings": { "message": "การตั้งค่า" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "คำใบ้รหัสผ่าน" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "File upload" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Accepted Formats:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 8978be127d1..eed06bb780a 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Bağlantılı", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Kaldır" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Kaydı göster" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "$ITEMTYPE$ bilgileri", "placeholders": { @@ -592,6 +619,45 @@ "message": "URI'yi kopyala", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "$FIELD$ alanını kopyala", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Web sitesini kopyala" + }, + "copyNotes": { + "message": "Notları kopyala" + }, + "copyAddress": { + "message": "Adresi kopyala" + }, + "copyPhone": { + "message": "Telefonu kopyala" + }, + "copyEmail": { + "message": "E-postayı kopyala" + }, + "copyCompany": { + "message": "Şirketi kopyala" + }, + "copySSN": { + "message": "Sosyal güvenlik numarasını kopyala" + }, + "copyPassportNumber": { + "message": "Pasaport numarasını kopyala" + }, + "copyLicenseNumber": { + "message": "Ruhsat numarasını kopyala" + }, + "copyName": { + "message": "Adı kopyala" + }, "me": { "message": "Ben" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Ayarlar" }, + "accountEmail": { + "message": "Hesap e-posta adresi" + }, + "requestHint": { + "message": "İpucunu iste" + }, + "requestPasswordHint": { + "message": "Parola ipucunu iste" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Hesabınızın e-posta adresini girdiğinizde parola ipucunuz size gönderilecektir" + }, "passwordHint": { "message": "Parola ipucu" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Kasa zaman aşımı" }, + "vaultTimeout1": { + "message": "Zaman aşımı" + }, "vaultTimeoutDesc": { "message": "Kasa zaman aşımı eyleminin ne zaman gerçekleştirileceğini seçin." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Kilitle", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Çöp Kutusu", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Tüm koleksiyonları silme" }, - "editAssignedCollections": { - "message": "Atanmış koleksiyonları düzenleme" - }, - "deleteAssignedCollections": { - "message": "Atanmış koleksiyonları silme" - }, "manageGroups": { "message": "Grupları yönetme" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "En fazla $HOURS$ saat $MINUTES$ dakika.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Kuruluş ilkeleriniz kasa zaman aşımınızı etkiliyor. İzin verilen maksimum kasa zaman aşımı $HOURS$ saat ve $MINUTES$ dakikadır. Kasa zaman aşımı eyleminiz $ACTION$ olarak ayarlandı.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Özel kasa zaman aşımı" - }, "vaultTimeoutToLarge": { "message": "Kasa zaman aşımınız, kuruluşunuz tarafından belirlenen kısıtlamaları aşıyor." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Son eşitleme", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Kendi kendine barındırılan sponsorluklar eşitlendi." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "SCIM'i etkinleştir", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "URL'yi ve SCIM API anahtarını yapılandırarak tercih ettiğiniz kimlik sağlayıcısını ayarlayın", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Bu API anahtarı, kuruluşunuzdaki kullanıcıları yönetme erişimine sahiptir. Gizli tutmaya özen gösterin." }, "copyScimKey": { "message": "SCIM API anahtarını panoya kopyala", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "SCIM API anahtarını yenile", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "SCIM API Anahtarını yenilemek istediğinizden emin misiniz? Geçerli anahtar, mevcut entegrasyonlarda artık çalışmayacaktır.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Anahtarı yenile" }, "scimApiKey": { "message": "SCIM API anahtarı", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "SCIM uç noktası URL'sini panoya kopyala", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL'si", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API anahtarı başarıyla yenilendi", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM ayarları kaydedildi", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Girdi gerekli." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Dosya yükleme" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Kabul edilen biçimler:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Alan ekle" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Kayıtlar" }, @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Secrets Manager aboneliğiniz seçtiğiniz plana göre yükseltilecektir" }, "bitwardenPasswordManager": { "message": "Bitwarden Parola Yöneticisi" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Genel API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Karakter sayacını göster" diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 9de932e9c09..da6b1854c6c 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Логічне значення" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Пов'язано", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Вилучити" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Переглянути запис" }, + "newItemHeader": { + "message": "Новий $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Редагувати $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "Переглянути $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "Копіювати URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Копіювати $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Копіювати вебсайт" + }, + "copyNotes": { + "message": "Копіювати нотатки" + }, + "copyAddress": { + "message": "Копіювати адресу" + }, + "copyPhone": { + "message": "Копіювати телефон" + }, + "copyEmail": { + "message": "Копіювати е-пошту" + }, + "copyCompany": { + "message": "Копіювати компанію" + }, + "copySSN": { + "message": "Копіювати номер соціального страхування" + }, + "copyPassportNumber": { + "message": "Копіювати номер паспорта" + }, + "copyLicenseNumber": { + "message": "Копіювати номер ліцензії" + }, + "copyName": { + "message": "Копіювати ім'я" + }, "me": { "message": "Я" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Налаштування" }, + "accountEmail": { + "message": "Е-пошта облікового запису" + }, + "requestHint": { + "message": "Підказка для запиту" + }, + "requestPasswordHint": { + "message": "Підказка для запиту пароля" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Введіть адресу е-пошти свого облікового запису і вам буде надіслано підказку для пароля" + }, "passwordHint": { "message": "Підказка для пароля" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Час очікування сховища" }, + "vaultTimeout1": { + "message": "Час очікування" + }, "vaultTimeoutDesc": { "message": "Оберіть дію, яка виконається після завершення часу очікування сховища." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Блокувати", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Смітник", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Видаляти будь-яку збірку" }, - "editAssignedCollections": { - "message": "Редагувати призначені збірки" - }, - "deleteAssignedCollections": { - "message": "Видалити призначені збірки" - }, "manageGroups": { "message": "Керування групами" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ год і $MINUTES$ хв максимум.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин. Для часу очікування вашого сховища встановлена дія $ACTION$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Власний час очікування сховища" - }, "vaultTimeoutToLarge": { "message": "Час очікування сховища перевищує обмеження, встановлене вашою організацією." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Востаннє синхронізовано", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Власне розміщене спонсорування синхронізовано." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "Забезпечення SCIM", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Автоматично забезпечувати користувачів та групи бажаним провайдером ідентифікації через SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Увімкнути SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Налаштуйте бажаного провайдера ідентифікації, вказавши URL-адресу та ключ API для SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "Цей ключ API має доступ до керування користувачами в межах вашої організації. Його необхідно надійно зберігати." }, "copyScimKey": { "message": "Копіювати ключ SCIM API до буфера обміну", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Оновити ключ SCIM API", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Ви дійсно хочете оновити ключ API для SCIM? Поточний ключ надалі не працюватиме з жодними наявними інтеграціями.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Оновити ключ" }, "scimApiKey": { "message": "Ключ SCIM API", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Копіювати URL кінцевої точки SCIM до буфера обміну", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "URL-адреса SCIM", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "Ключ SCIM API успішно оновлено", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "Налаштування SCIM збережено", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Необхідно ввести дані." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Вивантаження файлу" }, + "upload": { + "message": "Вивантажити" + }, "acceptedFormats": { "message": "Прийнятні формати:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Додати поле" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Записи" }, @@ -9050,7 +9141,7 @@ "message": "Інтеграція з каталогом" }, "passwordLessSso": { - "message": "Безпарольний вхід за допомогою SSO" + "message": "Безпарольний вхід SSO" }, "accountRecovery": { "message": "Відновлення облікового запису" @@ -9073,7 +9164,7 @@ "current": { "message": "Поточний" }, - "secretsManagerSubInfo": { + "secretsManagerSubscriptionInfo": { "message": "Ваша передплата менеджера секретів поновиться на основі вибраного плану" }, "bitwardenPasswordManager": { @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Відкритий API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Показати кількість символів" diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 970e61caa5a..28bc09fe280 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -144,7 +144,7 @@ "message": "Mã bảo mật (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Mã bảo mật / CVV" }, "identityName": { "message": "Tên danh tính" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "Boolean" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "Đã liên kết", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "Xóa" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "Xem mục" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "View $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Sao chép thành công" }, "copyValue": { "message": "Sao chép giá trị", @@ -592,6 +619,45 @@ "message": "Sao chép URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "Tôi" }, @@ -960,6 +1026,18 @@ "settings": { "message": "Cài đặt" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Gợi ý mật khẩu" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Không thể tiếp tục cập nhật khóa mã hóa" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Khi cập nhật khóa mã hóa, các thư mục của bạn không thể được giải mã. Để tiếp tục cập nhật, các thư mục của bạn phải bị xóa. Sẽ không có mục nào bị xóa nếu bạn tiếp tục." }, "keyUpdated": { "message": "Key updated" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "Khóa", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Thùng rác", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "Delete any collection" }, - "editAssignedCollections": { - "message": "Edit assigned collections" - }, - "deleteAssignedCollections": { - "message": "Delete assigned collections" - }, "manageGroups": { "message": "Manage groups" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "Custom vault timeout" - }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "Last sync", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "Self-hosted sponsorships synced." @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM provisioning", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "Enable SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { "message": "Copy the SCIM API key to your clipboard", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "Rotate the SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "Rotate key" }, "scimApiKey": { "message": "SCIM API key", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "Copy the SCIM endpoint URL to your clipboard", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API key successfully rotated", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM settings saved", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "Input is required." @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "Tải tập tin lên" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "Định dạng được chấp nhận:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "Items" }, @@ -8772,25 +8863,25 @@ "message": "Audit organization member access across groups, collections, and collection items. The CSV export provides a detailed breakdown per member, including information on collection permissions and account configurations." }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(Không có Bố sưu tập)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(Không có quyền Bộ sưu tập)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(Không có Nhóm)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "Bật" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "Tắt" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "Bật" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "Tắt" }, "higherKDFIterations": { "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker." @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,21 +9164,21 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Gói đăng ký Password Manager miễn phí một năm của bạn sẽ được nâng cấp lên gói đã chọn. Bạn sẽ không bị tính phí cho đến khi thời gian miễn phí kết thúc." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Đã lưu file. Xem mục tải xuống trên thiết bị của bạn." }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index a32fabb44b1..7f4ed0436f1 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -144,7 +144,7 @@ "message": "安全码 (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "安全码 / CVV" }, "identityName": { "message": "身份名称" @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "布尔型" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "链接型", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "移除" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "查看项目" }, + "newItemHeader": { + "message": "新增 $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "编辑 $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "查看 $ITEMTYPE$", "placeholders": { @@ -566,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "复制成功" }, "copyValue": { "message": "复制值", @@ -592,6 +619,45 @@ "message": "复制 URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "复制 $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "复制网站" + }, + "copyNotes": { + "message": "复制备注" + }, + "copyAddress": { + "message": "复制地址" + }, + "copyPhone": { + "message": "复制电话号码" + }, + "copyEmail": { + "message": "复制电子邮件地址" + }, + "copyCompany": { + "message": "复制公司信息" + }, + "copySSN": { + "message": "复制社会保障号码" + }, + "copyPassportNumber": { + "message": "复制护照号码" + }, + "copyLicenseNumber": { + "message": "复制许可证号码" + }, + "copyName": { + "message": "复制名称" + }, "me": { "message": "我" }, @@ -960,6 +1026,18 @@ "settings": { "message": "设置" }, + "accountEmail": { + "message": "账户邮件地址" + }, + "requestHint": { + "message": "请求提示" + }, + "requestPasswordHint": { + "message": "请求密码提示" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "输入您的账户电子邮件地址,您的密码提示将发送给您" + }, "passwordHint": { "message": "密码提示" }, @@ -3901,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "加密密钥更新无法继续" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "更新您的加密密钥时,无法解密您的文件夹。要继续更新,文件夹必须被删除。继续操作不会删除密码库项目。" }, "keyUpdated": { "message": "密钥已更新" @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "密码库超时时间" }, + "vaultTimeout1": { + "message": "超时" + }, "vaultTimeoutDesc": { "message": "选择您的密码库何时执行密码库超时动作。" }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "锁定", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "回收站", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "删除任意集合" }, - "editAssignedCollections": { - "message": "编辑已分配的集合" - }, - "deleteAssignedCollections": { - "message": "删除已分配的集合" - }, "manageGroups": { "message": "管理群组" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "最多 $HOURS$ 小时 $MINUTES$ 分钟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "您的组织策略正在影响您的密码库超时时间。最大允许的密码库超时时间是 $HOURS$ 小时 $MINUTES$ 分钟。您的密码库超时动作被设置为 $ACTION$。", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "自定义密码库超时时间" - }, "vaultTimeoutToLarge": { "message": "您的密码库超时时间超出了您的组织设置的限制。" }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "上次同步", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "自托管赞助已同步。" @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM 配置", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "通过 SCIM 配置,使用您首选的身份提供程序自动配置用户和群组", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "启用 SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "通过配置 URL 和 SCIM API 密钥来设置您的首选身份提供程序", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "此 API 密钥具有管理您组织内用户的权限。请严格保密。" }, "copyScimKey": { "message": "复制 SCIM API 密钥到剪贴板", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "轮换 SCIM API 密钥", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "确定要轮换 SCIM API 密钥吗?轮换后当前的密钥将不再适用于任何现有的集成。", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "轮换密钥" }, "scimApiKey": { "message": "SCIM API 密钥", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "复制 SCIM 端点 URL 到剪贴板", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API 密钥已成功轮换", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM 设置已保存", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "必须输入内容。" @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "文件上传" }, + "upload": { + "message": "上传" + }, "acceptedFormats": { "message": "可接受的格式:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "添加字段" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "项目" }, @@ -9050,7 +9141,7 @@ "message": "目录集成" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "账户恢复" @@ -9073,21 +9164,21 @@ "current": { "message": "当前" }, - "secretsManagerSubInfo": { - "message": "您的机密管理器订阅将基于所选的计划进行升级" + "secretsManagerSubscriptionInfo": { + "message": "您的机密管理器订阅将根据选定的计划升级" }, "bitwardenPasswordManager": { "message": "Bitwarden 密码管理器" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "您的一年免费密码管理器订阅将升级到所选计划。在免费期结束前,我们不会向您收取费用。" }, "fileSavedToDevice": { - "message": "文件已保存到设备。在设备下载中进行管理。" + "message": "文件已保存到设备。可以在设备下载中进行管理。" }, "publicApi": { "message": "公共 API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "显示字符计数" diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index e17547e6f18..29b106af6bb 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -269,10 +269,19 @@ "cfTypeBoolean": { "message": "布林值" }, + "cfTypeCheckbox": { + "message": "Checkbox" + }, "cfTypeLinked": { "message": "連結型", "description": "This describes a field that is 'linked' (related) to another field." }, + "fieldType": { + "message": "Field type" + }, + "fieldLabel": { + "message": "Field label" + }, "remove": { "message": "移除" }, @@ -511,6 +520,24 @@ "viewItem": { "message": "檢視項目" }, + "newItemHeader": { + "message": "New $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, + "editItemHeader": { + "message": "Edit $TYPE$", + "placeholders": { + "type": { + "content": "$1", + "example": "login" + } + } + }, "viewItemType": { "message": "檢視 $ITEMTYPE$", "placeholders": { @@ -592,6 +619,45 @@ "message": "複製 URI", "description": "Copy URI to clipboard" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, + "copyAddress": { + "message": "Copy address" + }, + "copyPhone": { + "message": "Copy phone" + }, + "copyEmail": { + "message": "Copy email" + }, + "copyCompany": { + "message": "Copy company" + }, + "copySSN": { + "message": "Copy Social Security number" + }, + "copyPassportNumber": { + "message": "Copy passport number" + }, + "copyLicenseNumber": { + "message": "Copy license number" + }, + "copyName": { + "message": "Copy name" + }, "me": { "message": "我" }, @@ -960,6 +1026,18 @@ "settings": { "message": "設定" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "密碼提示" }, @@ -3981,6 +4059,9 @@ "vaultTimeout": { "message": "密碼庫逾時時間" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "選擇密碼庫何時執行密碼庫逾時動作。" }, @@ -4249,7 +4330,7 @@ }, "lock": { "message": "鎖定", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "垃圾桶", @@ -4846,12 +4927,6 @@ "deleteAnyCollection": { "message": "刪除任何集合" }, - "editAssignedCollections": { - "message": "編輯已指派的集合" - }, - "deleteAssignedCollections": { - "message": "刪除已指派的集合" - }, "manageGroups": { "message": "管理群組" }, @@ -5459,6 +5534,19 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作被設定為 $ACTION$。", "placeholders": { @@ -5485,9 +5573,6 @@ } } }, - "customVaultTimeout": { - "message": "自訂密碼庫逾時時間" - }, "vaultTimeoutToLarge": { "message": "您的密碼庫逾時時間超過組織設定的限制。" }, @@ -6210,7 +6295,7 @@ }, "lastSync": { "message": "上次同步", - "description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" + "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { "message": "已同步自我裝載贊助。" @@ -6369,57 +6454,57 @@ }, "scim": { "message": "SCIM 佈建", - "description": "The text, 'SCIM', is an acronymn and should not be translated." + "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { "message": "透過 SCIM 佈建,使用您首選的身分提供程式自動佈建使用者和群組", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { "message": "啟用 SCIM", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { "message": "透過配置 URL 和 SCIM API 金鑰來設定您的首選身分提供程式", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { "message": "此 API 金鑰擁有管理您組織内使用者的權限,請儲存在安全的地方。" }, "copyScimKey": { "message": "複製 SCIM API 金鑰至剪貼簿", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { "message": "輪換 SCIM API 金鑰", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { "message": "確定要輪換 SCIM API 金鑰嗎?輪換後目前的金鑰將不再適用於現有的整合。", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { "message": "輪換金鑰" }, "scimApiKey": { "message": "SCIM API 金鑰", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { "message": "複製 SCIM 端點 URL 至剪貼簿", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { "message": "SCIM URL", - "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { "message": "SCIM API 金鑰已成功輪換", - "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." + "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { "message": "SCIM 設定已儲存", - "description": "the text, 'SCIM', is an acronymn and should not be translated." + "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { "message": "必須輸入內容。" @@ -7341,6 +7426,9 @@ "fileUpload": { "message": "檔案上傳" }, + "upload": { + "message": "Upload" + }, "acceptedFormats": { "message": "接受的格式:" }, @@ -8202,6 +8290,9 @@ "addField": { "message": "Add field" }, + "editField": { + "message": "Edit field" + }, "items": { "message": "項目" }, @@ -9050,7 +9141,7 @@ "message": "Directory integration" }, "passwordLessSso": { - "message": "PasswordLess SSO" + "message": "Passwordless SSO" }, "accountRecovery": { "message": "Account recovery" @@ -9073,8 +9164,8 @@ "current": { "message": "Current" }, - "secretsManagerSubInfo": { - "message": "Your Secrets Manager subscription will upgrade base on the plan selected" + "secretsManagerSubscriptionInfo": { + "message": "Your Secrets Manager subscription will upgrade based on the plan selected" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -9087,7 +9178,7 @@ }, "publicApi": { "message": "Public API", - "description": "The text, 'API', is an acronymn and should not be translated." + "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { "message": "Show character count" From ece6f8aae231f6d6beddc661c3722e61a7f53a8f Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Fri, 20 Sep 2024 09:44:05 -0400 Subject: [PATCH 066/104] AC-2617 update vault header to have loading text on slow connection(#11121) --- .../vault/org-vault/vault-header/vault-header.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts index 5e64067a826..429062917ad 100644 --- a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts @@ -122,7 +122,9 @@ export class VaultHeaderComponent implements OnInit { return this.i18nService.t("unassigned"); } - return `${this.organization?.name} ${headerType}`; + return this.organization?.name + ? `${this.organization?.name} ${headerType}` + : this.i18nService.t("collections"); } get icon() { From c13131acd1378b2d731784a012e5328e949e5c9d Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Fri, 20 Sep 2024 08:45:44 -0500 Subject: [PATCH 067/104] remove border styles, allow for component library to style the icon button (#11154) --- .../add-edit-custom-field-dialog.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/vault/src/cipher-form/components/custom-fields/add-edit-custom-field-dialog/add-edit-custom-field-dialog.component.html b/libs/vault/src/cipher-form/components/custom-fields/add-edit-custom-field-dialog/add-edit-custom-field-dialog.component.html index ff94548b342..1ad42f95ec2 100644 --- a/libs/vault/src/cipher-form/components/custom-fields/add-edit-custom-field-dialog/add-edit-custom-field-dialog.component.html +++ b/libs/vault/src/cipher-form/components/custom-fields/add-edit-custom-field-dialog/add-edit-custom-field-dialog.component.html @@ -38,7 +38,7 @@ *ngIf="variant === 'edit'" type="button" buttonType="danger" - class="tw-border-0 tw-ml-auto" + class="tw-ml-auto" bitIconButton="bwi-trash" [appA11yTitle]="'deleteCustomField' | i18n: customFieldForm.value.label" (click)="removeField()" From 1262623facc00bc204257e51e0b76a1eccc9544b Mon Sep 17 00:00:00 2001 From: Victoria League Date: Fri, 20 Sep 2024 09:52:12 -0400 Subject: [PATCH 068/104] [CL-451] Add option for full width chip select (#11135) --- .../chip-select/chip-select.component.html | 11 ++++-- .../src/chip-select/chip-select.component.ts | 3 ++ .../src/chip-select/chip-select.stories.ts | 38 +++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/libs/components/src/chip-select/chip-select.component.html b/libs/components/src/chip-select/chip-select.component.html index 81a1c47b3f8..eb4ea89387e 100644 --- a/libs/components/src/chip-select/chip-select.component.html +++ b/libs/components/src/chip-select/chip-select.component.html @@ -1,17 +1,18 @@
+ >

{{ "troubleLoggingIn" | i18n }}
- {{ "useADifferentLogInMethod" | i18n }} + {{ "useADifferentLogInMethod" | i18n }}

diff --git a/apps/web/src/app/auth/login/login.component.html b/apps/web/src/app/auth/login/login.component.html index 64f1e80a990..d26e81b35b4 100644 --- a/apps/web/src/app/auth/login/login.component.html +++ b/apps/web/src/app/auth/login/login.component.html @@ -48,14 +48,15 @@

{{ "newAroundHere" | i18n }} -

{{ "loggingInAs" | i18n }} {{ loggedEmail }}

- {{ "notYou" | i18n }} + {{ "notYou" | i18n }}
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 2e50d69fce1..19a7a95b298 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 @@ -115,11 +115,11 @@ {{ "acceptPolicies" | i18n }}
- {{ + {{ "termsOfService" | i18n }}, - {{ + {{ "privacyPolicy" | i18n }}
@@ -151,7 +151,7 @@

{{ "alreadyHaveAccount" | i18n }} - {{ "logIn" | i18n }} + {{ "logIn" | i18n }}

diff --git a/apps/web/src/app/auth/settings/change-password.component.html b/apps/web/src/app/auth/settings/change-password.component.html index b5c8677405f..91144fdfc1f 100644 --- a/apps/web/src/app/auth/settings/change-password.component.html +++ b/apps/web/src/app/auth/settings/change-password.component.html @@ -104,7 +104,7 @@ href="https://bitwarden.com/help/account-encryption-key/#rotate-your-encryption-key" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'impactOfRotatingYourEncryptionKey' | i18n }}" > diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html b/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html index 293c5051ce9..6e87d66d18b 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.html @@ -21,7 +21,7 @@ rel="noreferrer" bitLink linkType="primary" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutUserAccess' | i18n }}" href="https://bitwarden.com/help/emergency-access/#user-access" slot="end" > diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html index e38f21fde20..fc199a55a76 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html @@ -9,7 +9,7 @@ target="_blank" rel="noreferrer" > - {{ "learnMore" | i18n }}. + {{ "learnMoreAboutEmergencyAccess" | i18n }}

{{ diff --git a/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html b/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html index 478cd77eb6c..203f6d016bb 100644 --- a/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html +++ b/apps/web/src/app/auth/settings/security/change-kdf/change-kdf.component.html @@ -21,7 +21,7 @@ href="https://bitwarden.com/help/kdf-algorithms" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutEncryptionAlgorithms' | i18n }}" slot="end" > @@ -57,7 +57,7 @@ href="https://bitwarden.com/help/what-encryption-is-used/#changing-kdf-iterations" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutKDFIterations' | i18n }}" slot="end" > diff --git a/apps/web/src/app/auth/settings/two-factor-setup.component.html b/apps/web/src/app/auth/settings/two-factor-setup.component.html index 3595d9a7dcb..b7cd6954fd6 100644 --- a/apps/web/src/app/auth/settings/two-factor-setup.component.html +++ b/apps/web/src/app/auth/settings/two-factor-setup.component.html @@ -11,7 +11,7 @@

{{ "twoStepLoginEnterpriseDescStart" | i18n }} - {{ "twoStepLoginPolicy" | i18n }}. + {{ "twoStepLoginPolicy" | i18n }}.
{{ "twoStepLoginOrganizationDuoDesc" | i18n }}
diff --git a/apps/web/src/app/auth/settings/two-factor-webauthn.component.html b/apps/web/src/app/auth/settings/two-factor-webauthn.component.html index 9dc9bd40684..0a2eb346b1b 100644 --- a/apps/web/src/app/auth/settings/two-factor-webauthn.component.html +++ b/apps/web/src/app/auth/settings/two-factor-webauthn.component.html @@ -42,7 +42,7 @@ aria-hidden="true" >
- - {{ "remove" | i18n }} + {{ "remove" | i18n }} diff --git a/apps/web/src/app/billing/shared/billing-history.component.html b/apps/web/src/app/billing/shared/billing-history.component.html index 1719a59076f..fc621571778 100644 --- a/apps/web/src/app/billing/shared/billing-history.component.html +++ b/apps/web/src/app/billing/shared/billing-history.component.html @@ -15,7 +15,13 @@ > - + {{ "invoiceNumber" | i18n: i.number }} diff --git a/apps/web/src/app/billing/shared/payment/payment.component.html b/apps/web/src/app/billing/shared/payment/payment.component.html index f33768c2c95..d4853713579 100644 --- a/apps/web/src/app/billing/shared/payment/payment.component.html +++ b/apps/web/src/app/billing/shared/payment/payment.component.html @@ -55,7 +55,7 @@ target="_blank" rel="noreferrer" class="hover:tw-no-underline" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'whatIsACvvNumber' | i18n }}" > diff --git a/apps/web/src/app/settings/preferences.component.html b/apps/web/src/app/settings/preferences.component.html index ffd55e69c88..80261ecccb7 100644 --- a/apps/web/src/app/settings/preferences.component.html +++ b/apps/web/src/app/settings/preferences.component.html @@ -56,7 +56,7 @@ href="https://bitwarden.com/help/localization/" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutLocalization' | i18n }}" slot="end" > @@ -76,7 +76,7 @@ href="https://bitwarden.com/help/website-icons/" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutWebsiteIcons' | i18n }}" slot="end" > diff --git a/apps/web/src/app/shared/components/account-fingerprint/account-fingerprint.component.html b/apps/web/src/app/shared/components/account-fingerprint/account-fingerprint.component.html index fd898768609..bc7d9a64179 100644 --- a/apps/web/src/app/shared/components/account-fingerprint/account-fingerprint.component.html +++ b/apps/web/src/app/shared/components/account-fingerprint/account-fingerprint.component.html @@ -6,7 +6,7 @@ href="https://bitwarden.com/help/fingerprint-phrase/" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutYourAccountFingerprintPhrase' | i18n }}" > diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html index 43701dcd712..bcd5a28812a 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html @@ -45,10 +45,11 @@ {{ r.name }} diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html index ae2f0988e5b..52bbb1c5e6d 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.html @@ -48,10 +48,11 @@ {{ r.name }} diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html index 5d1f151fd75..e836c14996f 100644 --- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html @@ -50,10 +50,11 @@ {{ r.name }} diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html index 2d4a4f0d445..9293915363e 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.html @@ -47,9 +47,15 @@ - {{ - r.name - }} + + {{ r.name }} + {{ r.name }} diff --git a/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.html b/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.html index 1c2a75737e0..759cc1b3b0f 100644 --- a/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.html +++ b/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.html @@ -151,6 +151,7 @@

@@ -418,6 +418,7 @@
@@ -953,7 +954,7 @@ diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.html b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.html index 59e40135b3a..8380f96840e 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.html +++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.html @@ -10,7 +10,7 @@ href="https://bitwarden.com/help/searching-vault/" target="_blank" rel="noreferrer" - appA11yTitle="{{ 'learnMore' | i18n }}" + appA11yTitle="{{ 'learnMoreAboutSearchingYourVault' | i18n }}" > diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index c47975bdfea..cc2754b6d60 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -9029,6 +9029,48 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "learnMoreAboutEmergencyAccess": { + "message":"Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/bitwarden_license/bit-web/src/app/admin-console/policies/activate-autofill.component.html b/bitwarden_license/bit-web/src/app/admin-console/policies/activate-autofill.component.html index 0b3c8bf6bab..e2dbc8e8326 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/policies/activate-autofill.component.html +++ b/bitwarden_license/bit-web/src/app/admin-console/policies/activate-autofill.component.html @@ -1,8 +1,12 @@ {{ "experimentalFeature" | i18n }} - {{ - "learnMoreAboutAutofill" | i18n - }} + {{ "learnMoreAboutAutofill" | i18n }} diff --git a/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html b/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html index a7d369952a4..914d015110b 100644 --- a/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html +++ b/bitwarden_license/bit-web/src/app/auth/sso/sso.component.html @@ -13,7 +13,7 @@

{{ "ssoPolicyHelpStart" | i18n }} - {{ "ssoPolicyHelpAnchor" | i18n }} + {{ "ssoPolicyHelpAnchor" | i18n }} {{ "ssoPolicyHelpEnd" | i18n }}

@@ -31,7 +31,7 @@ {{ "ssoIdentifierHintPartOne" | i18n }} - {{ "domainVerification" | i18n }} + {{ "domainVerification" | i18n }} @@ -70,7 +70,9 @@ {{ "memberDecryptionKeyConnectorDescStart" | i18n }} - {{ "memberDecryptionKeyConnectorDescLink" | i18n }} + {{ + "memberDecryptionKeyConnectorDescLink" | i18n + }} {{ "memberDecryptionKeyConnectorDescEnd" | i18n }} @@ -85,15 +87,15 @@ {{ "memberDecryptionOptionTdeDescriptionPartOne" | i18n }} - {{ + {{ "memberDecryptionOptionTdeDescriptionLinkOne" | i18n }} {{ "memberDecryptionOptionTdeDescriptionPartTwo" | i18n }} - {{ + {{ "memberDecryptionOptionTdeDescriptionLinkTwo" | i18n }} {{ "memberDecryptionOptionTdeDescriptionPartThree" | i18n }} - {{ + {{ "memberDecryptionOptionTdeDescriptionLinkThree" | i18n }} {{ "memberDecryptionOptionTdeDescriptionPartFour" | i18n }} From a2ce4e53c674ce0af14bf7b0c61243130668efb8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:12:17 +0000 Subject: [PATCH 072/104] Autosync the updated translations (#11165) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/af/messages.json | 31 ++++++++-- apps/desktop/src/locales/ar/messages.json | 31 ++++++++-- apps/desktop/src/locales/az/messages.json | 33 ++++++++-- apps/desktop/src/locales/be/messages.json | 31 ++++++++-- apps/desktop/src/locales/bg/messages.json | 31 ++++++++-- apps/desktop/src/locales/bn/messages.json | 29 +++++++-- apps/desktop/src/locales/bs/messages.json | 29 +++++++-- apps/desktop/src/locales/ca/messages.json | 31 ++++++++-- apps/desktop/src/locales/cs/messages.json | 29 +++++++-- apps/desktop/src/locales/cy/messages.json | 29 +++++++-- apps/desktop/src/locales/da/messages.json | 35 ++++++++--- apps/desktop/src/locales/de/messages.json | 33 ++++++++-- apps/desktop/src/locales/el/messages.json | 33 ++++++++-- apps/desktop/src/locales/en_GB/messages.json | 29 +++++++-- apps/desktop/src/locales/en_IN/messages.json | 29 +++++++-- apps/desktop/src/locales/eo/messages.json | 29 +++++++-- apps/desktop/src/locales/es/messages.json | 31 ++++++++-- apps/desktop/src/locales/et/messages.json | 35 ++++++++--- apps/desktop/src/locales/eu/messages.json | 31 ++++++++-- apps/desktop/src/locales/fa/messages.json | 31 ++++++++-- apps/desktop/src/locales/fi/messages.json | 35 ++++++++--- apps/desktop/src/locales/fil/messages.json | 31 ++++++++-- apps/desktop/src/locales/fr/messages.json | 29 +++++++-- apps/desktop/src/locales/gl/messages.json | 29 +++++++-- apps/desktop/src/locales/he/messages.json | 31 ++++++++-- apps/desktop/src/locales/hi/messages.json | 29 +++++++-- apps/desktop/src/locales/hr/messages.json | 33 ++++++++-- apps/desktop/src/locales/hu/messages.json | 31 ++++++++-- apps/desktop/src/locales/id/messages.json | 31 ++++++++-- apps/desktop/src/locales/it/messages.json | 33 ++++++++-- apps/desktop/src/locales/ja/messages.json | 29 +++++++-- apps/desktop/src/locales/ka/messages.json | 29 +++++++-- apps/desktop/src/locales/km/messages.json | 29 +++++++-- apps/desktop/src/locales/kn/messages.json | 31 ++++++++-- apps/desktop/src/locales/ko/messages.json | 31 ++++++++-- apps/desktop/src/locales/lt/messages.json | 31 ++++++++-- apps/desktop/src/locales/lv/messages.json | 29 +++++++-- apps/desktop/src/locales/me/messages.json | 31 ++++++++-- apps/desktop/src/locales/ml/messages.json | 31 ++++++++-- apps/desktop/src/locales/mr/messages.json | 29 +++++++-- apps/desktop/src/locales/my/messages.json | 29 +++++++-- apps/desktop/src/locales/nb/messages.json | 31 ++++++++-- apps/desktop/src/locales/ne/messages.json | 29 +++++++-- apps/desktop/src/locales/nl/messages.json | 31 ++++++++-- apps/desktop/src/locales/nn/messages.json | 29 +++++++-- apps/desktop/src/locales/or/messages.json | 29 +++++++-- apps/desktop/src/locales/pl/messages.json | 31 ++++++++-- apps/desktop/src/locales/pt_BR/messages.json | 31 ++++++++-- apps/desktop/src/locales/pt_PT/messages.json | 31 ++++++++-- apps/desktop/src/locales/ro/messages.json | 31 ++++++++-- apps/desktop/src/locales/ru/messages.json | 29 +++++++-- apps/desktop/src/locales/si/messages.json | 29 +++++++-- apps/desktop/src/locales/sk/messages.json | 63 +++++++++++++------- apps/desktop/src/locales/sl/messages.json | 31 ++++++++-- apps/desktop/src/locales/sr/messages.json | 37 +++++++++--- apps/desktop/src/locales/sv/messages.json | 33 ++++++++-- apps/desktop/src/locales/te/messages.json | 29 +++++++-- apps/desktop/src/locales/th/messages.json | 29 +++++++-- apps/desktop/src/locales/tr/messages.json | 31 ++++++++-- apps/desktop/src/locales/uk/messages.json | 29 +++++++-- apps/desktop/src/locales/vi/messages.json | 31 ++++++++-- apps/desktop/src/locales/zh_CN/messages.json | 31 ++++++++-- apps/desktop/src/locales/zh_TW/messages.json | 31 ++++++++-- 63 files changed, 1645 insertions(+), 322 deletions(-) diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 4db80761659..8e004383e3c 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Instellings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Wagwoordwenk" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Kluis-uittel" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Kies wanneer u kluis sal uittel en die gekose aksie sal uitvoer." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Aanbeveel vir veiligheid." }, - "lockWithMasterPassOnRestart": { - "message": "Vergrendel by herbegin met hoofwagwoord" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Skrap rekening" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Vergrendel", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Asblik", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minute" }, - "vaultTimeoutPolicyInEffect": { - "message": "U organisasiebeleide beïnvloed u kluisuitelling. Maksimum toegelate kluisuittelling is $HOURS$ uur en $MINUTES$ minuut(e)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Teks stuur" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index abbd203b505..e92c7b104bd 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "الإعدادات" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "تلميح كلمة المرور" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "مهلة الخزنة" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "اختر وقت انتهاء مهلة خزنتك وقم بتنفيذ الإجراء المحدد." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "موصى به للأمان." }, - "lockWithMasterPassOnRestart": { - "message": "قفل مع كلمة المرور الرئيسية عند إعادة تشغيل" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "حذف الحساب" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "قفل", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "سلة المهملات", @@ -2087,8 +2102,8 @@ "minutes": { "message": "دقائق" }, - "vaultTimeoutPolicyInEffect": { - "message": "سياسات مؤسستك تؤثر على مهلة خزانتك. الحد الأقصى المسموح به لمهلة الخزنة هو $HOURS$ ساعة و $MINUTES$ دقيقة", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "إرسال النص" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 3ab79fad39a..68000b3bf48 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Ayarlar" }, + "accountEmail": { + "message": "Hesab e-poçtu" + }, + "requestHint": { + "message": "İpucu tələb et" + }, + "requestPasswordHint": { + "message": "Parol ipucusu tələb et" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Hesabınızın e-poçt ünvanını daxil edin və parolunuz üçün ipucu sizə göndəriləcək" + }, "passwordHint": { "message": "Parol məsləhəti" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Anbar vaxtının bitməsi" }, + "vaultTimeout1": { + "message": "Vaxt bitmə" + }, "vaultTimeoutDesc": { "message": "Anbarın vaxt bitmə əməliyyatını nə vaxt icra edəcəyini seçin." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Uğurla kopyalandı" }, "errorRefreshingAccessToken": { "message": "Müraciət tokeni təzələmə xətası" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Güvənlik üçün tövsiyə olunur." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Yenidən başladılanda ana parol ilə kilidlə" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Kilidlə", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Tullantı qutusu", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Dəqiqə" }, - "vaultTimeoutPolicyInEffect": { - "message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir", + "vaultTimeoutPolicyInEffect1": { + "message": "Maksimum $HOURS$ saat və $MINUTES$ dəqiqə.", "placeholders": { "hours": { "content": "$1", @@ -3062,10 +3077,16 @@ "textSends": { "message": "Mətn \"Send\"ləri" }, + "allowScreenshots": { + "message": "Ekranı çəkməyə icazə ver" + }, + "allowScreenshotsDesc": { + "message": "Bitwarden masaüstü tətbiqinin ekranını çəkməyə icazə ver." + }, "ssoError": { "message": "SSO giriş üçün açıq port tapıla bilmədi." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Fayl cihazda saxlanıldı. Endirilənləri cihazınızdan idarə edin." } } diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index dc270253c03..8d8d5ad3773 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Налады" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Падказка да пароля" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Час чакання сховішча" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Выберыце тайм-аўт для сховішча і дзеянне, якое неабходна зрабіць." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Рэкамендуецца ў мэтах бяспекі." }, - "lockWithMasterPassOnRestart": { - "message": "Блакіраваць асноўным паролем пры перазапуску" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Выдаліць уліковы запіс" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Заблакіраваць", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Сметніца", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Хвіліны" }, - "vaultTimeoutPolicyInEffect": { - "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае $HOURS$ гадз. і $MINUTES$ хв.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index 5ad0e391938..dde9a23d3a3 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Настройки" }, + "accountEmail": { + "message": "Е-поща на регистрацията" + }, + "requestHint": { + "message": "Заявка за подсказка" + }, + "requestPasswordHint": { + "message": "Заявка за подсказка за паролата" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Въведете е-пощата на регистрацията си и подсказката за паролата ще Ви бъде изпратена" + }, "passwordHint": { "message": "Подсказка за паролата" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Време за достъп" }, + "vaultTimeout1": { + "message": "Време за достъп" + }, "vaultTimeoutDesc": { "message": "Изберете колко да е времето за достъп и какво ще е действието след това." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Копирането е успешно" }, "errorRefreshingAccessToken": { "message": "Грешка при опресняването на идентификатора за достъп" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Препоръчително от гледна точка на сигурността." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Заключване с главната парола при повторно пускане" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Заключване", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Кошче", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Минути" }, - "vaultTimeoutPolicyInEffect": { - "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минути", + "vaultTimeoutPolicyInEffect1": { + "message": "Максимум $HOURS$ час(а) и $MINUTES$ минута/и.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Текстови изпращания" }, + "allowScreenshots": { + "message": "Позволяване на заснемането на екрана" + }, + "allowScreenshotsDesc": { + "message": "Позволяване на заснемането на екрана когато работи настолното приложение на Битуорден." + }, "ssoError": { "message": "Не могат да бъдат открити свободни портове за еднократната идентификация." }, diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 98b61b53b75..12c6d10501a 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "সেটিংস" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "পাসওয়ার্ড ইঙ্গিত" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "ভল্টের সময়সীমা" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "আবর্জনা", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 592117cecd2..4da0dbee9ee 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Postavke" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Nagovještaj lozinke" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vremensko ograničenje trezora" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Odaberi kada će za koliko vremena će isteći aktivnost trezora i biti izvršena odabrana radnja." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index dbc7fd3a7d3..6ca0aac1845 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Configuració" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista per a la contrasenya" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Temps d'espera de la caixa forta" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Trieu quan es tancarà la vostra caixa forta i feu l'acció seleccionada." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recomanat per seguretat." }, - "lockWithMasterPassOnRestart": { - "message": "Bloqueja amb la contrasenya mestra en reiniciar" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Suprimeix el compte" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Bloqueja", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Paperera", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuts" }, - "vaultTimeoutPolicyInEffect": { - "message": "Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès d'aquesta és de $HOURS$ hores i $MINUTES$ minuts", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 05262bc6139..f40ba19f169 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Nastavení" }, + "accountEmail": { + "message": "E-mail účtu" + }, + "requestHint": { + "message": "Vyžádat nápovědu" + }, + "requestPasswordHint": { + "message": "Vyžádat nápovědu k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadejte svou e-mailovou adresu, na kterou Vám zašleme nápovědu k heslu" + }, "passwordHint": { "message": "Nápověda pro heslo" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Časový limit trezoru" }, + "vaultTimeout1": { + "message": "Časový limit" + }, "vaultTimeoutDesc": { "message": "Vyberte, kdy vyprší bezpečnostní limit trezoru. Poté bude provedena vybraná akce." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Doporučeno pro bezpečnost." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Zamknout trezor při restartu pomocí hlavního hesla" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Zamknout", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Koš", @@ -2087,8 +2102,8 @@ "minutes": { "message": "minut" }, - "vaultTimeoutPolicyInEffect": { - "message": "Zásady Vaší organizace ovlivňují časový limit trezoru. Maximální povolený časový limit trezoru je $HOURS$ hodin a $MINUTES$ minut.", + "vaultTimeoutPolicyInEffect1": { + "message": "Maximálně $HOURS$ hodin a $MINUTES$ minut.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Sends s texty" }, + "allowScreenshots": { + "message": "Povolit záznam obrazovky" + }, + "allowScreenshotsDesc": { + "message": "Povolí zachycování obrazovky desktopové aplikace Bitwarden." + }, "ssoError": { "message": "Pro přihlášení SSO nebyly nalezeny žádné volné porty." }, diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index d752c63e306..3ac19a2ada8 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 0e89a376159..c4f5a081040 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Indstillinger" }, + "accountEmail": { + "message": "Konto-e-mail" + }, + "requestHint": { + "message": "Anmod om tip" + }, + "requestPasswordHint": { + "message": "Anmod om adgangskodetip" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Angiv kontoens e-mailadresse og få et adgangskodetip fremsendt" + }, "passwordHint": { "message": "Adgangskodetip" }, @@ -742,13 +754,13 @@ "message": "Angiv grund-URL'en til den lokal-hostede Bitwarden-installation." }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "Angiv basis-URL'en for den lokalt-hosted Bitwarden-installation. Eks.: https://bitwarden.firma.dk" }, "selfHostedCustomEnvHeader": { - "message": "For advanced configuration, you can specify the base URL of each service independently." + "message": "Til avancerede brugere. Man kan angive basis-URL'en for hver tjeneste uafhængigt." }, "selfHostedEnvFormInvalid": { - "message": "You must add either the base Server URL or at least one custom environment." + "message": "Der skal tilføjes enten basis Server-URL'en eller mindst ét tilpasset miljø." }, "customEnvironment": { "message": "Tilpasset miljø" @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Boks timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Vælg hvornår din boks skal udføre timeout-handlingen." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Anbefales af sikkerhedshensyn." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lås med hovedadgangskode ved genstart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutter" }, - "vaultTimeoutPolicyInEffect": { - "message": "Organisationspolitikkerne har fastsat den maksimalt tilladte boks-timeout til $HOURS$ time(r) og $MINUTES$ minut(ter).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ time(r) og $MINUTES$ minut(ter) maks.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Tekst-Sends" }, + "allowScreenshots": { + "message": "Tillad skærmoptagelse" + }, + "allowScreenshotsDesc": { + "message": "Tillad skærmoptagelse af Bitwarden-computerprogrammet." + }, "ssoError": { "message": "Ingen ledige porte fundet til SSO-login." }, diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 3809a8b5c60..6f64e8cfcf6 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Einstellungen" }, + "accountEmail": { + "message": "E-Mail-Adresse des Kontos" + }, + "requestHint": { + "message": "Hinweis anfragen" + }, + "requestPasswordHint": { + "message": "Passwort-Hinweis anfragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" + }, "passwordHint": { "message": "Passwort-Hinweis" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Tresor-Timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Wähle, wann der Timeout deines Tresors aktiviert werden soll und welche Aktion er bewirken soll." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Erfolgreich kopiert" }, "errorRefreshingAccessToken": { "message": "Zugangs-Token Aktualisierungsfehler" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Aus Sicherheitsgründen empfohlen." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Beim Neustart mit Master-Passwort sperren" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Sperren", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papierkorb", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuten" }, - "vaultTimeoutPolicyInEffect": { - "message": "Deine Unternehmensrichtlinien haben das maximal zulässige Tresor-Timeout auf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) festgelegt.", + "vaultTimeoutPolicyInEffect1": { + "message": "Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n).", "placeholders": { "hours": { "content": "$1", @@ -3062,10 +3077,16 @@ "textSends": { "message": "Text-Sends" }, + "allowScreenshots": { + "message": "Bildschirmaufnahme erlauben" + }, + "allowScreenshotsDesc": { + "message": "Bildschirmaufnahme der Bitwarden Desktop-Anwendung erlauben." + }, "ssoError": { "message": "Es konnten keine freien Ports für die SSO-Anmeldung gefunden werden." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Datei auf Gerät gespeichert. Greife darauf über die Downloads deines Geräts zu." } } diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index 8d2381113a4..f9093d904b8 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Ρυθμίσεις" }, + "accountEmail": { + "message": "Email λογαριασμού" + }, + "requestHint": { + "message": "Αίτηση υπόδειξης" + }, + "requestPasswordHint": { + "message": "Υπόδειξη κωδικού πρόσβασης" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου του λογαριασμού σας και θα σας αποσταλεί η υπόδειξη κωδικού πρόσβασης" + }, "passwordHint": { "message": "Υπόδειξη κωδικού πρόσβασης" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Χρονικό όριο λήξης κρύπτης" }, + "vaultTimeout1": { + "message": "Χρονικό όριο" + }, "vaultTimeoutDesc": { "message": "Επιλέξτε πότε η κρύπτη σας θα αναλάβει τη δράση χρονικού ορίου λήξης κρύπτης." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Επιτυχής Αντιγραφή" }, "errorRefreshingAccessToken": { "message": "Σφάλμα Ανανέωσης Διακριτικού Πρόσβασης" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Συνίσταται για ασφάλεια." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Κλείδωμα με τον κύριο κωδικό πρόσβασης κατά την επανεκκίνηση" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Κλείδωμα", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Κάδος Απορριμάτων", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Λεπτά" }, - "vaultTimeoutPolicyInEffect": { - "message": "Οι πολιτικές του οργανισμού σας έχουν ορίσει το μέγιστο επιτρεπόμενο χρονικό όριο λήξης θησαυ/κίου σε $HOURS$ ώρα(ες) και $MINUTES$ λεπτό(α).", + "vaultTimeoutPolicyInEffect1": { + "message": "Μέγιστο $HOURS$ ώρα(-ες) και $MINUTES$ λεπτό(-α).", "placeholders": { "hours": { "content": "$1", @@ -3062,10 +3077,16 @@ "textSends": { "message": "Send κειμένων" }, + "allowScreenshots": { + "message": "Να επιτρέπεται η καταγραφή οθόνης" + }, + "allowScreenshotsDesc": { + "message": "Να επιτρέπεται η καταγραφή οθόνης της εφαρμογής Bitwarden για υπολογιστή." + }, "ssoError": { "message": "Δεν βρέθηκαν ελεύθερες θύρες για τη σύνδεση sso." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Το αρχείο αποθηκεύτηκε στη συσκευή. Διαχείριση από τις λήψεις της συσκευής σας." } } diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 52a3b3bcfd2..5718f6a4d6f 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 5e9ba349580..cefbda1c65c 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will timeout and perform the selected action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 3967a01d894..4d7fdbefa1e 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Agordoj" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Ŝlosi", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Rubujo", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutoj" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 2209d663492..937c60ba0c8 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Ajustes" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista de contraseña" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Tiempo de espera de la caja fuerte excedido" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Elije cuando se agotará el tiempo de espera de tu caja fuerte y se ejecutará la acción seleccionada." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recomendado por seguridad." }, - "lockWithMasterPassOnRestart": { - "message": "Bloquear con contraseña maestra al reiniciar" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Eliminar cuenta" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papelera", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutos" }, - "vaultTimeoutPolicyInEffect": { - "message": "Las políticas de tu organización están afectando el tiempo de espera de tu caja fuerte. El máximo permitido de espera es de $HOURS$ hora(s) y de $MINUTES$ minuto(s)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 76d1b4dc763..51790cd9a08 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Seaded" }, + "accountEmail": { + "message": "Konto e-maili aadress" + }, + "requestHint": { + "message": "Küsi vihjet" + }, + "requestPasswordHint": { + "message": "Küsi ülemparooli vihjet" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Sisesta oma e-maili aadress ja sulle saadetakse sinna parooli vihje" + }, "passwordHint": { "message": "Parooli vihje" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Hoidla ajalõpp" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Vali millal saabub hoidla ajalõpp ning sooritatakse valitud tegevus." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopeerimine Õnnestus" }, "errorRefreshingAccessToken": { "message": "Juurdepääsukoodi Värskendamine Ebaõnnestus" @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Soovitatud turvalisuse huvides." }, - "lockWithMasterPassOnRestart": { - "message": "Lukusta ülemparooliga, kui rakendus taaskäivitatakse" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Kustuta konto" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lukusta", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prügikast", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutit" }, - "vaultTimeoutPolicyInEffect": { - "message": "Organisatsiooni poliitikad mõjutavad sinu hoidla ajalõppu. Maksimaalne lubatud hoidla ajalõpp on $HOURS$ tund(i) ja $MINUTES$ minut(it)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,10 +3077,16 @@ "textSends": { "message": "Kõik Tekst-Sendid" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "SSO-ga sisselogimiseks ei leitud ühtegi vaba porti." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Fail salvestatud. Halda oma seadmesse allalaaditud faile." } } diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 612db0c7f34..b3b09045df0 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Ezarpenak" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pasahitza gogoratzeko pista" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Kutxa gotorraren itxaronaldia" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Aukeratu kutxa gotorraren itxaronaldia eta egingo den ekintza." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "Berrabiaraztean pasahitz nagusiarekin blokeatu" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Ezabatu kontua" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Blokeatu", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Zakarrontzia", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutu" }, - "vaultTimeoutPolicyInEffect": { - "message": "Zure erakundearen politikek zure itxaronaldiari eragiten diote. Itxaronaldiak gehienez ere $HOURS$ ordu eta $MINUTES$ minutu izango ditu", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 1d6d82185d7..def7de712cd 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "تنظیمات" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "یادآور کلمه عبور" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "متوقف شدن گاو‌صندوق" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "انتخاب کنید که گاو‌صندوق شما چه زمانی عمل توقف زمانی گاوصندوق را انجام دهد." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "برای امنیت توصیه می‌شود." }, - "lockWithMasterPassOnRestart": { - "message": "در زمان شروع مجدد، با کلمه عبور اصلی قفل کن" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "حذف حساب" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "قفل", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "زباله‌ها", @@ -2087,8 +2102,8 @@ "minutes": { "message": "دقیقه" }, - "vaultTimeoutPolicyInEffect": { - "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index adc8c092334..430aaf6c7fe 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Asetukset" }, + "accountEmail": { + "message": "Tilin sähköpostiosoite" + }, + "requestHint": { + "message": "Pyydä vihje" + }, + "requestPasswordHint": { + "message": "Pyydä pääsalasanan vihje" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" + }, "passwordHint": { "message": "Salasanavihje" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Holvin aikakatkaisu" }, + "vaultTimeout1": { + "message": "Aikakatkaisu" + }, "vaultTimeoutDesc": { "message": "Määritä milloin holvin aikakatkaisutoiminto suoritetaan." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiointi onnistui" }, "errorRefreshingAccessToken": { "message": "Käyttötunnisteen päivitysvirhe" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Suositeltavaa parempaa suojausta varten." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lukitse pääsalasanalla uudelleenkäynnistyksen yhteydessä" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lukitse", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Roskakori", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuuttia" }, - "vaultTimeoutPolicyInEffect": { - "message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tunti(a) $MINUTES$ minuutti(a).", + "vaultTimeoutPolicyInEffect1": { + "message": "Enintään $HOURS$ tunti(a) ja $MINUTES$ minuutti(a).", "placeholders": { "hours": { "content": "$1", @@ -2857,7 +2872,7 @@ "message": "Tiedoston salasana on virheellinen. Käytä vientitiedoston luonnin yhteydessä syötettyä salasanaa." }, "destination": { - "message": "Määränpää" + "message": "Kohde" }, "learnAboutImportOptions": { "message": "Lue lisää tuontivaihtoehdoista" @@ -3062,10 +3077,16 @@ "textSends": { "message": "Teksti-Sendit" }, + "allowScreenshots": { + "message": "Salli kuvankaappaus" + }, + "allowScreenshotsDesc": { + "message": "Salli kuvankaappaus Bitwardenin työpöytäsovelluksesta." + }, "ssoError": { "message": "Kertakirjautumiselle ei löytynyt vapaita portteja." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Tiedosto tallennettiin laitteelle. Hallitse sitä laitteesi latauksista." } } diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 28c5673877f..9ffce18230c 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Mga Preperensya" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Mungkahi sa Password" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Piliin kung kailan gagawin ng iyong vault ang vault timeout action." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "I-lock gamit ang master password sa restart" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Tanggalin ang account" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "I-lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Basurahan", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Mga Minuto" }, - "vaultTimeoutPolicyInEffect": { - "message": "Ang iyong mga patakaran sa organisasyon ay nakakaapekto sa iyong vault timeout. Ang maximum na pinapayagang timeout ng vault ay $HOURS$ oras (mga) oras at $MINUTES$ (mga) minuto", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index fe170607562..7913b80723a 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Paramètres" }, + "accountEmail": { + "message": "Courriel du compte" + }, + "requestHint": { + "message": "Demander l'indice" + }, + "requestPasswordHint": { + "message": "Obtenir l'indice du mot de passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Saisissez l'adresse courriel de votre compte et votre indice de mot de passe vous sera envoyé" + }, "passwordHint": { "message": "Indice pour le mot de passe" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Délai d'expiration du coffre" }, + "vaultTimeout1": { + "message": "Délai dépassé" + }, "vaultTimeoutDesc": { "message": "Choisissez quand votre coffre réalisera l'action d'expiration." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommandé pour la sécurité." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Verrouiller avec le mot de passe principal au redémarrage" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Verrouiller", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Corbeille", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Les politiques de sécurité de votre organisation ont défini le délai d'expiration de votre coffre à $HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Autoriser les captures d'écran" + }, + "allowScreenshotsDesc": { + "message": "Autoriser la capture d'écran de l'application de bureau Bitwarden." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index 9194fd7c22a..46c89b933c5 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 886755f53cd..77c0e2390f3 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "הגדרות" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "רמז לסיסמה" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "סגירת כספת אוטומטית" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "בחר כמה זמן יעבור כדי שהכספת תסגר לאחר חוסר פעילות ותבצע את הפעולה שנבחרה." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "מומלץ לשיפור אבטחת מידע." }, - "lockWithMasterPassOnRestart": { - "message": "נעל בעזרת הסיסמה הראשית בהפעלה מחדש" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "מחק חשבון" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "נעילה", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "סל המחזור", @@ -2087,8 +2102,8 @@ "minutes": { "message": "דקות" }, - "vaultTimeoutPolicyInEffect": { - "message": "מדיניות הארגון שלך משפיעה על הזמן הקצוב לכספת שלך. פסק הזמן המרבי המותר לכספת הוא $HOURS$ שע(ה/ות) ו $MINUTES$ דק(ה/ות)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index eff28e11158..22d898222a0 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index 46ea20d8bfe..f5bb74f14c6 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Postavke" }, + "accountEmail": { + "message": "e-pošta računa" + }, + "requestHint": { + "message": "Zatraži podsjetnik" + }, + "requestPasswordHint": { + "message": "Zatraži podsjetnik lozinke" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Unesi svoju adresu e-pošte računa i poslat ćemo ti tvoj podsjetnik" + }, "passwordHint": { "message": "Podsjetnik za lozinku" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Istek trezora" }, + "vaultTimeout1": { + "message": "Vrijeme isteka" + }, "vaultTimeoutDesc": { "message": "Odaberi kada će isteći trezor i koja će se radnja izvršiti." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiranje uspješno" }, "errorRefreshingAccessToken": { "message": "Pogreška osvježavanja tokena pristupa" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Preporučeno za sigurnost." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Zaključaj glavnom lozinkom kod svakog pokretanja" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Zaključaj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smeće", @@ -2087,8 +2102,8 @@ "minutes": { "message": "minuta" }, - "vaultTimeoutPolicyInEffect": { - "message": "Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je $HOURS$:$MINUTES$ h.", + "vaultTimeoutPolicyInEffect1": { + "message": "Najviše: $HOURS$:$MINUTES$", "placeholders": { "hours": { "content": "$1", @@ -3062,10 +3077,16 @@ "textSends": { "message": "Send tekstovi" }, + "allowScreenshots": { + "message": "Dozvoli snimanje zaslona" + }, + "allowScreenshotsDesc": { + "message": "Dozvoli snimanje zaslona Bitwarden aplikacije za stolna računala." + }, "ssoError": { "message": "Nisu nađeni slobodni portovi za SSO prijavu." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Datoteka spremljena na uređaj. Upravljaj u preuzimanjima svog uređaja." } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index 75fad919cd3..9080c66232d 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Beállítások" }, + "accountEmail": { + "message": "Fiók email cím" + }, + "requestHint": { + "message": "Tipp kérése" + }, + "requestPasswordHint": { + "message": "Jelszó emlékeztető kérése" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Adjuk meg fiók email címét és elküldésre kerül a jelszóra vonatkozó tipp." + }, "passwordHint": { "message": "Jelszó emlékeztető" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Széf időkifutás" }, + "vaultTimeout1": { + "message": "Időkifutás" + }, "vaultTimeoutDesc": { "message": "Válasszuk ki, hogy a széfnél mikor legyen időkifutás és a kiválasztott művelet végrehajtása." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "A másolás sikeres volt." }, "errorRefreshingAccessToken": { "message": "Hozzáférési vezérjel frissítési hiba" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Biztonsági szempontból ajánlott." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lezárás mesterjelszóval újraindításkor" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lezárás", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lomtár", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Perc" }, - "vaultTimeoutPolicyInEffect": { - "message": "A szervezeti házirendek hatással vannak a széf időkorlátjára. A széf időkorlátja legfeljebb $HOURS$ óra és $MINUTES$ perc lehet.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ óra és $MINUTES$ perc maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Szöveg küldés" }, + "allowScreenshots": { + "message": "Képernyőrögzítés engedélyezése" + }, + "allowScreenshotsDesc": { + "message": "A Bitwarden asztali alkalmazás képernyőfelvételének engedélyezése." + }, "ssoError": { "message": "Nem található szabad port az sso bejelentkezéshez." }, diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 15d11730eb8..3013a4dc8da 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Setelan" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Petunjuk Sandi" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Batas Waktu Brankas" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Pilih kapan brankas Anda akan timeout dan melakukan tindakan yang dipilih." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Direkomendasikan untuk keamanan." }, - "lockWithMasterPassOnRestart": { - "message": "Kunci dengan kata sandi utama saat komputer dihidupkan ulang" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Hapus akun" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Kunci", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Sampah", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Menit" }, - "vaultTimeoutPolicyInEffect": { - "message": "Kebijakan organisasi Anda memengaruhi waktu tunggu brankas. Waktu tunggu brankas maksimum yang diizinkan adalah $HOURS$ jam dan $MINUTES$ menit", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 7e5577b30d8..d701076da89 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Impostazioni" }, + "accountEmail": { + "message": "E-mail dell’account" + }, + "requestHint": { + "message": "Richiedi una dritta" + }, + "requestPasswordHint": { + "message": "Richiedi una dritta per la password" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Inserisci l'indirizzo e-mail dell'account e la dritta per la password ti sarà inviata" + }, "passwordHint": { "message": "Suggerimento per la password" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Timeout cassaforte" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Scegli quando la tua cassaforte eseguirà l'azione di timeout." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Copia riuscita" }, "errorRefreshingAccessToken": { "message": "Errore di aggiornamento del token di accesso" @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Consigliato per la sicurezza." }, - "lockWithMasterPassOnRestart": { - "message": "Blocca con password principale al riavvio" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Elimina account" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Blocca", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Cestino", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuti" }, - "vaultTimeoutPolicyInEffect": { - "message": "Le politiche della tua organizzazione hanno impostato il timeout massimo consentito della tua cassaforte su $HOURS$ ore e $MINUTES$ minuti.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Send Testo" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "Non è stato possibile trovare nessuna porta libera per il login Sso." }, diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index 2ca601a6a8b..694810550e3 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "設定" }, + "accountEmail": { + "message": "アカウントのメールアドレス" + }, + "requestHint": { + "message": "ヒントを要求" + }, + "requestPasswordHint": { + "message": "パスワードのヒントを要求する" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "アカウントのメールアドレスを入力すると、パスワードのヒントが送信されます" + }, "passwordHint": { "message": "パスワードのヒント" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "保管庫のタイムアウト" }, + "vaultTimeout1": { + "message": "タイムアウト" + }, "vaultTimeoutDesc": { "message": "保管庫がタイムアウトし、選択したアクションを実行するタイミングを選択します。" }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "セキュリティ向上のためおすすめします。" }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "再起動時にマスターパスワードでロック" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "ロック", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ごみ箱", @@ -2087,8 +2102,8 @@ "minutes": { "message": "分" }, - "vaultTimeoutPolicyInEffect": { - "message": "あなたの組織ポリシーは保管庫のタイムアウトに影響を与えています。最大保管庫のタイムアウト時間は $HOURS$ 時間 $MINUTES$ 分です。", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ 時間と $MINUTES$ 分が最大です。", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "テキスト Send" }, + "allowScreenshots": { + "message": "スクリーンショットを許可" + }, + "allowScreenshotsDesc": { + "message": "Bitwarden デスクトップアプリのスクリーンショットを許可します。" + }, "ssoError": { "message": "SSO ログインのための空きポートが見つかりませんでした。" }, diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 9194fd7c22a..46c89b933c5 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 9194fd7c22a..46c89b933c5 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index b19fe2730fb..eaac20a3edf 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "ಸೆಟ್ಟಿಂಗ್‍ಗಳು" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "ವಾಲ್ಟ್ ಕಾಲಾವಧಿ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "ನಿಮ್ಮ ಕಮಾನು ಸಮಯ ಮೀರಲಿ ಮತ್ತು ಆಯ್ದ ಕ್ರಮವನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಆರಿಸಿಕೊಳ್ಳಿ." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "ಮರುಪ್ರಾರಂಭಿಸಿದಾಗ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್‌ನೊಂದಿಗೆ ಲಾಕ್ ಮಾಡಿ" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Delete account" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "ಲಾಕ್‌", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ಅನುಪಯುಕ್ತ", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 5efb24b9054..18b215447ba 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "설정" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "비밀번호 힌트" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "보관함 시간 제한" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "보관함이 언제까지 시간을 제한하고 선택된 행동을 수행하지 선택해주세요." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "다시 시작 시 마스터 비밀번호로 잠금" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "계정 삭제" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "잠금", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "휴지통", @@ -2087,8 +2102,8 @@ "minutes": { "message": "분" }, - "vaultTimeoutPolicyInEffect": { - "message": "조직 정책이 보관함 제한 시간에 영향을 미치고 있습니다. 최대 허용 보관함 제한 시간은 $HOURS$시간 $MINUTES$분입니다", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 6e94ed65b8e..a52fa5de68f 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Nustatymai" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Slaptažodžio užuomina" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Atsijungta nuo saugyklos" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Pasirinkite kada jūsų saugykla įvykdys laiko limito veiksmą." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Rekomenduojama dėl saugumo." }, - "lockWithMasterPassOnRestart": { - "message": "Užrakinti su pagrindiniu slaptažodžiu perkrovus" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Ištrinti paskyrą" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Užrakinti", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Šiukšliadėžė", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minučių" }, - "vaultTimeoutPolicyInEffect": { - "message": "Jūsų organizacijos politika pakeitė didžiausią leidžiamą saugyklos laiko limitą į $HOURS$ valandas(-ų) ir $MINUTES$ minutes(-čių).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 081ff83b9f4..04095d43a39 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Iestatījumi" }, + "accountEmail": { + "message": "Konta e-pasta adrese" + }, + "requestHint": { + "message": "Pieprasīt norādi" + }, + "requestPasswordHint": { + "message": "Pieprasīt paroles norādi" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosūtīta" + }, "passwordHint": { "message": "Paroles norāde" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Glabātavas noildze" }, + "vaultTimeout1": { + "message": "Noildze" + }, "vaultTimeoutDesc": { "message": "Izvēlēties, kad glabātavai iestāsies noildze un tiks izpildīta atlasītā darbība." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Ieteicams drošībai." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Aizslēgt ar galveno paroli pēc pārsāknēšanas" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Aizslēgt", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Atkritne", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minūtes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Apvienības nosacījumi ietekmē glabātavas noildzi. Lielākā atļautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minūte(s)", + "vaultTimeoutPolicyInEffect1": { + "message": "Ne vairāk kā $HOURS$ stunda(s) un $MINUTES$ minūte(s).", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Teksta Send" }, + "allowScreenshots": { + "message": "Atļaut ekrāna tveršanu" + }, + "allowScreenshotsDesc": { + "message": "Atļaut Bitwarden darbvirsmas lietotnes ekrāna tveršanu." + }, "ssoError": { "message": "Netika atrasti brīvi vienotās (SSO) pieteikšanās porti." }, diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index 848d796f146..217876fe76d 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Podešavanja" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Podsjetnik na lozinku" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "Zaključajte glavnom lozinkom pri ponovnom pokretanju" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Delete account" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index abc7d873e44..317925f9ae1 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "ക്രമീകരണങ്ങള്‍" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "പാസ്സ്‌വേഡ് സൂചനാ" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "വാൾട് ടൈംഔട്ട്" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "തങ്ങളുടെ വാൾട് എപ്പോൾ ടൈംഔട്ട് ആകും എന്ന് നിശ്ചയിക്കുക. തിരഞ്ഞെടുത്ത പ്രവർത്തനം നടത്തുക." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "പുനരാരംഭിക്കുമ്പോൾ പ്രാഥമിക പാസ്‌വേഡ് ഉപയോഗിച്ച് പൂട്ടുക" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Delete account" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "പൂട്ടുക", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ട്രാഷ്", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index 9194fd7c22a..46c89b933c5 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index 5f2ec86f595..32e42abe616 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index 335a7ceec5b..5faa9df24ca 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Innstillinger" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Passordhint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Tidsavbrudd i hvelvet" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Velg når hvelvet ditt skal tidsavbrytes og utføre den valgte handlingen." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Anbefalt for sikkerhet." }, - "lockWithMasterPassOnRestart": { - "message": "Lås med hovedpassord ved omstart" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Slett konto" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutter" }, - "vaultTimeoutPolicyInEffect": { - "message": "Organisasjonens retningslinjer påvirker tidsavbruddet for hvelvet ditt. Maksimalt tillatt tidsavbrudd for hvelv er $HOURS$ time(r) og $MINUTES$ minutt(er)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 113d90d32a6..37befac5bf8 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 7936d15b960..276985ce3a8 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Instellingen" }, + "accountEmail": { + "message": "E-mailadres van account" + }, + "requestHint": { + "message": "Hint vragen" + }, + "requestPasswordHint": { + "message": "Hoofdwachtwoordhint vragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" + }, "passwordHint": { "message": "Wachtwoordhint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Time-out van de kluis" }, + "vaultTimeout1": { + "message": "Time-out" + }, "vaultTimeoutDesc": { "message": "Stel de time-out van de kluis en de bijbehorende actie in." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiëren gelukt" }, "errorRefreshingAccessToken": { "message": "Fout bij vernieuwen toegangstoken" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Aanbevolen voor veiligheid." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Bij herstart vergrendelen met hoofdwachtwoord" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Vergrendelen", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prullenbak", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuten" }, - "vaultTimeoutPolicyInEffect": { - "message": "Het beleid van je organisatie heeft invloed op de time-out van je kluis. De maximaal toegestane Kluis Time-out is $HOURS$ uur en $MINUTES$ minuten", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ uren en $MINUTES$ minu(u)t(en) maximaal.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Tekst-Sends" }, + "allowScreenshots": { + "message": "Schermopname toestaan" + }, + "allowScreenshotsDesc": { + "message": "Schermopnames van de Bitwarden-desktopapplicatie toestaan." + }, "ssoError": { "message": "Er zijn geen vrije poorten gevonden voor de sso-login." }, diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 558cc4bbc79..0f7340c8c15 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Innstillingar" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Passordhint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Tidsavbrot for kvelv" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkorg", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index 0a1e42c2253..cd28e8ac91b 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index ef352115ba1..3e29f2e9107 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Ustawienia" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Podpowiedź do hasła" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Blokowanie sejfu" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Wybierz, kiedy sejf zostanie zablokowany i wykonaj następującą akcję." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Zalecane dla bezpieczeństwa." }, - "lockWithMasterPassOnRestart": { - "message": "Zablokuj hasłem głównym po uruchomieniu ponownym" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Usuń konto" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Zablokuj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kosz", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuty" }, - "vaultTimeoutPolicyInEffect": { - "message": "Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index f2ce6154299..7282812682f 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Configurações" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Dica da Senha" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Tempo Limite do Cofre" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Escolha quando o tempo limite do seu cofre irá se esgotar e execute a ação selecionada." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recomendado para segurança." }, - "lockWithMasterPassOnRestart": { - "message": "Bloquear com senha mestra ao reiniciar" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Excluir conta" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixeira", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutos" }, - "vaultTimeoutPolicyInEffect": { - "message": "As políticas da sua organização definiram o tempo limite máximo permitido do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Texto enviado" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "Nenhuma porta livre foi encontrada para o cliente final." }, diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index a92f4c54b47..69babd217c5 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Definições" }, + "accountEmail": { + "message": "E-mail da conta" + }, + "requestHint": { + "message": "Pedir dica" + }, + "requestPasswordHint": { + "message": "Pedir dica da palavra-passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-á enviada a sua dica da palavra-passe" + }, "passwordHint": { "message": "Dica da palavra-passe" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Tempo limite do cofre" }, + "vaultTimeout1": { + "message": "Tempo limite" + }, "vaultTimeoutDesc": { "message": "Escolha quando é que o seu cofre executará a ação de tempo limite do cofre." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Cópia bem-sucedida" }, "errorRefreshingAccessToken": { "message": "Erro no acesso ao token de atualização" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recomendado por segurança." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Bloquear com a palavra-passe mestra ao reiniciar" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixo", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutos" }, - "vaultTimeoutPolicyInEffect": { - "message": "As políticas da sua organização definiram o tempo limite máximo permitido do cofre de $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hora(s) e $MINUTES$ minuto(s) no máximo.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Sends de texto" }, + "allowScreenshots": { + "message": "Permitir a captura de ecrã" + }, + "allowScreenshotsDesc": { + "message": "Permitir a captura de ecrã da aplicação para computador do Bitwarden." + }, "ssoError": { "message": "Não foi possível encontrar portas livres para o início de sessão sso." }, diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 0ba398daa80..42cc3839f93 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Setări" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Indiciu parolă" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Timp de expirare seif" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Alegeți când seiful dvs. va efectua acțiunea de expirare a seifului." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "Blocare cu parola principală la repornire" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Ștergere cont" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Blocare", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Coș de reciclare", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minute" }, - "vaultTimeoutPolicyInEffect": { - "message": "Politicile organizației afectează timpul de expirare a seifului. Timpul maxim de expirare a seifului este de $HOURS$ oră(e) și $MINUTES$ minut(e)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 2a23e96c5f6..47516c9c5a8 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Настройки" }, + "accountEmail": { + "message": "Email аккаунта" + }, + "requestHint": { + "message": "Запросить подсказку" + }, + "requestPasswordHint": { + "message": "Запросить подсказку к паролю" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Введите email вашего аккаунта, и вам будет отправлена подсказка для пароля" + }, "passwordHint": { "message": "Подсказка к паролю" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Тайм-аут хранилища" }, + "vaultTimeout1": { + "message": "Тайм-аут" + }, "vaultTimeoutDesc": { "message": "Выберите тайм-аут для хранилища и действие, которое необходимо предпринять." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Рекомендуется для обеспечения безопасности." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Блокировать мастер-паролем при перезапуске" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Блокировка", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Корзина", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Мин." }, - "vaultTimeoutPolicyInEffect": { - "message": "В соответствии с политиками вашей организации максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.", + "vaultTimeoutPolicyInEffect1": { + "message": "Максимум $HOURS$ час. $MINUTES$ мин.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Текстовая Send" }, + "allowScreenshots": { + "message": "Разрешить скриншоты" + }, + "allowScreenshotsDesc": { + "message": "Разрешить скриншоты в Bitwarden для компьютера." + }, "ssoError": { "message": "Не удалось найти свободные порты для авторизации SSO." }, diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index c310cbf9c05..8788d231165 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "සැකසුම්" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 516c13cc86b..749c26dd169 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -524,10 +524,10 @@ "message": "Znovu zadajte hlavné heslo" }, "masterPassHint": { - "message": "Nápoveď k hlavnému heslo (voliteľné)" + "message": "Nápoveď k hlavnému heslu (voliteľné)" }, "masterPassHintText": { - "message": "Ak zabudnete heslo, na váš e-mail môžete dostať pomôcku k heslu. Zadaných $CURRENT$ znakov, limit je $MAXIMUM$.", + "message": "Ak zabudnete heslo, na váš e-mail môžete dostať nápoveď k heslu. Zadaných $CURRENT$ znakov, limit je $MAXIMUM$.", "placeholders": { "current": { "content": "$1", @@ -549,7 +549,7 @@ "message": "Potvrdiť hlavné heslo" }, "masterPassHintLabel": { - "message": "Nápoveda pre hlavné heslo" + "message": "Nápoveď k hlavnému heslu" }, "joinOrganization": { "message": "Pripojte sa k organizácii" @@ -560,11 +560,23 @@ "settings": { "message": "Nastavenia" }, + "accountEmail": { + "message": "E-mail účtu" + }, + "requestHint": { + "message": "Požiadať o nápoveď" + }, + "requestPasswordHint": { + "message": "Požiadať o nápoveď k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadajte e-mailovú adresu účtu a zašleme vám nápoveď k heslu" + }, "passwordHint": { "message": "Nápoveď k heslu" }, "enterEmailToGetHint": { - "message": "Zadajte emailovú adresu na zaslanie nápovede pre vaše hlavné heslo." + "message": "Zadajte emailovú adresu na zaslanie nápovede k vášmu hlavnému heslu." }, "getMasterPasswordHint": { "message": "Získať nápoveď k hlavnému heslu" @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Časový limit pre trezor" }, + "vaultTimeout1": { + "message": "Časový limit" + }, "vaultTimeoutDesc": { "message": "Vyberte, kedy vyprší časový limit trezora a vykoná sa zvolená akcia." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Odporúča sa z hľadiska bezpečnosti." }, - "lockWithMasterPassOnRestart": { - "message": "Pri reštarte zamknúť s hlavným heslom" + "lockWithMasterPassOnRestart1": { + "message": "Pri reštarte zamknúť hlavným heslom" }, "deleteAccount": { "message": "Odstrániť účet" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Uzamknúť", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kôš", @@ -1661,7 +1676,7 @@ "message": "Odhlásenie bude vyžadovať online prihlásenie po vypršaní časového limitu. Naozaj chcete použiť toto nastavenie?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Potvrdenie akcie pre vypršaný časový limit" + "message": "Potvrdenie akcie pri vypršaní časového limitu" }, "enterpriseSingleSignOn": { "message": "Jednotné prihlásenie pre podniky (SSO)" @@ -1835,7 +1850,7 @@ "message": "Z dôvodu podnikovej politiky máte obmedzené ukladanie položiek do osobného trezora. Zmeňte možnosť vlastníctvo na organizáciu a vyberte si z dostupných zbierok." }, "hintEqualsPassword": { - "message": "Nápoveda pre heslo nemôže byť rovnaká ako heslo." + "message": "Nápoveď k heslu nemôže byť rovnaká ako heslo." }, "personalOwnershipPolicyInEffect": { "message": "Politika organizácie ovplyvňuje vaše možnosti vlastníctva." @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minúty" }, - "vaultTimeoutPolicyInEffect": { - "message": "Zásady vašej organizácie ovplyvňujú časový limit trezoru. Maximálny povolený časový limit trezoru je $HOURS$ h a $MINUTES$ m", + "vaultTimeoutPolicyInEffect1": { + "message": "Maximálne $HOURS$ hod. a $MINUTES$ min.", "placeholders": { "hours": { "content": "$1", @@ -2299,7 +2314,7 @@ "message": "Vytvoriť e-mailový alias pomocou externej služby preposielania." }, "forwarderError": { - "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "message": "$SERVICENAME$ chyba: $ERRORMESSAGE$", "description": "Reports an error returned by a forwarding service to the user.", "placeholders": { "servicename": { @@ -2313,11 +2328,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "Vygenerované s Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "Webstránka: $WEBSITE$. Vygenerované s Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -2327,7 +2342,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Neplatný token API $SERVICENAME$", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -2337,7 +2352,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Neplatný token API $SERVICENAME$: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2351,7 +2366,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "Nepodarilo sa získať ID maskovaného e-mailového účtu $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -2361,7 +2376,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "Neplatná doména $SERVICENAME$.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -2371,7 +2386,7 @@ } }, "forwarderNoUrl": { - "message": "Invalid $SERVICENAME$ url.", + "message": "Neplatná url adresa $SERVICENAME$.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -2381,7 +2396,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Vyskytla sa neznáma chyba $SERVICENAME$.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -2391,7 +2406,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "Nepodporovaná služba: '$SERVICENAME$'.", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -3062,6 +3077,12 @@ "textSends": { "message": "Textové Sendy" }, + "allowScreenshots": { + "message": "Povoliť snímanie obrazovky" + }, + "allowScreenshotsDesc": { + "message": "Povoliť snímanie obsahu aplikácie Bitwarden Desktop." + }, "ssoError": { "message": "Pre prihlásenie SSO sa nepodarilo nájsť žiadne voľné porty." }, diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 28bbd3b483e..46a8c103200 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Nastavitve" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Namig za geslo" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Časovna omejitev trezorja" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "Zakleni z glavnim geslom ob ponovnem zagonu" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Delete account" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minute" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 39e4a1015f2..85649f0cafc 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Подешавања" }, + "accountEmail": { + "message": "Имејл налога" + }, + "requestHint": { + "message": "Захтевај савет" + }, + "requestPasswordHint": { + "message": "Затражити савет лозинке" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Унесите имејл свог налога и биће вам послат савет за лозинку" + }, "passwordHint": { "message": "Савет главне лозинке" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Тајмаут сефа" }, + "vaultTimeout1": { + "message": "Време трајања" + }, "vaultTimeoutDesc": { "message": "Изаберите када ће сеф истећи и извршити одабрану радњу." }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Успешно копирање" }, "errorRefreshingAccessToken": { "message": "Грешка при освежавању токена приступа" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Препоручује се за сигурност." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Закључајте са главном лозинком при поновном покретању" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Закључај", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Отпад", @@ -1733,7 +1748,7 @@ "message": "Ваша нова главна лозинка не испуњава захтеве полисе." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "Добијајте савете, најаве и могућности истраживања од Bitwarden-а у пријемном сандучету." }, "unsubscribe": { "message": "Одјави се" @@ -2087,8 +2102,8 @@ "minutes": { "message": "Минута" }, - "vaultTimeoutPolicyInEffect": { - "message": "Полиса ваше организације утиче на време истека сефа. Максимално дозвољено време истека је $HOURS$ сат(и) и $MINUTES$ minut(а)", + "vaultTimeoutPolicyInEffect1": { + "message": "Макимум $HOURS$ сат(а) и $MINUTES$ минут(а).", "placeholders": { "hours": { "content": "$1", @@ -3062,10 +3077,16 @@ "textSends": { "message": "Текст „Send“" }, + "allowScreenshots": { + "message": "Дозволи снимање екрана" + }, + "allowScreenshotsDesc": { + "message": "Дозволи снимање екрана Bitwarden десктоп апликације." + }, "ssoError": { - "message": "No free ports could be found for the sso login." + "message": "Нису пронађени портови за SSO пријаву." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Датотека је сачувана на уређају. Управљајте преузимањима са свог уређаја." } } diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index dea1a265714..a31f1f3310b 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Inställningar" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Begär ledtråd" + }, + "requestPasswordHint": { + "message": "Begär lösenordsledtråd" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Lösenordsledtråd" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Valvets tidsgräns" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Välj när valvets tidsgräns överskrids och den valda åtgärden utförs." }, @@ -1409,7 +1424,7 @@ "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "exportTypeHeading": { - "message": "Export type" + "message": "Exporttyp" }, "accountRestricted": { "message": "Account restricted" @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Rekommenderas för säkerhet." }, - "lockWithMasterPassOnRestart": { - "message": "Lås med huvudlösenordet vid omstart" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Radera konto" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papperskorgen", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minuter" }, - "vaultTimeoutPolicyInEffect": { - "message": "Dina organisationsprinciper påverkar ditt valvs tid för timeout. Maximal tillåten tid innan timeout är $HOURS$ timme(ar) och $MINUTES$ minut(er)", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index 9194fd7c22a..46c89b933c5 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Settings" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index 8a08fd5a993..30da79efc8e 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "การตั้งค่า" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "คำใบ้รหัสผ่าน" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "หมดเวลาล็อกตู้เซฟ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Choose when your vault will take the vault timeout action." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Minutes" }, - "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index 49d885f45b3..af22a36b2af 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Ayarlar" }, + "accountEmail": { + "message": "Hesap e-posta adresi" + }, + "requestHint": { + "message": "İpucunu iste" + }, + "requestPasswordHint": { + "message": "Parola ipucunu iste" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Hesabınızın e-posta adresini girdiğinizde parola ipucunuz size gönderilecektir" + }, "passwordHint": { "message": "Parola ipucu" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Kasa zaman aşımı" }, + "vaultTimeout1": { + "message": "Zaman aşımı" + }, "vaultTimeoutDesc": { "message": "Kasa zaman aşımı eyleminin ne zaman gerçekleştirileceğini seçin." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Güvenliğiniz için önerilir." }, - "lockWithMasterPassOnRestart": { - "message": "Yeniden başlatmada ana şifre ile kilitle" + "lockWithMasterPassOnRestart1": { + "message": "Yeniden başlatmada ana parola ile kilitle" }, "deleteAccount": { "message": "Hesabı sil" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Kilitle", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Çöp kutusu", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Dakika" }, - "vaultTimeoutPolicyInEffect": { - "message": "Kuruluş ilkeleriniz izin verilen maksimum kasa zaman aşımını $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.", + "vaultTimeoutPolicyInEffect1": { + "message": "En fazla $HOURS$ saat $MINUTES$ dakika.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Metin Send'leri" }, + "allowScreenshots": { + "message": "Ekran kaydına izin ver" + }, + "allowScreenshotsDesc": { + "message": "Bitwarden masaüstü uygulamasının ekran kaydının alınmasına izin ver." + }, "ssoError": { "message": "SSO girişi için açık port bulunamadı." }, diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index 2a792478744..3a218e47dea 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Налаштування" }, + "accountEmail": { + "message": "Е-пошта облікового запису" + }, + "requestHint": { + "message": "Підказка для запиту" + }, + "requestPasswordHint": { + "message": "Підказка для запиту пароля" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Введіть адресу е-пошти свого облікового запису і вам буде надіслано підказку для пароля" + }, "passwordHint": { "message": "Підказка для пароля" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Час очікування сховища" }, + "vaultTimeout1": { + "message": "Час очікування" + }, "vaultTimeoutDesc": { "message": "Оберіть дію, яка виконається після завершення часу очікування сховища." }, @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "Рекомендовано для безпеки." }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "Блокувати головним паролем при перезапуску" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Блокувати", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Смітник", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Хвилин" }, - "vaultTimeoutPolicyInEffect": { - "message": "Політикою вашої організації встановлено максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ год і $MINUTES$ хв максимум.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Відправлення тексту" }, + "allowScreenshots": { + "message": "Дозволити захоплення екрана" + }, + "allowScreenshotsDesc": { + "message": "Дозволити захоплення екрана для комп'ютерної програми Bitwarden." + }, "ssoError": { "message": "Не знайдено вільних портів для цього входу SSO." }, diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 26cc73ba81a..854cb697fa2 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "Cài đặt" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Gợi ý mật khẩu" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "Thời gian mở kho" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "Chọn khi nào thì kho của bạn sẽ hết thời gian chờ và thực hiện hành động đã được chọn." }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Đề xuất để tăng cường bảo mật." }, - "lockWithMasterPassOnRestart": { - "message": "Khóa với mật khẩu chính khi khởi động lại" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "Xóa tài khoản" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "Khóa", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Thùng rác", @@ -2087,8 +2102,8 @@ "minutes": { "message": "Phút" }, - "vaultTimeoutPolicyInEffect": { - "message": "Tổ chức của bạn đã đặt thời gian mở kho tối đa là $HOURS$ giờ và $MINUTES$ phút.", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Gửi tin nhắn" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "Không thể tìm thấy cổng trống để đăng nhập SSO." }, diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 1c2fb3d5bee..a2a650dbc9e 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "设置" }, + "accountEmail": { + "message": "账户邮件地址" + }, + "requestHint": { + "message": "请求提示" + }, + "requestPasswordHint": { + "message": "请求密码提示" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "输入您的账户电子邮件地址,您的密码提示将发送给您" + }, "passwordHint": { "message": "密码提示" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "密码库超时时间" }, + "vaultTimeout1": { + "message": "超时" + }, "vaultTimeoutDesc": { "message": "选择您的密码库何时执行密码库超时动作。" }, @@ -1286,7 +1301,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "复制成功" }, "errorRefreshingAccessToken": { "message": "访问令牌刷新错误" @@ -1555,7 +1570,7 @@ "recommendedForSecurity": { "message": "安全起见,推荐设置。" }, - "lockWithMasterPassOnRestart": { + "lockWithMasterPassOnRestart1": { "message": "重启后使用主密码锁定" }, "deleteAccount": { @@ -1633,7 +1648,7 @@ }, "lock": { "message": "锁定", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "回收站", @@ -2087,8 +2102,8 @@ "minutes": { "message": "分钟" }, - "vaultTimeoutPolicyInEffect": { - "message": "您的组织策略已将您最大允许的密码库超时时间设置为 $HOURS$ 小时 $MINUTES$ 分钟。", + "vaultTimeoutPolicyInEffect1": { + "message": "最多 $HOURS$ 小时 $MINUTES$ 分钟", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "文本 Send" }, + "allowScreenshots": { + "message": "允许截屏" + }, + "allowScreenshotsDesc": { + "message": "允许对 Bitwarden 桌面应用程序截屏。" + }, "ssoError": { "message": "找不到用于 SSO 登录的可用端口。" }, diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 984986bf94c..a24be1b0c39 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -560,6 +560,18 @@ "settings": { "message": "設定" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "密碼提示" }, @@ -930,6 +942,9 @@ "vaultTimeout": { "message": "密碼庫逾時時間" }, + "vaultTimeout1": { + "message": "Timeout" + }, "vaultTimeoutDesc": { "message": "選擇密碼庫何時執行密碼庫逾時動作。" }, @@ -1555,8 +1570,8 @@ "recommendedForSecurity": { "message": "Recommended for security." }, - "lockWithMasterPassOnRestart": { - "message": "重啟後使用主密碼鎖定" + "lockWithMasterPassOnRestart1": { + "message": "Lock with master password on restart" }, "deleteAccount": { "message": "刪除帳戶" @@ -1633,7 +1648,7 @@ }, "lock": { "message": "鎖定", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "垃圾桶", @@ -2087,8 +2102,8 @@ "minutes": { "message": "分鐘" }, - "vaultTimeoutPolicyInEffect": { - "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。", + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -3062,6 +3077,12 @@ "textSends": { "message": "Text Sends" }, + "allowScreenshots": { + "message": "Allow screen capture" + }, + "allowScreenshotsDesc": { + "message": "Allow screen capture of the Bitwarden desktop application." + }, "ssoError": { "message": "No free ports could be found for the sso login." }, From 0516ca00dc9d22dbe3856bd5b82cf261b5e8f14c Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Fri, 20 Sep 2024 09:48:44 -0500 Subject: [PATCH 073/104] update trial initiation text to only represent the product (#11171) Co-authored-by: Alec Rippberger --- .../resolver/free-trial-text.resolver.spec.ts | 55 ++++++------------- .../resolver/free-trial-text.resolver.ts | 31 ++--------- apps/web/src/locales/en/messages.json | 39 ++----------- 3 files changed, 27 insertions(+), 98 deletions(-) diff --git a/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.spec.ts b/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.spec.ts index f9831c6dc47..2c58d614c51 100644 --- a/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.spec.ts +++ b/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.spec.ts @@ -1,6 +1,6 @@ import { ActivatedRouteSnapshot, RouterStateSnapshot } from "@angular/router"; -import { ProductTierType, ProductType } from "@bitwarden/common/billing/enums"; +import { ProductType } from "@bitwarden/common/billing/enums"; import { freeTrialTextResolver } from "./free-trial-text.resolver"; @@ -11,48 +11,25 @@ const route = { const routerStateSnapshot = {} as RouterStateSnapshot; describe("freeTrialTextResolver", () => { - [ - { - param: ProductType.PasswordManager, - keyBase: "startYour7DayFreeTrialOfBitwardenPasswordManager", - }, - { - param: ProductType.SecretsManager, - keyBase: "startYour7DayFreeTrialOfBitwardenSecretsManager", - }, - { - param: `${ProductType.PasswordManager},${ProductType.SecretsManager}`, - keyBase: "startYour7DayFreeTrialOfBitwarden", - }, - ].forEach(({ param, keyBase }) => { - describe(`when product is ${param}`, () => { - beforeEach(() => { - route.queryParams.product = `${param}`; - }); + it("shows password manager text", () => { + route.queryParams.product = `${ProductType.PasswordManager}`; - it("returns teams trial text", () => { - route.queryParams.productTier = ProductTierType.Teams; + expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe( + "continueSettingUpFreeTrialPasswordManager", + ); + }); - expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe(`${keyBase}ForTeams`); - }); + it("shows secret manager text", () => { + route.queryParams.product = `${ProductType.SecretsManager}`; - it("returns enterprise trial text", () => { - route.queryParams.productTier = ProductTierType.Enterprise; + expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe( + "continueSettingUpFreeTrialSecretsManager", + ); + }); - expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe(`${keyBase}ForEnterprise`); - }); + it("shows default text", () => { + route.queryParams.product = `${ProductType.PasswordManager},${ProductType.SecretsManager}`; - it("returns families trial text", () => { - route.queryParams.productTier = ProductTierType.Families; - - expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe(`${keyBase}ForFamilies`); - }); - - it("returns default trial text", () => { - route.queryParams.productTier = ""; - - expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe(keyBase); - }); - }); + expect(freeTrialTextResolver(route, routerStateSnapshot)).toBe("continueSettingUpFreeTrial"); }); }); diff --git a/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.ts b/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.ts index 7dec807fd45..cd23ef5ff7e 100644 --- a/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.ts +++ b/apps/web/src/app/auth/trial-initiation/complete-trial-initiation/resolver/free-trial-text.resolver.ts @@ -1,43 +1,22 @@ import { ActivatedRouteSnapshot, ResolveFn } from "@angular/router"; -import { ProductType, ProductTierType } from "@bitwarden/common/billing/enums"; +import { ProductType } from "@bitwarden/common/billing/enums"; export const freeTrialTextResolver: ResolveFn = ( route: ActivatedRouteSnapshot, ): string | null => { - const { product, productTier } = route.queryParams; + const { product } = route.queryParams; const products: ProductType[] = (product ?? "").split(",").map((p: string) => parseInt(p)); const onlyPasswordManager = products.length === 1 && products[0] === ProductType.PasswordManager; const onlySecretsManager = products.length === 1 && products[0] === ProductType.SecretsManager; - const forTeams = parseInt(productTier) === ProductTierType.Teams; - const forEnterprise = parseInt(productTier) === ProductTierType.Enterprise; - const forFamilies = parseInt(productTier) === ProductTierType.Families; switch (true) { - case onlyPasswordManager && forTeams: - return "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams"; - case onlyPasswordManager && forEnterprise: - return "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise"; - case onlyPasswordManager && forFamilies: - return "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies"; case onlyPasswordManager: - return "startYour7DayFreeTrialOfBitwardenPasswordManager"; - case onlySecretsManager && forTeams: - return "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams"; - case onlySecretsManager && forEnterprise: - return "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise"; - case onlySecretsManager && forFamilies: - return "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies"; + return "continueSettingUpFreeTrialPasswordManager"; case onlySecretsManager: - return "startYour7DayFreeTrialOfBitwardenSecretsManager"; - case forTeams: - return "startYour7DayFreeTrialOfBitwardenForTeams"; - case forEnterprise: - return "startYour7DayFreeTrialOfBitwardenForEnterprise"; - case forFamilies: - return "startYour7DayFreeTrialOfBitwardenForFamilies"; + return "continueSettingUpFreeTrialSecretsManager"; default: - return "startYour7DayFreeTrialOfBitwarden"; + return "continueSettingUpFreeTrial"; } }; diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index cc2754b6d60..52291a20a7d 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" From 972339be837e4757bbca92d0202673eba09d671d Mon Sep 17 00:00:00 2001 From: Justin Baur <19896123+justindbaur@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:46:00 -0400 Subject: [PATCH 074/104] Remove Storage Reseed FF (#11156) --- .../browser/src/background/main.background.ts | 17 +- .../src/background/runtime.background.ts | 19 +- .../browser-local-storage.service.spec.ts | 192 ------------------ .../services/browser-local-storage.service.ts | 132 +----------- libs/common/src/enums/feature-flag.enum.ts | 2 - 5 files changed, 6 insertions(+), 356 deletions(-) delete mode 100644 apps/browser/src/platform/services/browser-local-storage.service.spec.ts diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 62d83b19009..18883a5fe5e 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1484,14 +1484,7 @@ export default class MainBackground { }); if (needStorageReseed) { - await this.reseedStorage( - await firstValueFrom( - this.configService.userCachedFeatureFlag$( - FeatureFlag.StorageReseedRefactor, - userBeingLoggedOut, - ), - ), - ); + await this.reseedStorage(); } if (BrowserApi.isManifestVersion(3)) { @@ -1546,7 +1539,7 @@ export default class MainBackground { await SafariApp.sendMessageToApp("showPopover", null, true); } - async reseedStorage(doFillBuffer: boolean) { + async reseedStorage() { if ( !this.platformUtilsService.isChrome() && !this.platformUtilsService.isVivaldi() && @@ -1555,11 +1548,7 @@ export default class MainBackground { return; } - if (doFillBuffer) { - await this.storageService.fillBuffer(); - } else { - await this.storageService.reseed(); - } + await this.storageService.fillBuffer(); } async clearClipboard(clipboardValue: string, clearMs: number) { diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 1ec7edcc30c..3e0933942b5 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -1,4 +1,4 @@ -import { firstValueFrom, map, mergeMap, of, switchMap } from "rxjs"; +import { firstValueFrom, map, mergeMap } from "rxjs"; import { LockService } from "@bitwarden/auth/common"; import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service"; @@ -281,22 +281,7 @@ export default class RuntimeBackground { await this.main.refreshMenu(); break; case "bgReseedStorage": { - const doFillBuffer = await firstValueFrom( - this.accountService.activeAccount$.pipe( - switchMap((account) => { - if (account == null) { - return of(false); - } - - return this.configService.userCachedFeatureFlag$( - FeatureFlag.StorageReseedRefactor, - account.id, - ); - }), - ), - ); - - await this.main.reseedStorage(doFillBuffer); + await this.main.reseedStorage(); break; } case "authResult": { diff --git a/apps/browser/src/platform/services/browser-local-storage.service.spec.ts b/apps/browser/src/platform/services/browser-local-storage.service.spec.ts deleted file mode 100644 index 13e26c26ddd..00000000000 --- a/apps/browser/src/platform/services/browser-local-storage.service.spec.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { objToStore } from "./abstractions/abstract-chrome-storage-api.service"; -import BrowserLocalStorageService, { - RESEED_IN_PROGRESS_KEY, -} from "./browser-local-storage.service"; - -const apiGetLike = - (store: Record) => (key: string, callback: (items: { [key: string]: any }) => void) => { - if (key == null) { - callback(store); - } else { - callback({ [key]: store[key] }); - } - }; - -describe("BrowserLocalStorageService", () => { - let service: BrowserLocalStorageService; - let store: Record; - let changeListener: (changes: { [key: string]: chrome.storage.StorageChange }) => void; - - let saveMock: jest.Mock; - let getMock: jest.Mock; - let clearMock: jest.Mock; - let removeMock: jest.Mock; - - beforeEach(() => { - store = {}; - - // Record change listener - chrome.storage.local.onChanged.addListener = jest.fn((listener) => { - changeListener = listener; - }); - - service = new BrowserLocalStorageService(); - - // setup mocks - getMock = chrome.storage.local.get as jest.Mock; - getMock.mockImplementation(apiGetLike(store)); - saveMock = chrome.storage.local.set as jest.Mock; - saveMock.mockImplementation((update, callback) => { - Object.entries(update).forEach(([key, value]) => { - store[key] = value; - }); - callback(); - }); - clearMock = chrome.storage.local.clear as jest.Mock; - clearMock.mockImplementation((callback) => { - store = {}; - callback?.(); - }); - removeMock = chrome.storage.local.remove as jest.Mock; - removeMock.mockImplementation((keys, callback) => { - if (Array.isArray(keys)) { - keys.forEach((key) => { - delete store[key]; - }); - } else { - delete store[keys]; - } - - callback(); - }); - }); - - afterEach(() => { - chrome.runtime.lastError = undefined; - jest.resetAllMocks(); - }); - - describe("reseed", () => { - it.each([ - { - key1: objToStore("value1"), - key2: objToStore("value2"), - key3: null, - }, - {}, - ])("saves all data in storage %s", async (testStore) => { - for (const key of Object.keys(testStore) as Array) { - store[key] = testStore[key]; - } - await service.reseed(); - - expect(saveMock).toHaveBeenLastCalledWith( - { ...testStore, [RESEED_IN_PROGRESS_KEY]: objToStore(true) }, - expect.any(Function), - ); - }); - - it.each([ - { - key1: objToStore("value1"), - key2: objToStore("value2"), - key3: null, - }, - {}, - ])("results in the same store %s", async (testStore) => { - for (const key of Object.keys(testStore) as Array) { - store[key] = testStore[key]; - } - await service.reseed(); - - expect(store).toEqual(testStore); - }); - - it("converts non-serialized values to serialized", async () => { - store.key1 = "value1"; - store.key2 = "value2"; - - const expectedStore = { - key1: objToStore("value1"), - key2: objToStore("value2"), - reseedInProgress: objToStore(true), - }; - - await service.reseed(); - - expect(saveMock).toHaveBeenLastCalledWith(expectedStore, expect.any(Function)); - }); - - it("clears data", async () => { - await service.reseed(); - - expect(clearMock).toHaveBeenCalledTimes(1); - }); - - it("throws if get has chrome.runtime.lastError", async () => { - getMock.mockImplementation((key, callback) => { - chrome.runtime.lastError = new Error("Get Test Error"); - callback(); - }); - - await expect(async () => await service.reseed()).rejects.toThrow("Get Test Error"); - }); - - it("throws if save has chrome.runtime.lastError", async () => { - saveMock.mockImplementation((obj, callback) => { - chrome.runtime.lastError = new Error("Save Test Error"); - callback(); - }); - - await expect(async () => await service.reseed()).rejects.toThrow("Save Test Error"); - }); - }); - - describe.each(["get", "has", "save", "remove"] as const)("%s", (method) => { - let interval: string | number | NodeJS.Timeout; - - afterEach(() => { - if (interval) { - clearInterval(interval); - } - }); - - function startReseed() { - store[RESEED_IN_PROGRESS_KEY] = objToStore(true); - } - - function endReseed() { - delete store[RESEED_IN_PROGRESS_KEY]; - changeListener({ reseedInProgress: { oldValue: true } }); - } - - it("waits for reseed prior to operation", async () => { - startReseed(); - - const promise = service[method]("key", "value"); // note "value" is only used in save, but ignored in other methods - - await expect(promise).not.toBeFulfilled(10); - - endReseed(); - - await expect(promise).toBeResolved(); - }); - - it("does not wait if reseed is not in progress", async () => { - const promise = service[method]("key", "value"); - await expect(promise).toBeResolved(1); - }); - - it("awaits prior reseed operations before starting a new one", async () => { - startReseed(); - - const promise = service.reseed(); - - await expect(promise).not.toBeFulfilled(10); - - endReseed(); - - await expect(promise).toBeResolved(); - }); - }); -}); diff --git a/apps/browser/src/platform/services/browser-local-storage.service.ts b/apps/browser/src/platform/services/browser-local-storage.service.ts index 15cf26d1fbd..61a2653f137 100644 --- a/apps/browser/src/platform/services/browser-local-storage.service.ts +++ b/apps/browser/src/platform/services/browser-local-storage.service.ts @@ -1,35 +1,8 @@ -import { defer, filter, firstValueFrom, map, merge, throwError, timeout } from "rxjs"; - -import AbstractChromeStorageService, { - SerializedValue, - objToStore, -} from "./abstractions/abstract-chrome-storage-api.service"; - -export const RESEED_IN_PROGRESS_KEY = "reseedInProgress"; +import AbstractChromeStorageService from "./abstractions/abstract-chrome-storage-api.service"; export default class BrowserLocalStorageService extends AbstractChromeStorageService { constructor() { super(chrome.storage.local); - this.chromeStorageApi.remove(RESEED_IN_PROGRESS_KEY, () => { - return; - }); - } - - /** - * Reads, clears, and re-saves all data in local storage. This is a hack to remove previously stored sensitive data from - * local storage logs. - * - * @see https://github.com/bitwarden/clients/issues/485 - */ - async reseed(): Promise { - try { - await this.save(RESEED_IN_PROGRESS_KEY, true); - const data = await this.getAll(); - await this.clear(); - await this.saveAll(data); - } finally { - await super.remove(RESEED_IN_PROGRESS_KEY); - } } async fillBuffer() { @@ -71,107 +44,4 @@ export default class BrowserLocalStorageService extends AbstractChromeStorageSer ); }); } - - override async get(key: string): Promise { - await this.awaitReseed(); - return super.get(key); - } - - override async has(key: string): Promise { - await this.awaitReseed(); - return super.has(key); - } - - override async save(key: string, obj: any): Promise { - await this.awaitReseed(); - return super.save(key, obj); - } - - override async remove(key: string): Promise { - await this.awaitReseed(); - return super.remove(key); - } - - private async awaitReseed(): Promise { - const notReseeding = async () => { - return !(await super.get(RESEED_IN_PROGRESS_KEY)); - }; - - const finishedReseeding = this.updates$.pipe( - filter(({ key, updateType }) => key === RESEED_IN_PROGRESS_KEY && updateType === "remove"), - map(() => true), - ); - - await firstValueFrom( - merge(defer(notReseeding), finishedReseeding).pipe( - filter((v) => v), - timeout({ - // We eventually need to give up and throw an error - first: 5_000, - with: () => - throwError( - () => new Error("Reseeding local storage did not complete in a timely manner."), - ), - }), - ), - ); - } - - /** - * Clears local storage - */ - private async clear() { - return new Promise((resolve, reject) => { - this.chromeStorageApi.clear(() => { - if (chrome.runtime.lastError) { - return reject(chrome.runtime.lastError); - } - resolve(); - }); - }); - } - - /** - * Retrieves all objects stored in local storage. - * - * @remarks This method processes values prior to resolving, do not use `chrome.storage.local` directly - * @returns Promise resolving to keyed object of all stored data - */ - private async getAll(): Promise> { - return new Promise((resolve, reject) => { - this.chromeStorageApi.get(null, (allStorage) => { - if (chrome.runtime.lastError) { - return reject(chrome.runtime.lastError); - } - - const resolved = Object.entries(allStorage).reduce( - (agg, [key, value]) => { - agg[key] = this.processGetObject(value); - return agg; - }, - {} as Record, - ); - resolve(resolved); - }); - }); - } - - private async saveAll(data: Record): Promise { - return new Promise((resolve, reject) => { - const keyedData = Object.entries(data).reduce( - (agg, [key, value]) => { - agg[key] = objToStore(value); - return agg; - }, - {} as Record, - ); - this.chromeStorageApi.set(keyedData, () => { - if (chrome.runtime.lastError) { - return reject(chrome.runtime.lastError); - } - - resolve(); - }); - }); - } } diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index e7ece5b36a7..3d426aee3b7 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -34,7 +34,6 @@ export enum FeatureFlag { AccountDeprovisioning = "pm-10308-account-deprovisioning", NotificationBarAddLoginImprovements = "notification-bar-add-login-improvements", AC2476_DeprecateStripeSourcesAPI = "AC-2476-deprecate-stripe-sources-api", - StorageReseedRefactor = "storage-reseed-refactor", CipherKeyEncryption = "cipher-key-encryption", } @@ -77,7 +76,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.GenerateIdentityFillScriptRefactor]: FALSE, [FeatureFlag.EnableNewCardCombinedExpiryAutofill]: FALSE, [FeatureFlag.DelayFido2PageScriptInitWithinMv2]: FALSE, - [FeatureFlag.StorageReseedRefactor]: FALSE, [FeatureFlag.AccountDeprovisioning]: FALSE, [FeatureFlag.NotificationBarAddLoginImprovements]: FALSE, [FeatureFlag.AC2476_DeprecateStripeSourcesAPI]: FALSE, From ea025b9026b1b35f8ab662d8369192c0fbabccd1 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Fri, 20 Sep 2024 08:49:27 -0700 Subject: [PATCH 075/104] add padding to new organization input (#11090) --- .../app/billing/organizations/organization-plans.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.html b/apps/web/src/app/billing/organizations/organization-plans.component.html index 498374aa14b..5992af5f544 100644 --- a/apps/web/src/app/billing/organizations/organization-plans.component.html +++ b/apps/web/src/app/billing/organizations/organization-plans.component.html @@ -11,7 +11,7 @@ {{ "licenseFile" | i18n }} -
+
From cf1f7cc61da2466a4ff6e750a6cdc9b3b1df68c9 Mon Sep 17 00:00:00 2001 From: Robyn MacCallum Date: Fri, 20 Sep 2024 12:54:03 -0400 Subject: [PATCH 076/104] [SM-1302] Initial config page (#10196) * Initial config page * Remove project actions * Add copy projectId method to the project page * Update bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts Co-authored-by: Maciej Zieniuk <167752252+mzieniukbw@users.noreply.github.com> * Update bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts Co-authored-by: Maciej Zieniuk <167752252+mzieniukbw@users.noreply.github.com> * Update apps/web/src/locales/en/messages.json Co-authored-by: Maciej Zieniuk <167752252+mzieniukbw@users.noreply.github.com> * Fix method and string naming * Ensure config component load logic happens after params observed * Remove projectId emitted event * Update bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts Co-authored-by: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> * Adjust load function * Fix config translation * Remove unnecceary async from copy functions * Add project ID translation key * Update bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts Co-authored-by: Maciej Zieniuk <167752252+mzieniukbw@users.noreply.github.com> * Simplify load function * Simplify variable definition * Add all machine account projects to the config page * Update bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts Co-authored-by: Maciej Zieniuk <167752252+mzieniukbw@users.noreply.github.com> * Remove unused variable * Remove revision date in config project list --------- Co-authored-by: Maciej Zieniuk <167752252+mzieniukbw@users.noreply.github.com> Co-authored-by: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> --- apps/web/src/locales/en/messages.json | 18 +++ .../models/view/project-list.view.ts | 1 + .../projects/project.service.ts | 1 + .../config/config.component.html | 47 +++++++ .../config/config.component.ts | 127 ++++++++++++++++++ .../service-account.component.html | 1 + .../service-accounts-routing.module.ts | 5 + .../service-accounts.module.ts | 2 + .../shared/projects-list.component.html | 36 ++++- .../shared/projects-list.component.ts | 12 ++ .../shared/sm-shared.module.ts | 6 + 11 files changed, 249 insertions(+), 7 deletions(-) create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.html create mode 100644 bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 52291a20a7d..06d42c4265d 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -9002,6 +9002,24 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, "learnMoreAboutEmergencyAccess": { "message":"Learn more about emergency access" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts index 03a03533520..5f0aa9647cf 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts @@ -6,4 +6,5 @@ export class ProjectListView { revisionDate: string; read: boolean; write: boolean; + linkable: boolean; } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts index 3b4add0c363..282980ece78 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts @@ -131,6 +131,7 @@ export class ProjectService { ); projectListView.creationDate = s.creationDate; projectListView.revisionDate = s.revisionDate; + projectListView.linkable = true; return projectListView; }), ); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.html new file mode 100644 index 00000000000..b17e47a39ec --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.html @@ -0,0 +1,47 @@ +
+
+

{{ "environmentVariables" | i18n }}

+
+ + {{ "identityUrl" | i18n }} + + + + + {{ "apiUrl" | i18n }} + + + +
+ + {{ "organizationId" | i18n }} + + + +
+
+

{{ "projectIds" | i18n }}

+

{{ "projectsNoItemsTitle" | i18n }}

+

{{ "projectsAccessedByMachineAccount" | i18n }}

+ +
+
+
+ +
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts new file mode 100644 index 00000000000..47deeb2a418 --- /dev/null +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts @@ -0,0 +1,127 @@ +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute, Params } from "@angular/router"; +import { Subject, concatMap, takeUntil } from "rxjs"; + +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { ToastService } from "@bitwarden/components"; + +import { ProjectListView } from "../../models/view/project-list.view"; +import { ProjectService } from "../../projects/project.service"; +import { AccessPolicyService } from "../../shared/access-policies/access-policy.service"; + +class ServiceAccountConfig { + organizationId: string; + serviceAccountId: string; + identityUrl: string; + apiUrl: string; + projects: ProjectListView[]; +} + +@Component({ + selector: "sm-service-account-config", + templateUrl: "./config.component.html", +}) +export class ServiceAccountConfigComponent implements OnInit, OnDestroy { + identityUrl: string; + apiUrl: string; + organizationId: string; + serviceAccountId: string; + projects: ProjectListView[]; + hasProjects = false; + + private destroy$ = new Subject(); + loading = true; + + constructor( + private environmentService: EnvironmentService, + private route: ActivatedRoute, + private platformUtilsService: PlatformUtilsService, + private toastService: ToastService, + private i18nService: I18nService, + private projectService: ProjectService, + private accessPolicyService: AccessPolicyService, + ) {} + + async ngOnInit() { + this.route.params + .pipe( + concatMap(async (params: Params) => { + return await this.load(params.organizationId, params.serviceAccountId); + }), + takeUntil(this.destroy$), + ) + .subscribe((smConfig) => { + this.identityUrl = smConfig.identityUrl; + this.apiUrl = smConfig.apiUrl; + this.organizationId = smConfig.organizationId; + this.serviceAccountId = smConfig.serviceAccountId; + this.projects = smConfig.projects; + + this.hasProjects = smConfig.projects.length > 0; + this.loading = false; + }); + } + + async load(organizationId: string, serviceAccountId: string): Promise { + const environment = await this.environmentService.getEnvironment(); + + const allProjects = await this.projectService.getProjects(organizationId); + const policies = await this.accessPolicyService.getServiceAccountGrantedPolicies( + organizationId, + serviceAccountId, + ); + + const projects = policies.grantedProjectPolicies.map((policy) => { + return { + id: policy.accessPolicy.grantedProjectId, + name: policy.accessPolicy.grantedProjectName, + organizationId: organizationId, + linkable: allProjects.some( + (project) => project.id === policy.accessPolicy.grantedProjectId, + ), + } as ProjectListView; + }); + + return { + organizationId: organizationId, + serviceAccountId: serviceAccountId, + identityUrl: environment.getIdentityUrl(), + apiUrl: environment.getApiUrl(), + projects: projects, + } as ServiceAccountConfig; + } + + copyIdentityUrl = () => { + this.platformUtilsService.copyToClipboard(this.identityUrl); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("valueCopied", this.i18nService.t("identityUrl")), + }); + }; + + copyApiUrl = () => { + this.platformUtilsService.copyToClipboard(this.apiUrl); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("valueCopied", this.i18nService.t("apiUrl")), + }); + }; + + copyOrganizationId = () => { + this.platformUtilsService.copyToClipboard(this.organizationId); + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("valueCopied", this.i18nService.t("organizationId")), + }); + }; + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html index c9ce8d8c64c..392bfcb806b 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.html @@ -29,6 +29,7 @@
{{ "eventLogs" | i18n }} + {{ "config" | i18n }} - +
- {{ - project.name - }} +
+ {{ project.name }} + {{ project.name }} +
+ {{ project.id }} + +
+
- {{ project.revisionDate | date: "medium" }} + + {{ project.revisionDate | date: "medium" }} + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts index 8c6a5e97dc4..2d01908a365 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts @@ -24,6 +24,8 @@ export class ProjectsListComponent { } private _projects: ProjectListView[]; + @Input() showMenus?: boolean = true; + @Input() set search(search: string) { this.selection.clear(); @@ -33,6 +35,7 @@ export class ProjectsListComponent { @Output() editProjectEvent = new EventEmitter(); @Output() deleteProjectEvent = new EventEmitter(); @Output() newProjectEvent = new EventEmitter(); + @Output() copiedProjectUUIdEvent = new EventEmitter(); selection = new SelectionModel(true, []); protected dataSource = new TableDataSource(); @@ -90,4 +93,13 @@ export class ProjectsListComponent { } return false; } + + copyProjectUuidToClipboard(id: string) { + this.platformUtilsService.copyToClipboard(id); + this.platformUtilsService.showToast( + "success", + null, + this.i18nService.t("valueCopied", this.i18nService.t("projectId")), + ); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts index cb723af6d7d..d778db9814c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/sm-shared.module.ts @@ -1,10 +1,12 @@ import { NgModule } from "@angular/core"; import { + CardComponent, MultiSelectModule, SearchModule, SelectModule, NoItemsModule, + FormFieldModule, } from "@bitwarden/components"; import { CoreOrganizationModule } from "@bitwarden/web-vault/app/admin-console/organizations/core"; import { DynamicAvatarComponent } from "@bitwarden/web-vault/app/components/dynamic-avatar.component"; @@ -31,17 +33,21 @@ import { SecretsListComponent } from "./secrets-list.component"; DynamicAvatarComponent, SearchModule, HeaderModule, + CardComponent, + FormFieldModule, ], exports: [ AccessPolicySelectorComponent, BulkConfirmationDialogComponent, BulkStatusDialogComponent, + FormFieldModule, HeaderModule, NewMenuComponent, NoItemsModule, ProjectsListComponent, SearchModule, SecretsListComponent, + CardComponent, SelectModule, SharedModule, ], From 9b352c0cd8eadf2e50452703552e086879ff699a Mon Sep 17 00:00:00 2001 From: Jonathan Prusik Date: Fri, 20 Sep 2024 12:59:48 -0400 Subject: [PATCH 077/104] fix typography of change shortcut section text (#11163) --- .../browser/src/autofill/popup/settings/autofill.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.html b/apps/browser/src/autofill/popup/settings/autofill.component.html index 77f96612c85..81be74f7ddf 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.html +++ b/apps/browser/src/autofill/popup/settings/autofill.component.html @@ -107,7 +107,7 @@ @@ -30,13 +30,13 @@
- - -
{{ "options" | i18n }}
+
{{ "options" | i18n }}
- + {{ "length" | i18n }} - + {{ "numbersLabel" | i18n }}
- + {{ "avoidAmbiguous" | i18n }} +

{{ "generatorPolicyInEffect" | i18n }}

diff --git a/libs/tools/generator/components/src/password-settings.component.ts b/libs/tools/generator/components/src/password-settings.component.ts index e4f2bb57b8d..2553bba3f72 100644 --- a/libs/tools/generator/components/src/password-settings.component.ts +++ b/libs/tools/generator/components/src/password-settings.component.ts @@ -1,6 +1,6 @@ import { OnInit, Input, Output, EventEmitter, Component, OnDestroy } from "@angular/core"; import { FormBuilder } from "@angular/forms"; -import { BehaviorSubject, skip, takeUntil, Subject, map } from "rxjs"; +import { BehaviorSubject, takeUntil, Subject, map, filter, tap, debounceTime, skip } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserId } from "@bitwarden/common/types/guid"; @@ -17,7 +17,7 @@ const Controls = Object.freeze({ length: "length", uppercase: "uppercase", lowercase: "lowercase", - numbers: "numbers", + number: "number", special: "special", minNumber: "minNumber", minSpecial: "minSpecial", @@ -27,7 +27,7 @@ const Controls = Object.freeze({ /** Options group for passwords */ @Component({ standalone: true, - selector: "bit-password-settings", + selector: "tools-password-settings", templateUrl: "password-settings.component.html", imports: [DependenciesModule], }) @@ -54,6 +54,10 @@ export class PasswordSettingsComponent implements OnInit, OnDestroy { @Input() showHeader: boolean = true; + /** Number of milliseconds to wait before accepting user input. */ + @Input() + waitMs: number = 100; + /** Emits settings updates and completes if the settings become unavailable. * @remarks this does not emit the initial settings. If you would like * to receive live settings updates including the initial update, @@ -66,17 +70,34 @@ export class PasswordSettingsComponent implements OnInit, OnDestroy { [Controls.length]: [Generators.Password.settings.initial.length], [Controls.uppercase]: [Generators.Password.settings.initial.uppercase], [Controls.lowercase]: [Generators.Password.settings.initial.lowercase], - [Controls.numbers]: [Generators.Password.settings.initial.number], + [Controls.number]: [Generators.Password.settings.initial.number], [Controls.special]: [Generators.Password.settings.initial.special], [Controls.minNumber]: [Generators.Password.settings.initial.minNumber], [Controls.minSpecial]: [Generators.Password.settings.initial.minSpecial], [Controls.avoidAmbiguous]: [!Generators.Password.settings.initial.ambiguous], }); + private get numbers() { + return this.settings.get(Controls.number); + } + + private get special() { + return this.settings.get(Controls.special); + } + + private get minNumber() { + return this.settings.get(Controls.minNumber); + } + + private get minSpecial() { + return this.settings.get(Controls.minSpecial); + } + async ngOnInit() { const singleUserId$ = this.singleUserId$(); const settings = await this.generatorService.settings(Generators.Password, { singleUserId$ }); + // bind settings to the UI settings .pipe( map((settings) => { @@ -93,47 +114,41 @@ export class PasswordSettingsComponent implements OnInit, OnDestroy { this.settings.patchValue(s, { emitEvent: false }); }); - // the first emission is the current value; subsequent emissions are updates - settings.pipe(skip(1), takeUntil(this.destroyed$)).subscribe(this.onUpdated); - - /// + // bind policy to the template this.generatorService .policy$(Generators.Password, { userId$: singleUserId$ }) .pipe(takeUntil(this.destroyed$)) - .subscribe((policy) => { + .subscribe(({ constraints }) => { this.settings .get(Controls.length) - .setValidators(toValidators(Controls.length, Generators.Password, policy)); + .setValidators(toValidators(Controls.length, Generators.Password, constraints)); - this.settings - .get(Controls.minNumber) - .setValidators(toValidators(Controls.minNumber, Generators.Password, policy)); + this.minNumber.setValidators( + toValidators(Controls.minNumber, Generators.Password, constraints), + ); - this.settings - .get(Controls.minSpecial) - .setValidators(toValidators(Controls.minSpecial, Generators.Password, policy)); + this.minSpecial.setValidators( + toValidators(Controls.minSpecial, Generators.Password, constraints), + ); // forward word boundaries to the template (can't do it through the rx form) - // FIXME: move the boundary logic fully into the policy evaluator - this.minLength = policy.length?.min ?? Generators.Password.settings.constraints.length.min; - this.maxLength = policy.length?.max ?? Generators.Password.settings.constraints.length.max; - this.minMinNumber = - policy.minNumber?.min ?? Generators.Password.settings.constraints.minNumber.min; - this.maxMinNumber = - policy.minNumber?.max ?? Generators.Password.settings.constraints.minNumber.max; - this.minMinSpecial = - policy.minSpecial?.min ?? Generators.Password.settings.constraints.minSpecial.min; - this.maxMinSpecial = - policy.minSpecial?.max ?? Generators.Password.settings.constraints.minSpecial.max; + this.minLength = constraints.length.min; + this.maxLength = constraints.length.max; + this.minMinNumber = constraints.minNumber.min; + this.maxMinNumber = constraints.minNumber.max; + this.minMinSpecial = constraints.minSpecial.min; + this.maxMinSpecial = constraints.minSpecial.max; + + this.policyInEffect = constraints.policyInEffect; const toggles = [ - [Controls.length, policy.length.min < policy.length.max], - [Controls.uppercase, !policy.policy.useUppercase], - [Controls.lowercase, !policy.policy.useLowercase], - [Controls.numbers, !policy.policy.useNumbers], - [Controls.special, !policy.policy.useSpecial], - [Controls.minNumber, policy.minNumber.min < policy.minNumber.max], - [Controls.minSpecial, policy.minSpecial.min < policy.minSpecial.max], + [Controls.length, constraints.length.min < constraints.length.max], + [Controls.uppercase, !constraints.uppercase?.readonly], + [Controls.lowercase, !constraints.lowercase?.readonly], + [Controls.number, !constraints.number?.readonly], + [Controls.special, !constraints.special?.readonly], + [Controls.minNumber, constraints.minNumber.min < constraints.minNumber.max], + [Controls.minSpecial, constraints.minSpecial.min < constraints.minSpecial.max], ] as [keyof typeof Controls, boolean][]; for (const [control, enabled] of toggles) { @@ -141,9 +156,53 @@ export class PasswordSettingsComponent implements OnInit, OnDestroy { } }); + // cascade selections between checkboxes and spinboxes + // before the group saves their values + let lastMinNumber = 1; + this.numbers.valueChanges + .pipe( + filter((checked) => !(checked && this.minNumber.value > 0)), + map((checked) => (checked ? lastMinNumber : 0)), + takeUntil(this.destroyed$), + ) + .subscribe((value) => this.minNumber.setValue(value, { emitEvent: false })); + + this.minNumber.valueChanges + .pipe( + map((value) => [value, value > 0] as const), + tap(([value]) => (lastMinNumber = this.numbers.value ? value : lastMinNumber)), + takeUntil(this.destroyed$), + ) + .subscribe(([, checked]) => this.numbers.setValue(checked, { emitEvent: false })); + + let lastMinSpecial = 1; + this.special.valueChanges + .pipe( + filter((checked) => !(checked && this.minSpecial.value > 0)), + map((checked) => (checked ? lastMinSpecial : 0)), + takeUntil(this.destroyed$), + ) + .subscribe((value) => this.minSpecial.setValue(value, { emitEvent: false })); + + this.minSpecial.valueChanges + .pipe( + map((value) => [value, value > 0] as const), + tap(([value]) => (lastMinSpecial = this.special.value ? value : lastMinSpecial)), + takeUntil(this.destroyed$), + ) + .subscribe(([, checked]) => this.special.setValue(checked, { emitEvent: false })); + + // `onUpdated` depends on `settings` because the UserStateSubject is asynchronous; + // subscribing directly to `this.settings.valueChanges` introduces a race condition. + // skip the first emission because it's the initial value, not an update. + settings.pipe(skip(1), takeUntil(this.destroyed$)).subscribe(this.onUpdated); + // now that outputs are set up, connect inputs this.settings.valueChanges .pipe( + // debounce ensures rapid edits to a field, such as partial edits to a + // spinbox or rapid button clicks don't emit spurious generator updates + debounceTime(this.waitMs), map((settings) => { // interface is "avoid" while storage is "include" const s: any = { ...settings }; @@ -174,11 +233,14 @@ export class PasswordSettingsComponent implements OnInit, OnDestroy { /** attribute binding for minSpecial[max] */ protected maxMinSpecial: number; + /** display binding for enterprise policy notice */ + protected policyInEffect: boolean; + private toggleEnabled(setting: keyof typeof Controls, enabled: boolean) { if (enabled) { - this.settings.get(setting).enable(); + this.settings.get(setting).enable({ emitEvent: false }); } else { - this.settings.get(setting).disable(); + this.settings.get(setting).disable({ emitEvent: false }); } } diff --git a/libs/tools/generator/components/src/util.ts b/libs/tools/generator/components/src/util.ts index 07d6277c0c6..2049a285e25 100644 --- a/libs/tools/generator/components/src/util.ts +++ b/libs/tools/generator/components/src/util.ts @@ -1,5 +1,5 @@ import { ValidatorFn, Validators } from "@angular/forms"; -import { map, pairwise, pipe, skipWhile, startWith, takeWhile } from "rxjs"; +import { distinctUntilChanged, map, pairwise, pipe, skipWhile, startWith, takeWhile } from "rxjs"; import { AnyConstraint, Constraints } from "@bitwarden/common/tools/types"; import { UserId } from "@bitwarden/common/types/guid"; @@ -13,6 +13,7 @@ export function completeOnAccountSwitch() { pairwise(), takeWhile(([prev, next]) => (prev ?? next) === next), map(([_, id]) => id), + distinctUntilChanged(), ); } diff --git a/libs/tools/generator/core/src/data/default-password-generation-options.ts b/libs/tools/generator/core/src/data/default-password-generation-options.ts index 1c26fd8f951..7ddee5f8d8f 100644 --- a/libs/tools/generator/core/src/data/default-password-generation-options.ts +++ b/libs/tools/generator/core/src/data/default-password-generation-options.ts @@ -1,9 +1,10 @@ -import { PasswordGenerationOptions } from "../types"; +import { PasswordGenerationOptions, PasswordGeneratorSettings } from "../types"; import { DefaultPasswordBoundaries } from "./default-password-boundaries"; /** The default options for password generation. */ -export const DefaultPasswordGenerationOptions: Partial = Object.freeze({ +export const DefaultPasswordGenerationOptions: Partial & + PasswordGeneratorSettings = Object.freeze({ length: 14, minLength: DefaultPasswordBoundaries.length.min, ambiguous: true, diff --git a/libs/tools/generator/core/src/data/policies.ts b/libs/tools/generator/core/src/data/policies.ts index ed5e6c4e5a9..4d758fc4653 100644 --- a/libs/tools/generator/core/src/data/policies.ts +++ b/libs/tools/generator/core/src/data/policies.ts @@ -1,9 +1,11 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { + DynamicPasswordPolicyConstraints, passphraseLeastPrivilege, passwordLeastPrivilege, PassphraseGeneratorOptionsEvaluator, + PassphrasePolicyConstraints, PasswordGeneratorOptionsEvaluator, } from "../policies"; import { @@ -23,7 +25,7 @@ const PASSPHRASE = Object.freeze({ }), combine: passphraseLeastPrivilege, createEvaluator: (policy) => new PassphraseGeneratorOptionsEvaluator(policy), - createEvaluatorV2: (policy) => new PassphraseGeneratorOptionsEvaluator(policy), + toConstraints: (policy) => new PassphrasePolicyConstraints(policy), } as PolicyConfiguration); const PASSWORD = Object.freeze({ @@ -39,7 +41,7 @@ const PASSWORD = Object.freeze({ }), combine: passwordLeastPrivilege, createEvaluator: (policy) => new PasswordGeneratorOptionsEvaluator(policy), - createEvaluatorV2: (policy) => new PasswordGeneratorOptionsEvaluator(policy), + toConstraints: (policy) => new DynamicPasswordPolicyConstraints(policy), } as PolicyConfiguration); /** Policy configurations */ diff --git a/libs/tools/generator/core/src/policies/constraints.spec.ts b/libs/tools/generator/core/src/policies/constraints.spec.ts new file mode 100644 index 00000000000..38257bc314d --- /dev/null +++ b/libs/tools/generator/core/src/policies/constraints.spec.ts @@ -0,0 +1,280 @@ +import { Constraint } from "@bitwarden/common/tools/types"; + +import { + atLeast, + atLeastSum, + maybe, + maybeReadonly, + fitToBounds, + enforceConstant, + fitLength, + readonlyTrueWhen, + RequiresTrue, +} from "./constraints"; + +const SomeBooleanConstraint: Constraint = Object.freeze({}); + +describe("password generator constraint utilities", () => { + describe("atLeast", () => { + it("creates a minimum constraint when constraint is undefined", () => { + const result = atLeast(1); + + expect(result).toEqual({ min: 1 }); + }); + + it("returns the constraint when minimum is undefined", () => { + const constraint = {}; + const result = atLeast(undefined, constraint); + + expect(result).toBe(constraint); + }); + + it("adds a minimum member to a constraint", () => { + const result = atLeast(1, {}); + + expect(result).toEqual({ min: 1 }); + }); + + it("adjusts the minimum member of a constraint to the minimum value", () => { + const result = atLeast(2, { min: 1 }); + + expect(result).toEqual({ min: 2 }); + }); + + it("adjusts the maximum member of a constraint to the minimum value", () => { + const result = atLeast(2, { min: 0, max: 1 }); + + expect(result).toEqual({ min: 2, max: 2 }); + }); + + it("copies the constraint", () => { + const constraint = { min: 1, step: 1 }; + + const result = atLeast(1, constraint); + + expect(result).not.toBe(constraint); + expect(result).toEqual({ min: 1, step: 1 }); + }); + }); + + describe("atLeastSum", () => { + it("creates a minimum constraint", () => { + const result = atLeastSum(undefined, []); + + expect(result).toEqual({ min: 0 }); + }); + + it("creates a minimum constraint that is the sum of the dependencies' minimums", () => { + const result = atLeastSum(undefined, [{ min: 1 }, { min: 1 }]); + + expect(result).toEqual({ min: 2 }); + }); + + it("adds a minimum member to a constraint", () => { + const result = atLeastSum({}, []); + + expect(result).toEqual({ min: 0 }); + }); + + it("adjusts the minimum member of a constraint to the minimum sum", () => { + const result = atLeastSum({ min: 0 }, [{ min: 1 }]); + + expect(result).toEqual({ min: 1 }); + }); + + it("adjusts the maximum member of a constraint to the minimum sum", () => { + const result = atLeastSum({ min: 0, max: 1 }, [{ min: 2 }]); + + expect(result).toEqual({ min: 2, max: 2 }); + }); + + it("copies the constraint", () => { + const constraint = { step: 1 }; + + const result = atLeastSum(constraint, []); + + expect(result).not.toBe(constraint); + expect(result).toEqual({ min: 0, step: 1 }); + }); + }); + + describe("maybe", () => { + it("returns the constraint when it is enabled", () => { + const result = maybe(true, SomeBooleanConstraint); + + expect(result).toBe(SomeBooleanConstraint); + }); + + it("returns undefined when the constraint is disabled", () => { + const result = maybe(false, SomeBooleanConstraint); + + expect(result).toBeUndefined(); + }); + }); + + describe("maybeReadonly", () => { + it("returns the constraint when readonly is false", () => { + const result = maybeReadonly(false, SomeBooleanConstraint); + + expect(result).toBe(SomeBooleanConstraint); + }); + + it("adds a readonly member when readonly is true", () => { + const result = maybeReadonly(true, SomeBooleanConstraint); + + expect(result).toMatchObject({ readonly: true }); + }); + + it("copies the constraint when readonly is true", () => { + const result = maybeReadonly(true, { requiredValue: true }); + + expect(result).not.toBe(SomeBooleanConstraint); + expect(result).toMatchObject({ readonly: true, requiredValue: true }); + }); + + it("crates a readonly constraint when the input is undefined", () => { + const result = maybeReadonly(true); + + expect(result).not.toBe(SomeBooleanConstraint); + expect(result).toEqual({ readonly: true }); + }); + }); + + describe("fitToBounds", () => { + it("returns the value when the constraint is undefined", () => { + const result = fitToBounds(1, undefined); + + expect(result).toEqual(1); + }); + + it("applies the maximum bound", () => { + const result = fitToBounds(2, { max: 1 }); + + expect(result).toEqual(1); + }); + + it("applies the minimum bound", () => { + const result = fitToBounds(0, { min: 1 }); + + expect(result).toEqual(1); + }); + + it.each([[0], [1]])( + "returns 0 when value is undefined and 0 <= the maximum bound (= %p)", + (max) => { + const result = fitToBounds(undefined, { max }); + + expect(result).toEqual(0); + }, + ); + + it.each([[0], [-1]])( + "returns 0 when value is undefined and 0 >= the minimum bound (= %p)", + (min) => { + const result = fitToBounds(undefined, { min }); + + expect(result).toEqual(0); + }, + ); + + it("returns the maximum bound when value is undefined and 0 > the maximum bound", () => { + const result = fitToBounds(undefined, { max: -1 }); + + expect(result).toEqual(-1); + }); + + it("returns the minimum bound when value is undefined and 0 < the minimum bound", () => { + const result = fitToBounds(undefined, { min: 1 }); + + expect(result).toEqual(1); + }); + }); + + describe("fitLength", () => { + it("returns the value when the constraint is undefined", () => { + const result = fitLength("someValue", undefined); + + expect(result).toEqual("someValue"); + }); + + it.each([[null], [undefined]])( + "returns an empty string when the value is nullish (= %p)", + (value: string) => { + const result = fitLength(value, {}); + + expect(result).toEqual(""); + }, + ); + + it("applies the maxLength bound", () => { + const result = fitLength("some value", { maxLength: 4 }); + + expect(result).toEqual("some"); + }); + + it("applies the minLength bound", () => { + const result = fitLength("some", { minLength: 5 }); + + expect(result).toEqual("some "); + }); + + it("fills characters from the fillString", () => { + const result = fitLength("some", { minLength: 10 }, { fillString: " value" }); + + expect(result).toEqual("some value"); + }); + + it("repeats characters from the fillString", () => { + const result = fitLength("i", { minLength: 3 }, { fillString: "+" }); + + expect(result).toEqual("i++"); + }); + }); + + describe("enforceConstant", () => { + it("returns the requiredValue member from a readonly constraint", () => { + const result = enforceConstant(false, { readonly: true, requiredValue: true }); + + expect(result).toBeTruthy(); + }); + + it("returns undefined from a readonly constraint without a required value", () => { + const result = enforceConstant(false, { readonly: true }); + + expect(result).toBeUndefined(); + }); + + it.each([[{}], [{ readonly: false }]])( + "returns value when the constraint is writable (= %p)", + (constraint) => { + const result = enforceConstant(false, constraint); + + expect(result).toBeFalsy(); + }, + ); + + it("returns value when the constraint is undefined", () => { + const result = enforceConstant(false, undefined); + + expect(result).toBeFalsy(); + }); + }); + + describe("readonlyTrueWhen", () => { + it.each([[false], [null], [undefined]])( + "returns undefined when enabled is falsy (= %p)", + (value) => { + const result = readonlyTrueWhen(value); + + expect(result).toBeUndefined(); + }, + ); + + it("returns a readonly RequiresTrue when enabled is true", () => { + const result = readonlyTrueWhen(true); + + expect(result).toMatchObject({ readonly: true }); + expect(result).toMatchObject(RequiresTrue); + }); + }); +}); diff --git a/libs/tools/generator/core/src/policies/constraints.ts b/libs/tools/generator/core/src/policies/constraints.ts new file mode 100644 index 00000000000..6071b57048f --- /dev/null +++ b/libs/tools/generator/core/src/policies/constraints.ts @@ -0,0 +1,164 @@ +import { Constraint } from "@bitwarden/common/tools/types"; + +import { sum } from "../util"; + +const AtLeastOne: Constraint = { min: 1 }; +const RequiresTrue: Constraint = { requiredValue: true }; + +/** Ensures the minimum and maximum bounds of a constraint are at least as large as the + * combined minimum bounds of `dependencies`. + * @param current the constraint extended by the combinator. + * @param dependencies the constraints summed to determine the bounds of `current`. + * @returns a copy of `current` with the new bounds applied. + * + */ +function atLeastSum(current: Constraint, dependencies: Constraint[]) { + // length must be at least as long as the required character set + const minConsistentLength = sum(...dependencies.map((c) => c?.min)); + const minLength = Math.max(current?.min ?? 0, minConsistentLength); + const length = atLeast(minLength, current); + + return length; +} + +/** Extends a constraint with a readonly field. + * @param readonly Adds a readonly field when this is `true`. + * @param constraint the constraint extended by the combinator. + * @returns a copy of `constraint` with the readonly constraint applied as-needed. + */ +function maybeReadonly(readonly: boolean, constraint?: Constraint): Constraint { + if (!readonly) { + return constraint; + } + + const result: Constraint = Object.assign({}, constraint ?? {}); + result.readonly = true; + + return result; +} + +/** Conditionally enables a constraint. + * @param enabled the condition to evaluate + * @param constraint the condition to conditionally enable + * @returns `constraint` when `enabled` is true. Otherwise returns `undefined. + */ +function maybe(enabled: boolean, constraint: Constraint): Constraint { + return enabled ? constraint : undefined; +} + +// copies `constraint`; ensures both bounds >= value +/** Ensures the boundaries of a constraint are at least equal to the minimum. + * @param minimum the lower bound of the constraint. When this is `undefined` or `null`, + * the method returns `constraint`. + * @param constraint the constraint to evaluate. When this is `undefined` or `null`, + * the method creates a new constraint. + * @returns a copy of `constraint`. When `minimum` has a value, the returned constraint + * always includes a minimum bound. When `constraint` has a maximum defined, both + * its minimum and maximum are checked against `minimum`. + */ +function atLeast(minimum: number, constraint?: Constraint): Constraint { + if (minimum === undefined || minimum === null) { + return constraint; + } + + const atLeast = { ...(constraint ?? {}) }; + atLeast.min = Math.max(atLeast.min ?? -Infinity, minimum); + + if ("max" in atLeast) { + atLeast.max = Math.max(atLeast.max, minimum); + } + + return atLeast; +} + +/** Ensures a value falls within the minimum and maximum boundaries of a constraint. + * @param value the value to check. Nullish values are coerced to 0. + * @param constraint the constraint to evaluate against. + * @returns If the value is below the minimum constraint, the minimum bound is + * returned. If the value is above the maximum constraint, the maximum bound is + * returned. Otherwise, the value is returned. + */ +function fitToBounds(value: number, constraint: Constraint) { + if (!constraint) { + return value; + } + + const { min, max } = constraint; + + const withUpperBound = Math.min(value ?? 0, max ?? Infinity); + const withLowerBound = Math.max(withUpperBound, min ?? -Infinity); + + return withLowerBound; +} + +/** Fits the length of a string within the minimum and maximum length boundaries + * of a constraint. + * @param value the value to check. Nullish values are coerced to the empty string. + * @param constraint the constraint to evaluate against. + * @param options.fillString a string to fill values from. Defaults to a space. + * When fillString contains multiple characters, each is filled in order. The + * fill string repeats when it gets to the end of the string and there are + * more characters to fill. + * @returns If the value is below the required length, returns a copy padded + * by the fillString. If the value is above the required length, returns a copy + * padded to the maximum length. + * */ +function fitLength( + value: string, + constraint: Constraint, + options?: { fillString?: string }, +) { + if (!constraint) { + return value; + } + + const { minLength, maxLength } = constraint; + const { fillString } = options ?? { fillString: " " }; + + const trimmed = (value ?? "").slice(0, maxLength ?? Infinity); + const result = trimmed.padEnd(minLength ?? trimmed.length, fillString); + + return result; +} + +/** Enforces a readonly field has a required value. + * @param value the value to check. + * @param constraint the constraint to evaluate against. + * @returns If the constraint's readonly field is `true`, returns the + * constraint's required value or `undefined` if none is specified. + * Otherwise returns the value. + * @remarks This method can be used to ensure a conditionally-calculated + * field becomes undefined. Simply specify `readonly` without a `requiredValue` + * then use `??` to perform the calculation. + */ +function enforceConstant(value: boolean, constraint: Constraint) { + if (constraint?.readonly) { + return constraint.requiredValue; + } else { + return value; + } +} + +/** Conditionally create a readonly true value. + * @param enabled When true, create the value. + * @returns When enabled is true, a readonly constraint with a constant value + * of `true`. Otherwise returns `undefined`. + */ +function readonlyTrueWhen(enabled: boolean) { + const readonlyValue = maybeReadonly(enabled, RequiresTrue); + const maybeReadonlyValue = maybe(enabled, readonlyValue); + return maybeReadonlyValue; +} + +export { + atLeast, + atLeastSum, + maybe, + maybeReadonly, + fitToBounds, + enforceConstant, + readonlyTrueWhen, + fitLength, + AtLeastOne, + RequiresTrue, +}; diff --git a/libs/tools/generator/core/src/policies/dynamic-password-policy-constraints.spec.ts b/libs/tools/generator/core/src/policies/dynamic-password-policy-constraints.spec.ts new file mode 100644 index 00000000000..96f590f8ed6 --- /dev/null +++ b/libs/tools/generator/core/src/policies/dynamic-password-policy-constraints.spec.ts @@ -0,0 +1,262 @@ +import { DefaultPasswordBoundaries, DefaultPasswordGenerationOptions, Policies } from "../data"; + +import { AtLeastOne } from "./constraints"; +import { DynamicPasswordPolicyConstraints } from "./dynamic-password-policy-constraints"; + +describe("DynamicPasswordPolicyConstraints", () => { + describe("constructor", () => { + it("uses default boundaries when the policy is disabled", () => { + const { constraints } = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + + expect(constraints.policyInEffect).toBeFalsy(); + expect(constraints.length).toEqual(DefaultPasswordBoundaries.length); + expect(constraints.lowercase).toBeUndefined(); + expect(constraints.uppercase).toBeUndefined(); + expect(constraints.number).toBeUndefined(); + expect(constraints.special).toBeUndefined(); + expect(constraints.minLowercase).toBeUndefined(); + expect(constraints.minUppercase).toBeUndefined(); + expect(constraints.minNumber).toEqual(DefaultPasswordBoundaries.minDigits); + expect(constraints.minSpecial).toEqual(DefaultPasswordBoundaries.minSpecialCharacters); + }); + + it("1 <= minLowercase when the policy requires lowercase", () => { + const policy = { ...Policies.Password.disabledValue, useLowercase: true }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.lowercase.readonly).toEqual(true); + expect(constraints.lowercase.requiredValue).toEqual(true); + expect(constraints.minLowercase).toEqual({ min: 1 }); + }); + + it("1 <= minUppercase when the policy requires uppercase", () => { + const policy = { ...Policies.Password.disabledValue, useUppercase: true }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.uppercase.readonly).toEqual(true); + expect(constraints.uppercase.requiredValue).toEqual(true); + expect(constraints.minUppercase).toEqual({ min: 1 }); + }); + + it("1 <= minNumber <= 9 when the policy requires a number", () => { + const policy = { ...Policies.Password.disabledValue, useNumbers: true }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.number.readonly).toEqual(true); + expect(constraints.number.requiredValue).toEqual(true); + expect(constraints.minNumber).toEqual({ min: 1, max: 9 }); + }); + + it("1 <= minSpecial <= 9 when the policy requires a special character", () => { + const policy = { ...Policies.Password.disabledValue, useSpecial: true }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.special.readonly).toEqual(true); + expect(constraints.special.requiredValue).toEqual(true); + expect(constraints.minSpecial).toEqual({ min: 1, max: 9 }); + }); + + it("numberCount <= minNumber <= 9 when the policy requires numberCount", () => { + const policy = { ...Policies.Password.disabledValue, useNumbers: true, numberCount: 2 }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.number.readonly).toEqual(true); + expect(constraints.number.requiredValue).toEqual(true); + expect(constraints.minNumber).toEqual({ min: 2, max: 9 }); + }); + + it("specialCount <= minSpecial <= 9 when the policy requires specialCount", () => { + const policy = { ...Policies.Password.disabledValue, useSpecial: true, specialCount: 2 }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.special.readonly).toEqual(true); + expect(constraints.special.requiredValue).toEqual(true); + expect(constraints.minSpecial).toEqual({ min: 2, max: 9 }); + }); + + it("uses the policy's minimum length when the policy defines one", () => { + const policy = { ...Policies.Password.disabledValue, minLength: 10 }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.length).toEqual({ min: 10, max: 128 }); + }); + + it("overrides the minimum length when it is less than the sum of minimums", () => { + const policy = { + ...Policies.Password.disabledValue, + useUppercase: true, + useLowercase: true, + useNumbers: true, + numberCount: 5, + useSpecial: true, + specialCount: 5, + }; + const { constraints } = new DynamicPasswordPolicyConstraints(policy); + + // lower + upper + number + special = 1 + 1 + 5 + 5 = 12 + expect(constraints.length).toEqual({ min: 12, max: 128 }); + }); + }); + + describe("calibrate", () => { + it("copies the boolean constraints into the calibration", () => { + const dynamic = new DynamicPasswordPolicyConstraints({ + ...Policies.Password.disabledValue, + useUppercase: true, + useLowercase: true, + useNumbers: true, + useSpecial: true, + }); + + const calibrated = dynamic.calibrate(DefaultPasswordGenerationOptions); + + expect(calibrated.constraints.uppercase).toEqual(dynamic.constraints.uppercase); + expect(calibrated.constraints.lowercase).toEqual(dynamic.constraints.lowercase); + expect(calibrated.constraints.number).toEqual(dynamic.constraints.number); + expect(calibrated.constraints.special).toEqual(dynamic.constraints.special); + }); + + it.each([[true], [false], [undefined]])( + "outputs at least 1 constraint when the state's lowercase flag is true and useLowercase is %p", + (useLowercase) => { + const dynamic = new DynamicPasswordPolicyConstraints({ + ...Policies.Password.disabledValue, + useLowercase, + }); + const state = { + ...DefaultPasswordGenerationOptions, + lowercase: true, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minLowercase).toEqual(AtLeastOne); + }, + ); + + it("outputs the `minLowercase` constraint when the state's lowercase flag is true and policy is disabled", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + lowercase: true, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minLowercase).toEqual(AtLeastOne); + }); + + it("disables the minLowercase constraint when the state's lowercase flag is false", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + lowercase: false, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minLowercase).toBeUndefined(); + }); + + it.each([[true], [false], [undefined]])( + "outputs at least 1 constraint when the state's uppercase flag is true and useUppercase is %p", + (useUppercase) => { + const dynamic = new DynamicPasswordPolicyConstraints({ + ...Policies.Password.disabledValue, + useUppercase, + }); + const state = { + ...DefaultPasswordGenerationOptions, + uppercase: true, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minUppercase).toEqual(AtLeastOne); + }, + ); + + it("disables the minUppercase constraint when the state's uppercase flag is false", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + uppercase: false, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minUppercase).toBeUndefined(); + }); + + it("outputs the minNumber constraint when the state's number flag is true", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + number: true, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minNumber).toEqual(dynamic.constraints.minNumber); + }); + + it("disables the minNumber constraint when the state's number flag is false", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + number: false, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minNumber).toBeUndefined(); + }); + + it("outputs the minSpecial constraint when the state's special flag is true", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + special: true, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minSpecial).toEqual(dynamic.constraints.minSpecial); + }); + + it("disables the minSpecial constraint when the state's special flag is false", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + const state = { + ...DefaultPasswordGenerationOptions, + special: false, + }; + + const calibrated = dynamic.calibrate(state); + + expect(calibrated.constraints.minSpecial).toBeUndefined(); + }); + + it("copies the minimum length constraint", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + + const calibrated = dynamic.calibrate(DefaultPasswordGenerationOptions); + + expect(calibrated.constraints.minSpecial).toBeUndefined(); + }); + + it("overrides the minimum length constraint when it is less than the sum of the state's minimums", () => { + const dynamic = new DynamicPasswordPolicyConstraints(Policies.Password.disabledValue); + + const calibrated = dynamic.calibrate(DefaultPasswordGenerationOptions); + + expect(calibrated.constraints.minSpecial).toBeUndefined(); + }); + }); +}); diff --git a/libs/tools/generator/core/src/policies/dynamic-password-policy-constraints.ts b/libs/tools/generator/core/src/policies/dynamic-password-policy-constraints.ts new file mode 100644 index 00000000000..daff9882547 --- /dev/null +++ b/libs/tools/generator/core/src/policies/dynamic-password-policy-constraints.ts @@ -0,0 +1,100 @@ +import { + DynamicStateConstraints, + PolicyConstraints, + StateConstraints, +} from "@bitwarden/common/tools/types"; + +import { DefaultPasswordBoundaries } from "../data"; +import { PasswordGeneratorPolicy, PasswordGeneratorSettings } from "../types"; + +import { atLeast, atLeastSum, maybe, readonlyTrueWhen, AtLeastOne } from "./constraints"; +import { PasswordPolicyConstraints } from "./password-policy-constraints"; + +/** Creates state constraints by blending policy and password settings. */ +export class DynamicPasswordPolicyConstraints + implements DynamicStateConstraints +{ + /** Instantiates the object. + * @param policy the password policy to enforce. This cannot be + * `null` or `undefined`. + */ + constructor(policy: PasswordGeneratorPolicy) { + const minLowercase = maybe(policy.useLowercase, AtLeastOne); + const minUppercase = maybe(policy.useUppercase, AtLeastOne); + + const minNumber = atLeast( + policy.numberCount || (policy.useNumbers && AtLeastOne.min), + DefaultPasswordBoundaries.minDigits, + ); + + const minSpecial = atLeast( + policy.specialCount || (policy.useSpecial && AtLeastOne.min), + DefaultPasswordBoundaries.minSpecialCharacters, + ); + + const baseLength = atLeast(policy.minLength, DefaultPasswordBoundaries.length); + const subLengths = [minLowercase, minUppercase, minNumber, minSpecial]; + const length = atLeastSum(baseLength, subLengths); + + this.constraints = Object.freeze({ + policyInEffect: policyInEffect(policy), + lowercase: readonlyTrueWhen(policy.useLowercase), + uppercase: readonlyTrueWhen(policy.useUppercase), + number: readonlyTrueWhen(policy.useNumbers), + special: readonlyTrueWhen(policy.useSpecial), + length, + minLowercase, + minUppercase, + minNumber, + minSpecial, + }); + } + + /** Constraints derived from the policy and application-defined defaults; + * @remarks these limits are absolute and should be transmitted to the UI + */ + readonly constraints: PolicyConstraints; + + calibrate(state: PasswordGeneratorSettings): StateConstraints { + // decide which constraints are active + const lowercase = state.lowercase || this.constraints.lowercase?.requiredValue || false; + const uppercase = state.uppercase || this.constraints.uppercase?.requiredValue || false; + const number = state.number || this.constraints.number?.requiredValue || false; + const special = state.special || this.constraints.special?.requiredValue || false; + + // minimum constraints cannot `atLeast(state...) because doing so would force + // the constrained value to only increase + const constraints: PolicyConstraints = { + ...this.constraints, + minLowercase: maybe(lowercase, this.constraints.minLowercase ?? AtLeastOne), + minUppercase: maybe(uppercase, this.constraints.minUppercase ?? AtLeastOne), + minNumber: maybe(number, this.constraints.minNumber), + minSpecial: maybe(special, this.constraints.minSpecial), + }; + + // lower bound of length must always at least fit its sub-lengths + constraints.length = atLeastSum(this.constraints.length, [ + atLeast(state.minNumber, constraints.minNumber), + atLeast(state.minSpecial, constraints.minSpecial), + atLeast(state.minLowercase, constraints.minLowercase), + atLeast(state.minUppercase, constraints.minUppercase), + ]); + + const stateConstraints = new PasswordPolicyConstraints(constraints); + return stateConstraints; + } +} + +function policyInEffect(policy: PasswordGeneratorPolicy): boolean { + const policies = [ + policy.useUppercase, + policy.useLowercase, + policy.useNumbers, + policy.useSpecial, + policy.minLength > DefaultPasswordBoundaries.length.min, + policy.numberCount > DefaultPasswordBoundaries.minDigits.min, + policy.specialCount > DefaultPasswordBoundaries.minSpecialCharacters.min, + ]; + + return policies.includes(true); +} diff --git a/libs/tools/generator/core/src/policies/index.ts b/libs/tools/generator/core/src/policies/index.ts index bce363e6da0..0d05e702306 100644 --- a/libs/tools/generator/core/src/policies/index.ts +++ b/libs/tools/generator/core/src/policies/index.ts @@ -1,5 +1,7 @@ export { DefaultPolicyEvaluator } from "./default-policy-evaluator"; +export { DynamicPasswordPolicyConstraints } from "./dynamic-password-policy-constraints"; export { PassphraseGeneratorOptionsEvaluator } from "./passphrase-generator-options-evaluator"; +export { PassphrasePolicyConstraints } from "./passphrase-policy-constraints"; export { PasswordGeneratorOptionsEvaluator } from "./password-generator-options-evaluator"; export { passphraseLeastPrivilege } from "./passphrase-least-privilege"; export { passwordLeastPrivilege } from "./password-least-privilege"; diff --git a/libs/tools/generator/core/src/policies/passphrase-policy-constraints.spec.ts b/libs/tools/generator/core/src/policies/passphrase-policy-constraints.spec.ts new file mode 100644 index 00000000000..034a8234223 --- /dev/null +++ b/libs/tools/generator/core/src/policies/passphrase-policy-constraints.spec.ts @@ -0,0 +1,134 @@ +import { DefaultPassphraseBoundaries, Policies } from "../data"; + +import { PassphrasePolicyConstraints } from "./passphrase-policy-constraints"; + +const SomeSettings = { + capitalize: false, + includeNumber: false, + numWords: 3, + wordSeparator: "-", +}; + +describe("PassphrasePolicyConstraints", () => { + describe("constructor", () => { + it("uses default boundaries when the policy is disabled", () => { + const { constraints } = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue); + + expect(constraints.policyInEffect).toBeFalsy(); + expect(constraints.capitalize).toBeUndefined(); + expect(constraints.includeNumber).toBeUndefined(); + expect(constraints.numWords).toEqual(DefaultPassphraseBoundaries.numWords); + }); + + it("requires capitalization when the policy requires capitalization", () => { + const { constraints } = new PassphrasePolicyConstraints({ + ...Policies.Passphrase.disabledValue, + capitalize: true, + }); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.capitalize).toMatchObject({ readonly: true, requiredValue: true }); + }); + + it("requires a number when the policy requires a number", () => { + const { constraints } = new PassphrasePolicyConstraints({ + ...Policies.Passphrase.disabledValue, + includeNumber: true, + }); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.includeNumber).toMatchObject({ readonly: true, requiredValue: true }); + }); + + it("minNumberWords <= numWords.min when the policy requires numberCount", () => { + const { constraints } = new PassphrasePolicyConstraints({ + ...Policies.Passphrase.disabledValue, + minNumberWords: 10, + }); + + expect(constraints.policyInEffect).toBeTruthy(); + expect(constraints.numWords).toMatchObject({ + min: 10, + max: DefaultPassphraseBoundaries.numWords.max, + }); + }); + }); + + describe("adjust", () => { + it("allows an empty word separator", () => { + const policy = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue); + + const { wordSeparator } = policy.adjust({ ...SomeSettings, wordSeparator: "" }); + + expect(wordSeparator).toEqual(""); + }); + + it("takes only the first character of wordSeparator", () => { + const policy = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue); + + const { wordSeparator } = policy.adjust({ ...SomeSettings, wordSeparator: "?." }); + + expect(wordSeparator).toEqual("?"); + }); + + it.each([ + [1, 3], + [21, 20], + ])("fits numWords (=%p) within the default bounds (3 <= %p <= 20)", (value, expected) => { + const policy = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue); + + const { numWords } = policy.adjust({ ...SomeSettings, numWords: value }); + + expect(numWords).toEqual(expected); + }); + + it.each([ + [1, 4, 4], + [21, 20, 20], + ])( + "fits numWords (=%p) within the policy bounds (%p <= %p <= 20)", + (value, minNumberWords, expected) => { + const policy = new PassphrasePolicyConstraints({ + ...Policies.Passphrase.disabledValue, + minNumberWords, + }); + + const { numWords } = policy.adjust({ ...SomeSettings, numWords: value }); + + expect(numWords).toEqual(expected); + }, + ); + + it("sets capitalize to true when the policy requires it", () => { + const policy = new PassphrasePolicyConstraints({ + ...Policies.Passphrase.disabledValue, + capitalize: true, + }); + + const { capitalize } = policy.adjust({ ...SomeSettings, capitalize: false }); + + expect(capitalize).toBeTruthy(); + }); + + it("sets includeNumber to true when the policy requires it", () => { + const policy = new PassphrasePolicyConstraints({ + ...Policies.Passphrase.disabledValue, + includeNumber: true, + }); + + const { includeNumber } = policy.adjust({ ...SomeSettings, capitalize: false }); + + expect(includeNumber).toBeTruthy(); + }); + }); + + describe("fix", () => { + it("returns its input", () => { + const policy = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue); + + const result = policy.fix(SomeSettings); + + expect(result).toBe(SomeSettings); + }); + }); +}); diff --git a/libs/tools/generator/core/src/policies/passphrase-policy-constraints.ts b/libs/tools/generator/core/src/policies/passphrase-policy-constraints.ts new file mode 100644 index 00000000000..27fb76991ec --- /dev/null +++ b/libs/tools/generator/core/src/policies/passphrase-policy-constraints.ts @@ -0,0 +1,51 @@ +import { PolicyConstraints, StateConstraints } from "@bitwarden/common/tools/types"; + +import { DefaultPassphraseBoundaries, DefaultPassphraseGenerationOptions } from "../data"; +import { PassphraseGenerationOptions, PassphraseGeneratorPolicy } from "../types"; + +import { atLeast, enforceConstant, fitLength, fitToBounds, readonlyTrueWhen } from "./constraints"; + +export class PassphrasePolicyConstraints implements StateConstraints { + /** Creates a passphrase policy constraints + * @param policy the password policy to enforce. This cannot be + * `null` or `undefined`. + */ + constructor(readonly policy: PassphraseGeneratorPolicy) { + this.constraints = { + policyInEffect: policyInEffect(policy), + wordSeparator: { minLength: 0, maxLength: 1 }, + capitalize: readonlyTrueWhen(policy.capitalize), + includeNumber: readonlyTrueWhen(policy.includeNumber), + numWords: atLeast(policy.minNumberWords, DefaultPassphraseBoundaries.numWords), + }; + } + + constraints: Readonly>; + + adjust(state: PassphraseGenerationOptions): PassphraseGenerationOptions { + const result: PassphraseGenerationOptions = { + wordSeparator: fitLength(state.wordSeparator, this.constraints.wordSeparator, { + fillString: DefaultPassphraseGenerationOptions.wordSeparator, + }), + capitalize: enforceConstant(state.capitalize, this.constraints.capitalize), + includeNumber: enforceConstant(state.includeNumber, this.constraints.includeNumber), + numWords: fitToBounds(state.numWords, this.constraints.numWords), + }; + + return result; + } + + fix(state: PassphraseGenerationOptions): PassphraseGenerationOptions { + return state; + } +} + +function policyInEffect(policy: PassphraseGeneratorPolicy): boolean { + const policies = [ + policy.capitalize, + policy.includeNumber, + policy.minNumberWords > DefaultPassphraseBoundaries.numWords.min, + ]; + + return policies.includes(true); +} diff --git a/libs/tools/generator/core/src/policies/password-policy-constraints.spec.ts b/libs/tools/generator/core/src/policies/password-policy-constraints.spec.ts new file mode 100644 index 00000000000..4d95a36d584 --- /dev/null +++ b/libs/tools/generator/core/src/policies/password-policy-constraints.spec.ts @@ -0,0 +1,130 @@ +import { PasswordGeneratorSettings } from "../types"; + +import { PasswordPolicyConstraints } from "./password-policy-constraints"; + +const EmptyState = { + length: 0, + ambiguous: false, + lowercase: false, + uppercase: false, + number: false, + special: false, + minUppercase: 0, + minLowercase: 0, + minNumber: 0, + minSpecial: 0, +}; + +describe("PasswordPolicyConstraints", () => { + describe("adjust", () => { + it("returns its input when the constraints are empty", () => { + const constraint = new PasswordPolicyConstraints({}); + const expected = { + length: -1, + ambiguous: true, + lowercase: true, + uppercase: true, + number: true, + special: true, + minUppercase: -1, + minLowercase: -1, + minNumber: -1, + minSpecial: -1, + }; + + const result = constraint.adjust(expected); + + expect(result).toEqual(expected); + }); + + it.each([ + ["length", 0, 1], + ["length", 1, 1], + ["length", 2, 2], + ["length", 3, 2], + ["minLowercase", 0, 1], + ["minLowercase", 1, 1], + ["minLowercase", 2, 2], + ["minLowercase", 3, 2], + ["minUppercase", 0, 1], + ["minUppercase", 1, 1], + ["minUppercase", 2, 2], + ["minUppercase", 3, 2], + ["minNumber", 0, 1], + ["minNumber", 1, 1], + ["minNumber", 2, 2], + ["minNumber", 3, 2], + ["minSpecial", 0, 1], + ["minSpecial", 1, 1], + ["minSpecial", 2, 2], + ["minSpecial", 3, 2], + ] as [keyof PasswordGeneratorSettings, number, number][])( + `fits %s (= %p) within the bounds (1 <= %p <= 2)`, + (property, input, expected) => { + const constraint = new PasswordPolicyConstraints({ [property]: { min: 1, max: 2 } }); + const state = { ...EmptyState, [property]: input }; + + const result = constraint.adjust(state); + + expect(result).toMatchObject({ [property]: expected }); + }, + ); + + it.each([["lowercase"], ["uppercase"], ["number"], ["special"]] as [ + keyof PasswordGeneratorSettings, + ][])("returns state.%s when the matching readonly constraint is writable", (property) => { + const constraint = new PasswordPolicyConstraints({ [property]: { readonly: false } }); + const state = { ...EmptyState, [property]: true }; + + const result = constraint.adjust(state); + + expect(result).toEqual({ ...EmptyState, [property]: true }); + }); + + it("sets `lowercase` and `uppercase` to `true` when no flags are defined", () => { + const constraint = new PasswordPolicyConstraints({}); + const result = constraint.adjust(EmptyState); + + expect(result).toMatchObject({ lowercase: true, uppercase: true }); + }); + + it.each([["number"], ["special"]] as [keyof PasswordGeneratorSettings][])( + "returns a consistent state.%s = undefined when the matching readonly constraint is active without a required value", + (property) => { + const constraint = new PasswordPolicyConstraints({ [property]: { readonly: true } }); + const state = { + ...EmptyState, + [property]: true, + }; + + const result = constraint.adjust(state); + + expect(result).toMatchObject({ [property]: false }); + }, + ); + + it.each([["number"], ["special"]] as [keyof PasswordGeneratorSettings][])( + "returns state.%s = requiredValue when matching constraint is active with a required value", + (property) => { + const constraint = new PasswordPolicyConstraints({ + [property]: { readonly: true, requiredValue: false }, + }); + const state = { ...EmptyState, [property]: true }; + + const result = constraint.adjust(state); + + expect(result).toMatchObject({ [property]: false }); + }, + ); + }); + + describe("fix", () => { + it("returns its input", () => { + const policy = new PasswordPolicyConstraints({}); + + const result = policy.fix(EmptyState); + + expect(result).toBe(EmptyState); + }); + }); +}); diff --git a/libs/tools/generator/core/src/policies/password-policy-constraints.ts b/libs/tools/generator/core/src/policies/password-policy-constraints.ts new file mode 100644 index 00000000000..1b4d07660a6 --- /dev/null +++ b/libs/tools/generator/core/src/policies/password-policy-constraints.ts @@ -0,0 +1,50 @@ +import { PolicyConstraints, StateConstraints } from "@bitwarden/common/tools/types"; + +import { DefaultPasswordGenerationOptions } from "../data"; +import { PasswordGeneratorSettings } from "../types"; + +import { fitToBounds, enforceConstant } from "./constraints"; + +export class PasswordPolicyConstraints implements StateConstraints { + /** Creates a password policy constraints + * @param constraints Constraints derived from the policy and application-defined defaults + */ + constructor(readonly constraints: PolicyConstraints) {} + + adjust(state: PasswordGeneratorSettings): PasswordGeneratorSettings { + // constrain values + const result: PasswordGeneratorSettings = { + ...(state ?? DefaultPasswordGenerationOptions), + length: fitToBounds(state.length, this.constraints.length), + lowercase: enforceConstant(state.lowercase, this.constraints.lowercase), + uppercase: enforceConstant(state.uppercase, this.constraints.uppercase), + number: enforceConstant(state.number, this.constraints.number), + special: enforceConstant(state.special, this.constraints.special), + minLowercase: fitToBounds(state.minLowercase, this.constraints.minLowercase), + minUppercase: fitToBounds(state.minUppercase, this.constraints.minUppercase), + minNumber: fitToBounds(state.minNumber, this.constraints.minNumber), + minSpecial: fitToBounds(state.minSpecial, this.constraints.minSpecial), + }; + + // ensure include flags are consistent with the constrained values + result.lowercase ||= state.minLowercase > 0; + result.uppercase ||= state.minUppercase > 0; + result.number ||= state.minNumber > 0; + result.special ||= state.minSpecial > 0; + + // when all flags are disabled, enable a few + const anyEnabled = [result.lowercase, result.uppercase, result.number, result.special].some( + (flag) => flag, + ); + if (!anyEnabled) { + result.lowercase = true; + result.uppercase = true; + } + + return result; + } + + fix(state: PasswordGeneratorSettings): PasswordGeneratorSettings { + return state; + } +} diff --git a/libs/tools/generator/core/src/rx.ts b/libs/tools/generator/core/src/rx.ts index e3c02be1298..070d34d37d8 100644 --- a/libs/tools/generator/core/src/rx.ts +++ b/libs/tools/generator/core/src/rx.ts @@ -18,16 +18,16 @@ export function mapPolicyToEvaluator( ); } -/** Maps an administrative console policy to a policy evaluator using the provided configuration. - * @param configuration the configuration that constructs the evaluator. +/** Maps an administrative console policy to constraints using the provided configuration. + * @param configuration the configuration that constructs the constraints. */ -export function mapPolicyToEvaluatorV2( +export function mapPolicyToConstraints( configuration: PolicyConfiguration, ) { return pipe( reduceCollection(configuration.combine, configuration.disabledValue), distinctIfShallowMatch(), - map(configuration.createEvaluatorV2), + map(configuration.toConstraints), ); } diff --git a/libs/tools/generator/core/src/services/credential-generator.service.spec.ts b/libs/tools/generator/core/src/services/credential-generator.service.spec.ts index 5b784b3d07b..7e249bc135d 100644 --- a/libs/tools/generator/core/src/services/credential-generator.service.spec.ts +++ b/libs/tools/generator/core/src/services/credential-generator.service.spec.ts @@ -5,7 +5,7 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { GENERATOR_DISK, UserKeyDefinition } from "@bitwarden/common/platform/state"; -import { Constraints } from "@bitwarden/common/tools/types"; +import { StateConstraints } from "@bitwarden/common/tools/types"; import { OrganizationId, PolicyId, UserId } from "@bitwarden/common/types/guid"; import { @@ -14,8 +14,12 @@ import { awaitAsync, ObservableTracker, } from "../../../../../common/spec"; -import { PolicyEvaluator, Randomizer } from "../abstractions"; -import { CredentialGeneratorConfiguration, GeneratedCredential } from "../types"; +import { Randomizer } from "../abstractions"; +import { + CredentialGeneratorConfiguration, + GeneratedCredential, + GeneratorConstraints, +} from "../types"; import { CredentialGeneratorService } from "./credential-generator.service"; @@ -72,18 +76,37 @@ const SomeConfiguration: CredentialGeneratorConfiguration { throw new Error("this should never be called"); }, - createEvaluatorV2: (policy) => { - return { - foo: {}, - policy, - policyInEffect: policy.fooPolicy, - applyPolicy: (settings) => { - return policy.fooPolicy ? { foo: `apply(${settings.foo})` } : settings; - }, - sanitize: (settings) => { - return policy.fooPolicy ? { foo: `sanitize(${settings.foo})` } : settings; - }, - } as PolicyEvaluator & Constraints; + toConstraints: (policy) => { + if (policy.fooPolicy) { + return { + constraints: { + policyInEffect: true, + }, + calibrate(state: SomeSettings) { + return { + constraints: {}, + adjust(state: SomeSettings) { + return { foo: `adjusted(${state.foo})` }; + }, + fix(state: SomeSettings) { + return { foo: `fixed(${state.foo})` }; + }, + } satisfies StateConstraints; + }, + } satisfies GeneratorConstraints; + } else { + return { + constraints: { + policyInEffect: false, + }, + adjust(state: SomeSettings) { + return state; + }, + fix(state: SomeSettings) { + return state; + }, + } satisfies GeneratorConstraints; + } }, }, }; @@ -378,7 +401,7 @@ describe("CredentialGeneratorService", () => { const result = await firstValueFrom(generator.settings$(SomeConfiguration)); - expect(result).toEqual({ foo: "sanitize(apply(value))" }); + expect(result).toEqual({ foo: "adjusted(value)" }); }); it("follows changes to the active user", async () => { @@ -525,17 +548,16 @@ describe("CredentialGeneratorService", () => { }); describe("policy$", () => { - it("creates a disabled policy evaluator when there is no policy", async () => { + it("creates constraints without policy in effect when there is no policy", async () => { const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService); const userId$ = new BehaviorSubject(SomeUser).asObservable(); const result = await firstValueFrom(generator.policy$(SomeConfiguration, { userId$ })); - expect(result.policy).toEqual(SomeConfiguration.policy.disabledValue); - expect(result.policyInEffect).toBeFalsy(); + expect(result.constraints.policyInEffect).toBeFalsy(); }); - it("creates an active policy evaluator when there is a policy", async () => { + it("creates constraints with policy in effect when there is a policy", async () => { const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService); const userId$ = new BehaviorSubject(SomeUser).asObservable(); const policy$ = new BehaviorSubject([somePolicy]); @@ -543,8 +565,7 @@ describe("CredentialGeneratorService", () => { const result = await firstValueFrom(generator.policy$(SomeConfiguration, { userId$ })); - expect(result.policy).toEqual({ fooPolicy: true }); - expect(result.policyInEffect).toBeTruthy(); + expect(result.constraints.policyInEffect).toBeTruthy(); }); it("follows policy emissions", async () => { @@ -553,7 +574,7 @@ describe("CredentialGeneratorService", () => { const userId$ = userId.asObservable(); const somePolicySubject = new BehaviorSubject([somePolicy]); policyService.getAll$.mockReturnValueOnce(somePolicySubject.asObservable()); - const emissions: any = []; + const emissions: GeneratorConstraints[] = []; const sub = generator .policy$(SomeConfiguration, { userId$ }) .subscribe((policy) => emissions.push(policy)); @@ -564,10 +585,8 @@ describe("CredentialGeneratorService", () => { sub.unsubscribe(); const [someResult, anotherResult] = emissions; - expect(someResult.policy).toEqual({ fooPolicy: true }); - expect(someResult.policyInEffect).toBeTruthy(); - expect(anotherResult.policy).toEqual(SomeConfiguration.policy.disabledValue); - expect(anotherResult.policyInEffect).toBeFalsy(); + expect(someResult.constraints.policyInEffect).toBeTruthy(); + expect(anotherResult.constraints.policyInEffect).toBeFalsy(); }); it("follows user emissions", async () => { @@ -577,7 +596,7 @@ describe("CredentialGeneratorService", () => { const somePolicy$ = new BehaviorSubject([somePolicy]).asObservable(); const anotherPolicy$ = new BehaviorSubject([]).asObservable(); policyService.getAll$.mockReturnValueOnce(somePolicy$).mockReturnValueOnce(anotherPolicy$); - const emissions: any = []; + const emissions: GeneratorConstraints[] = []; const sub = generator .policy$(SomeConfiguration, { userId$ }) .subscribe((policy) => emissions.push(policy)); @@ -588,10 +607,8 @@ describe("CredentialGeneratorService", () => { sub.unsubscribe(); const [someResult, anotherResult] = emissions; - expect(someResult.policy).toEqual({ fooPolicy: true }); - expect(someResult.policyInEffect).toBeTruthy(); - expect(anotherResult.policy).toEqual(SomeConfiguration.policy.disabledValue); - expect(anotherResult.policyInEffect).toBeFalsy(); + expect(someResult.constraints.policyInEffect).toBeTruthy(); + expect(anotherResult.constraints.policyInEffect).toBeFalsy(); }); it("errors when the user errors", async () => { diff --git a/libs/tools/generator/core/src/services/credential-generator.service.ts b/libs/tools/generator/core/src/services/credential-generator.service.ts index d2012ecf20f..dc6b8619407 100644 --- a/libs/tools/generator/core/src/services/credential-generator.service.ts +++ b/libs/tools/generator/core/src/services/credential-generator.service.ts @@ -24,12 +24,13 @@ import { SingleUserDependency, UserDependency, } from "@bitwarden/common/tools/dependencies"; +import { isDynamic } from "@bitwarden/common/tools/state/state-constraints-dependency"; import { UserStateSubject } from "@bitwarden/common/tools/state/user-state-subject"; -import { Constraints } from "@bitwarden/common/tools/types"; -import { PolicyEvaluator, Randomizer } from "../abstractions"; -import { mapPolicyToEvaluatorV2 } from "../rx"; +import { Randomizer } from "../abstractions"; +import { mapPolicyToConstraints } from "../rx"; import { CredentialGeneratorConfiguration as Configuration } from "../types/credential-generator-configuration"; +import { GeneratorConstraints } from "../types/generator-constraints"; type Policy$Dependencies = UserDependency; type Settings$Dependencies = Partial; @@ -44,9 +45,6 @@ type Generate$Dependencies = Simplify & Partial; }; -// FIXME: once the modernization is complete, switch the type parameters -// in `PolicyEvaluator` and bake-in the constraints type. -type Evaluator = PolicyEvaluator & Constraints; export class CredentialGeneratorService { constructor( @@ -61,7 +59,7 @@ export class CredentialGeneratorService { * this emits. Otherwise, a new credential is emitted when the settings * update. */ - generate$( + generate$( configuration: Readonly>, dependencies?: Generate$Dependencies, ) { @@ -96,7 +94,7 @@ export class CredentialGeneratorService { * @returns an observable that emits settings * @remarks the observable enforces policies on the settings */ - settings$( + settings$( configuration: Configuration, dependencies?: Settings$Dependencies, ) { @@ -118,10 +116,9 @@ export class CredentialGeneratorService { const settings$ = combineLatest([state$, this.policy$(configuration, { userId$ })]).pipe( map(([settings, policy]) => { - // FIXME: create `onLoadApply` that wraps these operations - const applied = policy.applyPolicy(settings); - const sanitized = policy.sanitize(applied); - return sanitized; + const calibration = isDynamic(policy) ? policy.calibrate(settings) : policy; + const adjusted = calibration.adjust(settings); + return adjusted; }), ); @@ -135,7 +132,7 @@ export class CredentialGeneratorService { * `dependencies.singleUserId$` becomes available. * @remarks the subject enforces policy for the settings */ - async settings( + async settings( configuration: Readonly>, dependencies: SingleUserDependency, ) { @@ -143,19 +140,14 @@ export class CredentialGeneratorService { dependencies.singleUserId$.pipe(filter((userId) => !!userId)), ); const state = this.stateProvider.getUser(userId, configuration.settings.account); + const constraints$ = this.policy$(configuration, { userId$: dependencies.singleUserId$ }); - // FIXME: apply policy to the settings - this should happen *within* the subject. - // Note that policies could be evaluated when the settings are saved or when they - // are loaded. The existing subject presently could only apply settings on save - // (by wiring the policy in as a dependency and applying with "nextState"), and - // even that has a limitation since arbitrary dependencies do not trigger state - // emissions. - const subject = new UserStateSubject(state, dependencies); + const subject = new UserStateSubject(state, { ...dependencies, constraints$ }); return subject; } - /** Get the policy for the provided configuration + /** Get the policy constraints for the provided configuration * @param dependencies.userId$ determines which user's policy is loaded * @returns an observable that emits the policy once `dependencies.userId$` * and the policy become available. @@ -163,20 +155,20 @@ export class CredentialGeneratorService { policy$( configuration: Configuration, dependencies: Policy$Dependencies, - ): Observable> { + ): Observable> { const completion$ = dependencies.userId$.pipe(ignoreElements(), endWith(true)); - const policy$ = dependencies.userId$.pipe( + const constraints$ = dependencies.userId$.pipe( mergeMap((userId) => { - // complete policy emissions otherwise `mergeMap` holds `policy$` open indefinitely + // complete policy emissions otherwise `mergeMap` holds `policies$` open indefinitely const policies$ = this.policyService .getAll$(configuration.policy.type, userId) .pipe(takeUntil(completion$)); return policies$; }), - mapPolicyToEvaluatorV2(configuration.policy), + mapPolicyToConstraints(configuration.policy), ); - return policy$; + return constraints$; } } diff --git a/libs/tools/generator/core/src/types/generator-constraints.ts b/libs/tools/generator/core/src/types/generator-constraints.ts new file mode 100644 index 00000000000..fe972df3941 --- /dev/null +++ b/libs/tools/generator/core/src/types/generator-constraints.ts @@ -0,0 +1,11 @@ +import { + DynamicStateConstraints, + PolicyConstraints, + StateConstraints, +} from "@bitwarden/common/tools/types"; + +/** Specializes state constraints to include policy. */ +export type GeneratorConstraints = { constraints: PolicyConstraints } & ( + | DynamicStateConstraints + | StateConstraints +); diff --git a/libs/tools/generator/core/src/types/index.ts b/libs/tools/generator/core/src/types/index.ts index 229ac1c0c38..4f74c487f23 100644 --- a/libs/tools/generator/core/src/types/index.ts +++ b/libs/tools/generator/core/src/types/index.ts @@ -5,6 +5,7 @@ export * from "./credential-generator"; export * from "./credential-generator-configuration"; export * from "./eff-username-generator-options"; export * from "./forwarder-options"; +export * from "./generator-constraints"; export * from "./generated-credential"; export * from "./generator-options"; export * from "./generator-type"; diff --git a/libs/tools/generator/core/src/types/password-generation-options.ts b/libs/tools/generator/core/src/types/password-generation-options.ts index 0272cce2055..76e8827d4de 100644 --- a/libs/tools/generator/core/src/types/password-generation-options.ts +++ b/libs/tools/generator/core/src/types/password-generation-options.ts @@ -1,3 +1,61 @@ +/** Settings format for password credential generation. + */ +export type PasswordGeneratorSettings = { + /** The length of the password selected by the user */ + length: number; + + /** `true` when ambiguous characters may be included in the output. + * `false` when ambiguous characters should not be included in the output. + */ + ambiguous: boolean; + + /** `true` when uppercase ASCII characters should be included in the output + * This value defaults to `false. + */ + uppercase: boolean; + + /** The minimum number of uppercase characters to include in the output. + * The value is ignored when `uppercase` is `false`. + * The value defaults to 1 when `uppercase` is `true`. + */ + minUppercase: number; + + /** `true` when lowercase ASCII characters should be included in the output. + * This value defaults to `false`. + */ + lowercase: boolean; + + /** The minimum number of lowercase characters to include in the output. + * The value defaults to 1 when `lowercase` is `true`. + * The value defaults to 0 when `lowercase` is `false`. + */ + minLowercase: number; + + /** Whether or not to include ASCII digits in the output + * This value defaults to `true` when `minNumber` is at least 1. + * This value defaults to `false` when `minNumber` is less than 1. + */ + number: boolean; + + /** The minimum number of digits to include in the output. + * The value defaults to 1 when `number` is `true`. + * The value defaults to 0 when `number` is `false`. + */ + minNumber: number; + + /** Whether or not to include special characters in the output. + * This value defaults to `true` when `minSpecial` is at least 1. + * This value defaults to `false` when `minSpecial` is less than 1. + */ + special: boolean; + + /** The minimum number of special characters to include in the output. + * This value defaults to 1 when `special` is `true`. + * This value defaults to 0 when `special` is `false`. + */ + minSpecial: number; +}; + /** Request format for password credential generation. * All members of this type may be `undefined` when the user is * generating a passphrase. @@ -6,63 +64,9 @@ * it is used with the "password generator" types. The name * `PasswordGeneratorOptions` is already in use by legacy code. */ -export type PasswordGenerationOptions = { - /** The length of the password selected by the user */ - length?: number; - +export type PasswordGenerationOptions = Partial & { /** The minimum length of the password. This defaults to 5, and increases * to ensure `minLength` is at least as large as the sum of the other minimums. */ minLength?: number; - - /** `true` when ambiguous characters may be included in the output. - * `false` when ambiguous characters should not be included in the output. - */ - ambiguous?: boolean; - - /** `true` when uppercase ASCII characters should be included in the output - * This value defaults to `false. - */ - uppercase?: boolean; - - /** The minimum number of uppercase characters to include in the output. - * The value is ignored when `uppercase` is `false`. - * The value defaults to 1 when `uppercase` is `true`. - */ - minUppercase?: number; - - /** `true` when lowercase ASCII characters should be included in the output. - * This value defaults to `false`. - */ - lowercase?: boolean; - - /** The minimum number of lowercase characters to include in the output. - * The value defaults to 1 when `lowercase` is `true`. - * The value defaults to 0 when `lowercase` is `false`. - */ - minLowercase?: number; - - /** Whether or not to include ASCII digits in the output - * This value defaults to `true` when `minNumber` is at least 1. - * This value defaults to `false` when `minNumber` is less than 1. - */ - number?: boolean; - - /** The minimum number of digits to include in the output. - * The value defaults to 1 when `number` is `true`. - * The value defaults to 0 when `number` is `false`. - */ - minNumber?: number; - - /** Whether or not to include special characters in the output. - * This value defaults to `true` when `minSpecial` is at least 1. - * This value defaults to `false` when `minSpecial` is less than 1. - */ - special?: boolean; - - /** The minimum number of special characters to include in the output. - * This value defaults to 1 when `special` is `true`. - * This value defaults to 0 when `special` is `false`. - */ - minSpecial?: number; }; diff --git a/libs/tools/generator/core/src/types/policy-configuration.ts b/libs/tools/generator/core/src/types/policy-configuration.ts index 6ec077bcb6a..2b01a04b92e 100644 --- a/libs/tools/generator/core/src/types/policy-configuration.ts +++ b/libs/tools/generator/core/src/types/policy-configuration.ts @@ -1,9 +1,10 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy as AdminPolicy } from "@bitwarden/common/admin-console/models/domain/policy"; -import { Constraints } from "@bitwarden/common/tools/types"; import { PolicyEvaluator } from "../abstractions"; +import { GeneratorConstraints } from "./generator-constraints"; + /** Determines how to construct a password generator policy */ export type PolicyConfiguration = { type: PolicyType; @@ -17,13 +18,15 @@ export type PolicyConfiguration = { combine: (acc: Policy, policy: AdminPolicy) => Policy; /** Converts policy service data into an actionable policy. + * @deprecated provided only for backwards compatibility. + * Use `toConstraints` instead. */ createEvaluator: (policy: Policy) => PolicyEvaluator; - /** Converts policy service data into an actionable policy. + /** Converts policy service data into actionable policy constraints. * @remarks this version includes constraints needed for the reactive forms; * it was introduced so that the constraints can be incrementally introduced * as the new UI is built. */ - createEvaluatorV2?: (policy: Policy) => PolicyEvaluator & Constraints; + toConstraints: (policy: Policy) => GeneratorConstraints; }; From 1b8fcda90de73785d3efe7b129666d97d5f20a57 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 09:47:05 +0000 Subject: [PATCH 081/104] Autosync the updated translations (#11197) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 99 ++++--- apps/web/src/locales/ar/messages.json | 99 ++++--- apps/web/src/locales/az/messages.json | 107 ++++--- apps/web/src/locales/be/messages.json | 99 ++++--- apps/web/src/locales/bg/messages.json | 109 ++++--- apps/web/src/locales/bn/messages.json | 99 ++++--- apps/web/src/locales/bs/messages.json | 99 ++++--- apps/web/src/locales/ca/messages.json | 99 ++++--- apps/web/src/locales/cs/messages.json | 107 ++++--- apps/web/src/locales/cy/messages.json | 99 ++++--- apps/web/src/locales/da/messages.json | 107 ++++--- apps/web/src/locales/de/messages.json | 99 ++++--- apps/web/src/locales/el/messages.json | 353 +++++++++++++---------- apps/web/src/locales/en_GB/messages.json | 99 ++++--- apps/web/src/locales/en_IN/messages.json | 99 ++++--- apps/web/src/locales/eo/messages.json | 99 ++++--- apps/web/src/locales/es/messages.json | 99 ++++--- apps/web/src/locales/et/messages.json | 99 ++++--- apps/web/src/locales/eu/messages.json | 99 ++++--- apps/web/src/locales/fa/messages.json | 99 ++++--- apps/web/src/locales/fi/messages.json | 181 +++++++----- apps/web/src/locales/fil/messages.json | 99 ++++--- apps/web/src/locales/fr/messages.json | 99 ++++--- apps/web/src/locales/gl/messages.json | 99 ++++--- apps/web/src/locales/he/messages.json | 99 ++++--- apps/web/src/locales/hi/messages.json | 99 ++++--- apps/web/src/locales/hr/messages.json | 99 ++++--- apps/web/src/locales/hu/messages.json | 99 ++++--- apps/web/src/locales/id/messages.json | 99 ++++--- apps/web/src/locales/it/messages.json | 99 ++++--- apps/web/src/locales/ja/messages.json | 107 ++++--- apps/web/src/locales/ka/messages.json | 99 ++++--- apps/web/src/locales/km/messages.json | 99 ++++--- apps/web/src/locales/kn/messages.json | 99 ++++--- apps/web/src/locales/ko/messages.json | 99 ++++--- apps/web/src/locales/lv/messages.json | 111 ++++--- apps/web/src/locales/ml/messages.json | 99 ++++--- apps/web/src/locales/mr/messages.json | 99 ++++--- apps/web/src/locales/my/messages.json | 99 ++++--- apps/web/src/locales/nb/messages.json | 99 ++++--- apps/web/src/locales/ne/messages.json | 99 ++++--- apps/web/src/locales/nl/messages.json | 99 ++++--- apps/web/src/locales/nn/messages.json | 99 ++++--- apps/web/src/locales/or/messages.json | 99 ++++--- apps/web/src/locales/pl/messages.json | 99 ++++--- apps/web/src/locales/pt_BR/messages.json | 99 ++++--- apps/web/src/locales/pt_PT/messages.json | 127 +++++--- apps/web/src/locales/ro/messages.json | 99 ++++--- apps/web/src/locales/ru/messages.json | 99 ++++--- apps/web/src/locales/si/messages.json | 99 ++++--- apps/web/src/locales/sk/messages.json | 115 +++++--- apps/web/src/locales/sl/messages.json | 99 ++++--- apps/web/src/locales/sr/messages.json | 113 +++++--- apps/web/src/locales/sr_CS/messages.json | 99 ++++--- apps/web/src/locales/sv/messages.json | 103 ++++--- apps/web/src/locales/te/messages.json | 99 ++++--- apps/web/src/locales/th/messages.json | 99 ++++--- apps/web/src/locales/tr/messages.json | 107 ++++--- apps/web/src/locales/uk/messages.json | 113 +++++--- apps/web/src/locales/vi/messages.json | 99 ++++--- apps/web/src/locales/zh_CN/messages.json | 115 +++++--- apps/web/src/locales/zh_TW/messages.json | 315 +++++++++++--------- 62 files changed, 4445 insertions(+), 2399 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 7232f4cd3f5..31b2e1ecdc6 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 644a5346aff..bfa8c4e38ba 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index f0bbed2beb6..10e84f1e955 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -270,17 +270,17 @@ "message": "Boolean" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Təsdiq qutusu" }, "cfTypeLinked": { "message": "Əlaqələndirildi", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Xana növü" }, "fieldLabel": { - "message": "Field label" + "message": "Xana etiketi" }, "remove": { "message": "Sil" @@ -8291,7 +8291,7 @@ "message": "Xana əlavə et" }, "editField": { - "message": "Edit field" + "message": "Xanaya düzəliş et" }, "items": { "message": "Elementlər" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Fakturanı \"Provayder Portalı\"ndan idarə et" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Bitwarden-in 7 günlük ödənişsiz sınağını başladın" + "continueSettingUpFreeTrial": { + "message": "Ödənişsiz Bitwarden sınağınızı qurmağa davam edin" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Bitwarden for Teams üçün 7 günlük ödənişsiz sınağı başladın" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Ödənişsiz Bitwarden Parol Meneceri sınağınızı qurmağa davam edin" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Bitwarden for Families üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Bitwarden for Enterprise üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Bitwarden Secrets Manager üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Bitwarden Secrets Manager for Teams üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Bitwarden Secrets Manager for Families üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Bitwarden Secrets Manager for Enterprise üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Bitwarden Password Manager üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Bitwarden Password Manager for Teams üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Bitwarden Password Manager for Families üçün 7 günlük ödənişsiz sınağı başladın" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Bitwarden Password Manager for Enterprise üçün 7 günlük ödənişsiz sınağı başladın" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Ödənişsiz Bitwarden Sirr Meneceri sınağınızı qurmağa davam edin" }, "enterTeamsOrgInfo": { "message": "Teams təşkilatınızın məlumatlarını daxil edin" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "satın alınmış yerlər silindi" }, + "environmentVariables": { + "message": "Mühit dəyişənləri" + }, + "organizationId": { + "message": "Təşkilat kimliyi" + }, + "projectIds": { + "message": "Layihə kimlikləri" + }, + "projectId": { + "message": "Layihə kimliyi" + }, + "projectsAccessedByMachineAccount": { + "message": "Bu maşın hesabı ilə aşağıdakı layihələrə müraciət edilə bilər." + }, + "config": { + "message": "Konfiqurasiya" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Fövqəladə hal müraciət haqqında daha ətraflı" + }, + "learnMoreAboutMatchDetection": { + "message": "Uyuşma aşkarlaması haqqında daha ətraflı" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Ana parolu təkrar soruşmaq haqqında daha ətraflı" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Anbarınızda axtarış haqqında daha ətraflı" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Hesabınızın barmaq izi ifadəsi haqqında daha ətraflı" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Şifrələmə açarınızı döndərməyin təsiri" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Şifrələmə alqoritmləri haqqında daha ətraflı" + }, + "learnMoreAboutKDFIterations": { + "message": "KDF iterasiyaları haqqında daha ətraflı" + }, + "learnMoreAboutLocalization": { + "message": "Lokallaşdırma haqqında daha ətraflı" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Veb sayt ikonlarını istifadə etmə haqqında daha ətraflı" + }, + "learnMoreAboutUserAccess": { + "message": "İstifadəçi müraciəti haqqında daha ətraflı" + }, + "learnMoreAboutMemberRoles": { + "message": "Üzv rolları və icazələr haqqında daha ətraflı" + }, + "whatIsACvvNumber": { + "message": "CVV nömrəsi nədir?" + }, + "learnMoreAboutApi": { + "message": "Bitwarden-nin API-si haqqında daha ətraflı" + }, "fileSends": { "message": "Fayl \"Send\"ləri" }, diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index b190af809ca..71ac5920a0a 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 5e7556af1ee..bec147c11e7 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -270,17 +270,17 @@ "message": "Булево" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Поле за отметка" }, "cfTypeLinked": { "message": "Свързано", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Тип на полето" }, "fieldLabel": { - "message": "Field label" + "message": "Етикет на полето" }, "remove": { "message": "Премахване" @@ -810,7 +810,7 @@ "message": "Ниво на достъп" }, "accessing": { - "message": "Accessing" + "message": "Използване на" }, "loggedOut": { "message": "Бяхте отписани" @@ -8291,7 +8291,7 @@ "message": "Добавяне на поле" }, "editField": { - "message": "Edit field" + "message": "Редактиране на полето" }, "items": { "message": "Елементи" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Управление на плащанията от Портала за доставчици" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Започнете свой безплатен 7-дневен пробен период на Битуорден" + "continueSettingUpFreeTrial": { + "message": "Продължете настройването на безплатния пробен период на Буторден" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Започнете свой безплатен 7-дневен пробен период на Битуорден за екипи" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Продължете настройването на безплатния пробен период на Управлението на пароли на Буторден" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Започнете свой безплатен 7-дневен пробен период на Битуорден за семейства" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Започнете свой безплатен 7-дневен пробен период на Битуорден за големи организации" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на тайни на Битуорден" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на тайни на Битуорден за екипи" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на тайни на Битуорден за семейства" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на тайни на Битуорден за големи организации" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на пароли на Битуорден" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на пароли на Битуорден за екипи" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на пароли на Битуорден за семейства" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Започнете безплатен 7-дневен пробен период на Управлението на пароли на Битуорден за големи организации" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Продължете настройването на безплатния пробен период на Управлението на тайни на Буторден" }, "enterTeamsOrgInfo": { "message": "Въведете информацията относно своята екипна организация" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Променливи на средата" + }, + "organizationId": { + "message": "Идентификатор на организация" + }, + "projectIds": { + "message": "Идентификатори на проекти" + }, + "projectId": { + "message": "Идентификатор на проект" + }, + "projectsAccessedByMachineAccount": { + "message": "Следните проекти са достъпни чрез този машинен акаунт." + }, + "config": { + "message": "Конфигурация" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Научете повече относно достъпа в извънредни ситуации" + }, + "learnMoreAboutMatchDetection": { + "message": "Научете повече относно разпознаването на съвпадения" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Научете повече относно повторното запитване за главната парола" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Научете повече относно търсенето в трезора" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Научете повече относно уникалната фраза на регистрацията си" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Значимост на обновяването на шифриращия ключ" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Научете повече относно алгоритмите за шифроване" + }, + "learnMoreAboutKDFIterations": { + "message": "Научете повече относно повторенията за KDF" + }, + "learnMoreAboutLocalization": { + "message": "Научете повече относно локализацията" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Научете повече относно използването на иконки в уеб сайта" + }, + "learnMoreAboutUserAccess": { + "message": "Научете повече относно достъпа на потребителите" + }, + "learnMoreAboutMemberRoles": { + "message": "Научете повече относно ролите и правата на членовете" + }, + "whatIsACvvNumber": { + "message": "Какво представлява номерът CVV?" + }, + "learnMoreAboutApi": { + "message": "Научете повече относно ППИ на Биуорден" + }, "fileSends": { "message": "Файлови изпращания" }, diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 85bfe41eeb2..276dd760241 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index ea220398955..82e3979880f 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 66f62d015a4..1f8d01e3541 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Gestioneu la facturació des del portal de proveïdors" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de Bitwarden per a Equips" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de Bitwarden per a Famílies" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de Bitwarden per a Empresa" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de l'Administrador de secrets de Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de l'Administrador de secrets de Bitwarden per a Equips" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de l'Administrador de secrets de Bitwarden per a Famílies" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Inicieu la vostra prova gratuïta de 7 dies de l'Administrador de secrets de Bitwarden per a Empresa" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Inicieu la vostra prova gratuïta de 7 dies del Gestor de contrasenyes de Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Inicieu la vostra prova gratuïta de 7 dies del Gestor de contrasenyes de Bitwarden per a Equips" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index eb652cfd0da..3c605153fa2 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -270,17 +270,17 @@ "message": "Boolean" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Zaškrtávací políčko" }, "cfTypeLinked": { "message": "Propojeno", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Typ pole" }, "fieldLabel": { - "message": "Field label" + "message": "Popis pole" }, "remove": { "message": "Odebrat" @@ -8291,7 +8291,7 @@ "message": "Přidat pole" }, "editField": { - "message": "Edit field" + "message": "Upravit pole" }, "items": { "message": "Položky" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Spravovat fakturaci z portálu poskytovatele" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Začněte 7denní bezplatnou zkušební verzi Bitwardenu" + "continueSettingUpFreeTrial": { + "message": "Pokračujte v nastavení zkušební verze aplikace Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Začněte 7denní bezplatnou zkušební verzi Bitwardenu pro Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Pokračujte v nastavení bezplatného zkušebního období Správce hesel Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Začněte 7denní bezplatnou zkušební verzi Bitwardenu pro rodiny" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Začněte 7denní bezplatnou zkušební verzi Bitwardenu pro Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce tajných klíčů Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce tajných klíčů Bitwarden pro Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce tajných klíčů Bitwarden pro rodiny" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce tajných klíčů Bitwarden pro Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce hesel Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce hesel Bitwarden pro Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce hesel Bitwarden pro rodiny" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Začněte 7denní bezplatnou zkušební verzi Správce hesel Bitwarden pro Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Pokračujte v nastavení bezplatného zkušebního období Správce hesel Bitwarden" }, "enterTeamsOrgInfo": { "message": "Zadejte informace o Teams Vaší organizace" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "zakoupení uživatelé odebráni" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Další informace o nouzovém přístupu" + }, + "learnMoreAboutMatchDetection": { + "message": "Další informace o detekci shody" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Další informace o výzvě k hlavnímu heslu" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Další informace o hledání Vašeho trezoru" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Další informace o frázi otisků prstů Vašeho účtu" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Dopad rotace Vašeho šifrovacího klíče" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Další informace o šifrovacích algoritmech" + }, + "learnMoreAboutKDFIterations": { + "message": "Další informace o iteracích KDF" + }, + "learnMoreAboutLocalization": { + "message": "Další informace o lokalizaci" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Další informace o používání ikon webových stránek" + }, + "learnMoreAboutUserAccess": { + "message": "Další informace o přístupu uživatele" + }, + "learnMoreAboutMemberRoles": { + "message": "Další informace o rolích a oprávněních členů" + }, + "whatIsACvvNumber": { + "message": "Co je číslo CVV?" + }, + "learnMoreAboutApi": { + "message": "Další informace o API Bitwardenu" + }, "fileSends": { "message": "Sends se soubory" }, diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 50729f5c46a..dc59ad0079e 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 15473e7b2d9..be07e684cc3 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -270,17 +270,17 @@ "message": "Boolsk" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Afkrydsningsfelt" }, "cfTypeLinked": { "message": "Linket", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Felttype" }, "fieldLabel": { - "message": "Field label" + "message": "Feltetiket" }, "remove": { "message": "Fjern" @@ -8291,7 +8291,7 @@ "message": "Tilføj felt" }, "editField": { - "message": "Edit field" + "message": "Redigér felt" }, "items": { "message": "Emner" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Håndter fakturering via udbyderportalen" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Fortsæt opsætningen af den gratis Bitwarden-prøveperiode" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden til Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Fortsæt opsætningen af den gratis Bitwarden Password Manager-prøveperiode" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden til Familier" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden til Virksomhed" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Secrets Manager til Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Secrets Manager til Familier" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Secrets Manager til Virksomhed" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Password Manager til Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Password Manager til Familier" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start den 7-dages gratis prøveperiode på Bitwarden Password Manager til Virksomhed" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Fortsæt opsætningen af den gratis Bitwarden Secrets Manager-prøveperiode" }, "enterTeamsOrgInfo": { "message": "Angiv Teams-organisationsinformation" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "købte pladser fjernet" }, + "environmentVariables": { + "message": "Miljøvariabler" + }, + "organizationId": { + "message": "Organisations-ID" + }, + "projectIds": { + "message": "Projekt-ID'er" + }, + "projectId": { + "message": "Projekt-ID" + }, + "projectsAccessedByMachineAccount": { + "message": "Følgende projekter kan tilgås af denne maskinkonto." + }, + "config": { + "message": "Opsætning" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Læs mere om nødadgang" + }, + "learnMoreAboutMatchDetection": { + "message": "Læs mere om matchdetektion" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Læs om genanmodning af hovedadgangskode" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Læs mere om at søge i boksen" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Læs om fingeraftrykssætning til kontoen" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Indvirkning af rotation af krypteringsnøgle" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Læs mere om krypteringsalgoritmer" + }, + "learnMoreAboutKDFIterations": { + "message": "Læs mere om KDF-iterationer" + }, + "learnMoreAboutLocalization": { + "message": "Læs mere om lokalisering" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Læs mere om brug af webstedsikoner" + }, + "learnMoreAboutUserAccess": { + "message": "Læs mere brugeradgang" + }, + "learnMoreAboutMemberRoles": { + "message": "Læs mere om medlemsroller og tilladelser" + }, + "whatIsACvvNumber": { + "message": "Hvad er et CVV-nummer?" + }, + "learnMoreAboutApi": { + "message": "Læs mere om Bitwardens API" + }, "fileSends": { "message": "Fil-Sends" }, diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 0ad103379ab..c7961eba8f6 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Rechnungen über das Anbieter-Portal verwalten" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Starte deine 7-tägige kostenlose Testversion von Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Setze die Einrichtung deiner kostenlosen Testversion von Bitwarden fort" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Starte deine 7-tägige kostenlose Testversion des Bitwarden Teams-Tarifs" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Setze die Einrichtung deiner kostenlosen Testversion des Bitwarden Passwort Managers fort" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Starte deine 7-tägige kostenlose Testversion des Bitwarden Families-Tarifs" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Starte deine 7-tägige kostenlose Testversion des Bitwarden Enterprise-Tarifs" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Starte deine 7-tägige kostenlose Testversion vom Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Starte deine 7-tägige kostenlose Testversion im Teams-Tarif des Bitwarden Secrets Managers" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Starte deine 7-tägige kostenlose Testversion im Families-Tarif des Bitwarden Secrets Managers" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Starte deine 7-tägige kostenlose Testversion im Enterprise-Tarif des Bitwarden Secrets Managers" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Starte deine 7-tägige kostenlose Testversion vom Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Starte deine 7-tägige kostenlose Testversion im Teams-Tarif des Bitwarden Password Managers" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Starte deine 7-tägige kostenlose Testversion im Families-Tarif des Bitwarden Password Managers" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Starte deine 7-tägige kostenlose Testversion im Enterprise-Tarif des Bitwarden Password Managers" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Setze die Einrichtung deiner kostenlosen Testversion des Bitwarden Secrets Managers fort" }, "enterTeamsOrgInfo": { "message": "Gib die Informationen deiner Teams-Organisation ein" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "erworbene Benutzerplätze entfernt" }, + "environmentVariables": { + "message": "Umgebungsvariablen" + }, + "organizationId": { + "message": "Organisations-ID" + }, + "projectIds": { + "message": "Projekt-IDs" + }, + "projectId": { + "message": "Projekt-ID" + }, + "projectsAccessedByMachineAccount": { + "message": "Auf folgende Projekte kann über dieses Gerätekonto zugegriffen werden." + }, + "config": { + "message": "Konfiguration" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Erfahre mehr über den Notfallzugriff" + }, + "learnMoreAboutMatchDetection": { + "message": "Erfahre mehr über die Übereinstimmungs-Erkennung" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Erfahre mehr über die erneute Abfrage deines Master-Passworts" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Erfahre mehr über die Suche in deinem Tresor" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Erfahre mehr über die Fingerabdruck-Phrase deines Kontos" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Auswirkungen der Erneuerung deines Verschlüsselungsschlüssels" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Erfahre mehr über Verschlüsselungs-Algorithmen" + }, + "learnMoreAboutKDFIterations": { + "message": "Erfahre mehr über KDF-Iterationen" + }, + "learnMoreAboutLocalization": { + "message": "Erfahre mehr über die Lokalisierung" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Erfahre mehr über die Verwendung von Website-Symbolen" + }, + "learnMoreAboutUserAccess": { + "message": "Erfahre mehr über Benutzerzugriff" + }, + "learnMoreAboutMemberRoles": { + "message": "Erfahre mehr über die Mitgliederrollen und Berechtigungen" + }, + "whatIsACvvNumber": { + "message": "Was ist eine CVV-Nummer?" + }, + "learnMoreAboutApi": { + "message": "Erfahre mehr über die API von Bitwarden" + }, "fileSends": { "message": "Datei-Sends" }, diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 5334208a07a..bc70723da71 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -37,7 +37,7 @@ "message": "Σημειώσεις" }, "note": { - "message": "Note" + "message": "Σημείωση" }, "customFields": { "message": "Προσαρμοσμένα Πεδία" @@ -49,19 +49,19 @@ "message": "Στοιχεία σύνδεσης" }, "personalDetails": { - "message": "Personal details" + "message": "Προσωπικά στοιχεία" }, "identification": { - "message": "Identification" + "message": "Ταυτοποίηση" }, "contactInfo": { - "message": "Contact info" + "message": "Στοιχεία επικοινωνίας" }, "cardDetails": { - "message": "Card details" + "message": "Στοιχεία κάρτας" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "Στοιχεία $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -82,7 +82,7 @@ "message": "Ιστοσελίδα (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Ιστότοπος (URI) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -144,7 +144,7 @@ "message": "Κωδικός ασφαλείας (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "Κωδικός ασφαλείας/CVV" }, "identityName": { "message": "Όνομα ταυτότητας" @@ -222,7 +222,7 @@ "message": "Dr" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Ληγμένη κάρτα" }, "cardExpiredMessage": { "message": "If you've renewed it, update the card's information" @@ -277,10 +277,10 @@ "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Τύπος πεδίου" }, "fieldLabel": { - "message": "Field label" + "message": "Ετικέτα πεδίου" }, "remove": { "message": "Αφαίρεση" @@ -476,7 +476,7 @@ "message": "Ονοματεπώνυμο" }, "address": { - "message": "Address" + "message": "Διεύθυνση" }, "address1": { "message": "Διεύθυνση 1" @@ -521,7 +521,7 @@ "message": "Προβολή Στοιχείου" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "Νέα $TYPE$", "placeholders": { "type": { "content": "$1", @@ -530,7 +530,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Επεξεργασία $TYPE$", "placeholders": { "type": { "content": "$1", @@ -539,7 +539,7 @@ } }, "viewItemType": { - "message": "View $ITEMTYPE$", + "message": "Προβολή $ITEMTYPE$", "placeholders": { "itemtype": { "content": "$1", @@ -593,7 +593,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Επιτυχής αντιγραφή" }, "copyValue": { "message": "Αντιγραφή τιμής", @@ -620,7 +620,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Αντιγραφή $FIELD$", "placeholders": { "field": { "content": "$1", @@ -629,34 +629,34 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "Αντιγραφή ιστοτόπου" }, "copyNotes": { - "message": "Copy notes" + "message": "Αντιγραφή σημειώσεων" }, "copyAddress": { - "message": "Copy address" + "message": "Αντιγραφή διεύθυνσης" }, "copyPhone": { - "message": "Copy phone" + "message": "Αντιγραφή τηλεφώνου" }, "copyEmail": { "message": "Copy email" }, "copyCompany": { - "message": "Copy company" + "message": "Αντιγραφή εταιρείας" }, "copySSN": { "message": "Copy Social Security number" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Αντιγραφή αριθμού διαβατηρίου" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Αντιγραφή αριθμού άδειας" }, "copyName": { - "message": "Copy name" + "message": "Αντιγραφή ονόματος" }, "me": { "message": "Εγώ" @@ -1657,7 +1657,7 @@ "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLoginLink": { - "message": "new login", + "message": "νέα σύνδεση", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { @@ -4475,7 +4475,7 @@ "message": "Απαιτείται αναγνωριστικό οργανισμού." }, "ssoIdentifier": { - "message": "SSO identifier" + "message": "Αναγνωριστικό SSO" }, "ssoIdentifierHintPartOne": { "message": "Δώστε αυτό το αναγνωριστικό στα μέλη σας για να συνδεθείτε με SSO. Για να παρακάμψετε αυτό το βήμα, ρυθμίστε την ", @@ -6422,7 +6422,7 @@ } }, "hostname": { - "message": "Hostname", + "message": "Όνομα κεντρικού υπολογιστή", "description": "Part of a URL." }, "apiAccessToken": { @@ -6432,7 +6432,7 @@ "message": "Επαλήθευση συσκευής" }, "enableDeviceVerification": { - "message": "Turn on device verification" + "message": "Ενεργοποίηση επαλήθευσης συσκευής" }, "deviceVerificationDesc": { "message": "Verification codes are sent to your email address when logging in from an unrecognized device" @@ -6461,7 +6461,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { - "message": "Enable SCIM", + "message": "Ενεργοποίηση SCIM", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { @@ -6507,7 +6507,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "Απαιτείται είσοδος." }, "inputEmail": { "message": "Input is not an email address." @@ -6618,7 +6618,7 @@ "message": "Pick an avatar color" }, "customizeAvatar": { - "message": "Customize avatar" + "message": "Προσαρμογή avatar" }, "avatarUpdated": { "message": "Avatar updated" @@ -6645,7 +6645,7 @@ "message": "Τιρκουάζ" }, "salmon": { - "message": "Salmon" + "message": "Σολομός" }, "pink": { "message": "Ροζ" @@ -6680,7 +6680,7 @@ "message": "Απόκρυψη" }, "projects": { - "message": "Projects", + "message": "Έργα", "description": "Description for the Projects field." }, "lastEdited": { @@ -6730,23 +6730,23 @@ "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project", + "message": "Έργο", "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project", + "message": "Επεξεργασία έργου", "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project", + "message": "Προβολή έργου", "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project", + "message": "Διαγραφή έργου", "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects", + "message": "Διαγραφή έργων", "description": "The action to delete multiple projects from the system." }, "secret": { @@ -6852,31 +6852,31 @@ "description": "Placeholder text for searching service accounts." }, "editServiceAccount": { - "message": "Edit service account", + "message": "Επεξεργασία λογαριασμού υπηρεσίας", "description": "Title for editing a service account." }, "addProject": { - "message": "Add project", + "message": "Προσθήκη έργου", "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited", + "message": "Το έργο τροποποιήθηκε", "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved", + "message": "Το έργο αποθηκεύτηκε", "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created", + "message": "Το έργο δημιουργήθηκε", "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name", + "message": "Όνομα έργου", "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project", + "message": "Νέο έργο", "description": "Title for creating a new project." }, "softDeleteSecretWarning": { @@ -6925,11 +6925,11 @@ "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted", + "message": "Τα έργα διαγράφηκαν", "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Project deleted", + "message": "Το έργο διαγράφηκε", "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { @@ -6943,7 +6943,7 @@ } }, "deleteProjectInputLabel": { - "message": "Type \"$CONFIRM$\" to continue", + "message": "Πληκτρολογήστε «$CONFIRM$» για να συνεχίσετε", "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { @@ -6953,7 +6953,7 @@ } }, "deleteProjectConfirmMessage": { - "message": "Delete $PROJECT$", + "message": "Διαγραφή του «$PROJECT$»", "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { @@ -6963,7 +6963,7 @@ } }, "deleteProjectsConfirmMessage": { - "message": "Delete $COUNT$ Projects", + "message": "Διαγραφή $COUNT$ έργων", "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { @@ -6985,7 +6985,7 @@ "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required", + "message": "Απαιτείται επιβεβαίωση", "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { @@ -7229,16 +7229,16 @@ "message": "Unverified" }, "domainNameTh": { - "message": "Name" + "message": "Όνομα" }, "domainStatusTh": { - "message": "Status" + "message": "Κατάσταση" }, "lastChecked": { - "message": "Last checked" + "message": "Τελευταίος έλεγχος" }, "editDomain": { - "message": "Edit domain" + "message": "Επεξεργασία τομέα" }, "domainFormInvalid": { "message": "There are form errors that need your attention" @@ -7283,10 +7283,10 @@ "message": "Verification required for this action. Set a PIN to continue." }, "setPin": { - "message": "Set PIN" + "message": "Ορισμός PIN" }, "verifyWithBiometrics": { - "message": "Verify with biometrics" + "message": "Επαλήθευση με βιομετρικά" }, "awaitingConfirmation": { "message": "Awaiting confirmation" @@ -7298,13 +7298,13 @@ "message": "Need a different method?" }, "useMasterPassword": { - "message": "Use master password" + "message": "Χρήση κύριου κωδικού πρόσβασης" }, "usePin": { - "message": "Use PIN" + "message": "Χρήση PIN" }, "useBiometrics": { - "message": "Use biometrics" + "message": "Χρήση βιομετρικών" }, "enterVerificationCodeSentToEmail": { "message": "Enter the verification code that was sent to your email." @@ -7313,10 +7313,10 @@ "message": "Resend code" }, "memberColumnHeader": { - "message": "Member" + "message": "Μέλος" }, "groupSlashMemberColumnHeader": { - "message": "Group/Member" + "message": "Ομάδα/Μέλος" }, "selectGroupsAndMembers": { "message": "Select groups and members" @@ -7430,7 +7430,7 @@ "message": "Upload" }, "acceptedFormats": { - "message": "Accepted Formats:" + "message": "Αποδεκτές μορφές:" }, "copyPasteImportContents": { "message": "Αντιγραφή & επικόλληση περιεχομένου εισαγωγής:" @@ -7579,10 +7579,10 @@ "message": "Δημιουργήστε ένα μυστικό" }, "createProject": { - "message": "Create a project" + "message": "Δημιουργία έργου" }, "createServiceAccount": { - "message": "Create a service account" + "message": "Δημιουργία λογαριασμού υπηρεσίας" }, "downloadThe": { "message": "Λήψη του", @@ -7617,16 +7617,16 @@ "message": "Restore secrets" }, "restoreSecretPrompt": { - "message": "Are you sure you want to restore this secret?" + "message": "Θέλετε σίγουρα να ανακτήσετε αυτό το μυστικό;" }, "restoreSecretsPrompt": { - "message": "Are you sure you want to restore these secrets?" + "message": "Θέλετε σίγουρα να ανακτήσετε αυτά τα μυστικά;" }, "secretRestoredSuccessToast": { - "message": "Secret restored" + "message": "Το μυστικό ανακτήθηκε" }, "secretsRestoredSuccessToast": { - "message": "Secrets restored" + "message": "Τα μυστικά ανακτήθηκαν" }, "selectionIsRequired": { "message": "Selection is required." @@ -7650,7 +7650,7 @@ "message": "This action will remove your access to the service account." }, "removeAccess": { - "message": "Remove access" + "message": "Αφαίρεση πρόσβασης" }, "checkForBreaches": { "message": "Check known data breaches for this password" @@ -7711,7 +7711,7 @@ "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" }, "loginInitiated": { "message": "Η σύνδεση ξεκίνησε" @@ -7720,7 +7720,7 @@ "message": "Device approval required. Select an approval option below:" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "Απομνημόνευση συσκευής" }, "uncheckIfPublicDevice": { "message": "Uncheck if using a public device" @@ -7735,10 +7735,10 @@ "message": "Approve with master password" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "Κρυπτογράφηση έμπιστης συσκευής" }, "trustedDevices": { - "message": "Trusted devices" + "message": "Έμπιστες συσκευές" }, "memberDecryptionOptionTdeDescriptionPartOne": { "message": "Once authenticated, members will decrypt vault data using a key stored on their device. The", @@ -7820,19 +7820,19 @@ "message": "Approve login requests below to allow the requesting member to finish logging in. Unapproved requests expire after 1 week. Verify the member’s information before approving." }, "deviceInfo": { - "message": "Device info" + "message": "Πληροφορίες συσκευής" }, "time": { - "message": "Time" + "message": "Ώρα" }, "denyAllRequests": { - "message": "Deny all requests" + "message": "Απόρριψη όλων των αιτημάτων" }, "denyRequest": { - "message": "Deny request" + "message": "Απόρριψη αιτήματος" }, "approveRequest": { - "message": "Approve request" + "message": "Έγκριση αιτήματος" }, "noDeviceRequests": { "message": "No device requests" @@ -7910,7 +7910,7 @@ } }, "next": { - "message": "Next" + "message": "Επόμενο" }, "ssoLoginIsRequired": { "message": "SSO login is required" @@ -8165,11 +8165,11 @@ "message": "Service account access updated" }, "commonImportFormats": { - "message": "Common formats", + "message": "Κοινές μορφές", "description": "Label indicating the most common import formats" }, "maintainYourSubscription": { - "message": "To maintain your subscription for $ORG$, ", + "message": "Για να διατηρήσετε τη συνδρομή σας στο $ORG$, ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To maintain your subscription for $ORG$, add a payment method.'", "placeholders": { "org": { @@ -8179,14 +8179,14 @@ } }, "addAPaymentMethod": { - "message": "add a payment method", + "message": "προσθέστε μια μέθοδο πληρωμής", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To maintain your subscription for $ORG$, add a payment method.'" }, "organizationInformation": { - "message": "Organization information" + "message": "Πληροφορίες οργανισμού" }, "confirmationDetails": { - "message": "Confirmation details" + "message": "Στοιχεία επιβεβαίωσης" }, "smFreeTrialThankYou": { "message": "Thank you for signing up for Bitwarden Secrets Manager!" @@ -8288,13 +8288,13 @@ } }, "addField": { - "message": "Add field" + "message": "Προσθήκη πεδίου" }, "editField": { - "message": "Edit field" + "message": "Επεξεργασία πεδίου" }, "items": { - "message": "Items" + "message": "Στοιχεία" }, "assignedSeats": { "message": "Assigned seats" @@ -8309,10 +8309,10 @@ "message": "Remaining" }, "unlinkOrganization": { - "message": "Unlink organization" + "message": "Αποσύνδεση οργανισμού" }, "manageSeats": { - "message": "MANAGE SEATS" + "message": "ΔΙΑΧΕΙΡΙΣΗ ΘΕΣΕΩΝ" }, "manageSeatsDescription": { "message": "Adjustments to seats will be reflected in the next billing cycle." @@ -8378,7 +8378,7 @@ "description": "The body of a warning box shown to a user whose subscription is unpaid." }, "cancellationDate": { - "message": "Cancellation date", + "message": "Ημερομηνία ακύρωσης", "description": "The date header used when a subscription is cancelled." }, "machineAccountsCannotCreate": { @@ -8548,7 +8548,7 @@ "message": "You cannot add yourself to a group." }, "deleteProvider": { - "message": "Delete provider" + "message": "Διαγραφή παρόχου" }, "deleteProviderConfirmation": { "message": "Deleting a provider is permanent and irreversible. Enter your master password to confirm the deletion of the provider and all associated data." @@ -8590,59 +8590,59 @@ "message": "Error assigning target folder." }, "integrationsAndSdks": { - "message": "Integrations & SDKs", + "message": "Ενσωματώσεις και SDK", "description": "The title for the section that deals with integrations and SDKs." }, "integrations": { - "message": "Integrations" + "message": "Ενσωματώσεις" }, "integrationsDesc": { "message": "Automatically sync secrets from Bitwarden Secrets Manager to a third-party service." }, "sdks": { - "message": "SDKs" + "message": "SDK" }, "sdksDesc": { "message": "Use Bitwarden Secrets Manager SDK in the following programming languages to build your own applications." }, "setUpGithubActions": { - "message": "Set up Github Actions" + "message": "Ρύθμιση Github Actions" }, "setUpKubernetes": { - "message": "Set up Kubernetes" + "message": "Ρύθμιση Kubernetes" }, "setUpGitlabCICD": { - "message": "Set up GitLab CI/CD" + "message": "Ρύθμιση GitLab CI/CD" }, "setUpAnsible": { - "message": "Set up Ansible" + "message": "Ρύθμιση Ansible" }, "rustSDKRepo": { - "message": "View Rust repository" + "message": "Προβολή αποθετηρίου Rust" }, "cSharpSDKRepo": { - "message": "View C# repository" + "message": "Προβολή αποθετηρίου C#" }, "cPlusPlusSDKRepo": { - "message": "View C++ repository" + "message": "Προβολή αποθετηρίου C++" }, "jsWebAssemblySDKRepo": { - "message": "View JS WebAssembly repository" + "message": "Προβολή αποθετηρίου JS WebAssembly" }, "javaSDKRepo": { - "message": "View Java repository" + "message": "Προβολή αποθετηρίου Java" }, "pythonSDKRepo": { - "message": "View Python repository" + "message": "Προβολή αποθετηρίου Python" }, "phpSDKRepo": { - "message": "View php repository" + "message": "Προβολή αποθετηρίου php" }, "rubySDKRepo": { - "message": "View Ruby repository" + "message": "Προβολή αποθετηρίου Ruby" }, "goSDKRepo": { - "message": "View Go repository" + "message": "Προβολή αποθετηρίου Go" }, "createNewClientToManageAsProvider": { "message": "Create a new client organization to manage as a Provider. Additional seats will be reflected in the next billing cycle." @@ -8651,7 +8651,7 @@ "message": "Select a plan" }, "thirtyFivePercentDiscount": { - "message": "35% Discount" + "message": "Έκπτωση 35%" }, "monthPerMember": { "message": "month per member" @@ -8660,7 +8660,7 @@ "message": "Seats" }, "addOrganization": { - "message": "Add organization" + "message": "Προσθήκη οργανισμού" }, "createdNewClient": { "message": "Successfully created new client" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -8749,7 +8722,7 @@ } }, "back": { - "message": "Back", + "message": "Πίσω", "description": "Button text to navigate back" }, "removeItem": { @@ -8763,7 +8736,7 @@ } }, "viewInfo": { - "message": "View info" + "message": "Προβολή πληροφοριών" }, "viewAccess": { "message": "View access" @@ -8772,7 +8745,7 @@ "message": "You have not selected any collections." }, "updateName": { - "message": "Update name" + "message": "Ενημέρωση ονόματος" }, "updatedOrganizationName": { "message": "Updated organization name" @@ -8784,7 +8757,7 @@ "message": "Organization Seats" }, "providerDiscount": { - "message": "$AMOUNT$% Discount", + "message": "Έκπτωση $AMOUNT$%", "placeholders": { "amount": { "content": "$1", @@ -8832,7 +8805,7 @@ "message": "Verified" }, "viewSecret": { - "message": "View secret" + "message": "Προβολή μυστικού" }, "noClients": { "message": "There are no clients to list" @@ -8848,7 +8821,7 @@ "message": "Quickly view member access across the organization by upgrading to an Enterprise plan." }, "date": { - "message": "Date" + "message": "Ημερομηνία" }, "exportClientReport": { "message": "Export client report" @@ -8887,10 +8860,10 @@ "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker." }, "incrementsOf100,000": { - "message": "increments of 100,000" + "message": "προσαυξήσεις των 100.000" }, "smallIncrements": { - "message": "small increments" + "message": "μικρές προσαυξήσεις" }, "kdfIterationRecommends": { "message": "We recommend 600,000 or more" @@ -8926,7 +8899,7 @@ "message": "This action will remove your access to this secret." }, "invoice": { - "message": "Invoice" + "message": "Τιμολόγιο" }, "unassignedSeatsAvailable": { "message": "You have $SEATS$ unassigned seats available.", @@ -8942,7 +8915,7 @@ "message": "Contact your provider admin to purchase additional seats." }, "open": { - "message": "Open", + "message": "Ανοικτό", "description": "The status of an invoice." }, "uncollectible": { @@ -8950,10 +8923,10 @@ "description": "The status of an invoice." }, "clientDetails": { - "message": "Client details" + "message": "Στοιχεία πελάτη" }, "downloadCSV": { - "message": "Download CSV" + "message": "Λήψη CSV" }, "monthlySubscriptionUserSeatsMessage": { "message": "Adjustments to your subscription will result in prorated charges to your billing totals on your next billing period. " @@ -9024,11 +8997,71 @@ } }, "data": { - "message": "Data" + "message": "Δεδομένα" }, "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Μεταβλητές περιβάλλοντος" + }, + "organizationId": { + "message": "Αναγνωριστικό οργανισμού" + }, + "projectIds": { + "message": "Αναγνωριστικά έργου" + }, + "projectId": { + "message": "Αναγνωριστικό έργου" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "Τι είναι ο αριθμός CVV;" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, @@ -9177,14 +9210,14 @@ "message": "File saved to device. Manage from your device downloads." }, "publicApi": { - "message": "Public API", + "message": "Δημόσιο API", "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Εμφάνιση αριθμού χαρακτήρων" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Απόκρυψη αριθμού χαρακτήρων" }, "editAccess": { "message": "Edit access" diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 02667bee6b9..2f54c367692 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organisation information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organisation ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localisation" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 3b248c19996..a32fe1a382f 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organisation information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organisation ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localisation" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 454fd0cd278..955a362b5f3 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 371adaa2e94..751dd63f8fe 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 7944cc96f30..b69360d0891 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageriga" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageri ja plaaniga Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageri ja plaaniga Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageri ja plaaniga Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 1b3ac9858a6..aab9e193ad6 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 0471d3034ad..c1f9660643b 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 913b92e6d40..2be651f3b65 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -49,7 +49,7 @@ "message": "Kirjautumistiedot" }, "personalDetails": { - "message": "Henkilökohtaiset tiedot" + "message": "Henkilötiedot" }, "identification": { "message": "Tunnistautuminen" @@ -70,7 +70,7 @@ } }, "itemHistory": { - "message": "Kohdehistoria" + "message": "Kohteen historia" }, "authenticatorKey": { "message": "Todennusavain" @@ -270,17 +270,17 @@ "message": "Totuusarvo" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Valintaruutu" }, "cfTypeLinked": { "message": "Linkitetty", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Kentän tyyppi" }, "fieldLabel": { - "message": "Field label" + "message": "Kentän nimi" }, "remove": { "message": "Poista" @@ -993,7 +993,7 @@ "message": "Pääsalasanalla avaat holviisi ja on erittäin tärkeää, että muistat pääsalasanasi, koska sitä ei ole mahdollista palauttaa sen unohtuessa." }, "masterPassImportant": { - "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" }, "masterPassHintDesc": { "message": "Pääsalasanan vihje voi auttaa sinua muistamaan unohtamasi salasanan." @@ -1005,13 +1005,13 @@ "message": "Pääsalasanan vihje (valinnainen)" }, "newMasterPassHint": { - "message": "Uusi pääsalasanan vihje (valinnainen)" + "message": "Uusi pääsalasanavihje (valinnainen)" }, "masterPassHintLabel": { "message": "Pääsalasanan vihje" }, "masterPassHintText": { - "message": "Jos unohdat salasanasi, salasanan vihje voidaan lähettää sähköpostiisi. Merkkien enimmäismäärä: $CURRENT$/$MAXIMUM$.", + "message": "Jos unohdat salasanasi, voidaan salasanavihje lähettää sähköpostiisi. $CURRENT$ merkkiä $MAXIMUM$ merkin enimmäismäärä.", "placeholders": { "current": { "content": "$1", @@ -1033,7 +1033,7 @@ "message": "Pyydä vihje" }, "requestPasswordHint": { - "message": "Pyydä salasanan vihje" + "message": "Pyydä salasanavihje" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" @@ -3979,10 +3979,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "Salausavaimen päivitystä ei voida jatkaa" }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "Kansioidesi salausta ei voitu purkaa salausavaimesi päivityksen aikana. Jatkaaksesi päivitystä kansiosi on poistettava. Holvin kohteita ei poisteta, jos jatkat." }, "keyUpdated": { "message": "Avain päivitettiin" @@ -5013,31 +5013,31 @@ "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.'" }, "developmentDevOpsAndITTeamsChooseBWSecret": { - "message": "Development, DevOps, and IT teams choose Bitwarden Secrets Manager to securely manage and deploy their infrastructure and machine secrets." + "message": "Kehitys-, DevOps-, ja IT-tiimit valitsevat Bitwarden Salaisuushallinnan infansa ja konesalaisuuksiensa turvalliseen hallintaan ja käyttöön." }, "centralizeSecretsManagement": { "message": "Keskitä salaisuuksien hallinta." }, "centralizeSecretsManagementDescription": { - "message": "Säilytä ja hallitse salaisuuksia turvallisesti yhdessä paikassa ja estä salaisuuksien leviäminen organisaatiossasi." + "message": "Säilytä ja hallitse salaisuuksia turvallisesti yhdessä paikassa ja estä niiden leviäminen organisaatiossasi." }, "preventSecretLeaks": { - "message": "Estä salaisuuksien vuodot." + "message": "Estä salaisuuksia vuotamasta." }, "preventSecretLeaksDescription": { - "message": "Protect secrets with end-to-end encryption. No more hard coding secrets or sharing through .env files." + "message": "Suojaa salaisuutesi päästä päähän -salauksella. Ei tarvetta salaisuuksien kovakoodaukseen tai .env-tiedostojen jakeluun." }, "enhanceDeveloperProductivity": { "message": "Paranna kehittäjien tuottavuutta." }, "enhanceDeveloperProductivityDescription": { - "message": "Programmatically retrieve and deploy secrets at runtime so developers can focus on what matters most, like improving code quality." + "message": "Nouda ja jakele salaisuuksia ohjelmallisesti suorituksen yhteydessä, jotta kehittäjät voivat keskittyä olennaiseen, kuten koodin laadun parantamiseen." }, "strengthenBusinessSecurity": { - "message": "Paranna yrityksen turvallisuutta." + "message": "Vahvista yrityksen tietoturvaa." }, "strengthenBusinessSecurityDescription": { - "message": "Maintain tight control over machine and human access to secrets with SSO integrations, event logs, and access rotation." + "message": "Pidä koneiden ja ihmisten pääsy salaisuuksiin tiukasti hallinanssasi SSO-integraatiolla, tapahtumalokeilla ja kierrätetyllä pääsyllä." }, "tryItNow": { "message": "Kokeile sitä nyt" @@ -5061,16 +5061,16 @@ "message": "Tarvitset ylläpitäjän hyväksynnän kokeillaksesi Salaisuushallintaa." }, "smAccessRequestEmailSent": { - "message": "Pääsypyyntö Salaisuushallintaan lähetettiin sähköpostitse ylläpitäjille." + "message": "Salaisuushallinnan käyttöoikeuspyyntö lähetettiin ylläpidolle sähköpostitse." }, "requestAccessSMDefaultEmailContent": { "message": "Hei,\n\nPyydän tiimillemme Bitwarden Salaisuushallinnan tilausta ja arvostaisin tukeasi merkittävästi!\n\nBitwarden Salaisuushallinta on päästä päähän salattu sailaisuuksien hallintaratkaisu niiden turvalliseen säilytykseen ja jakamiseen sekä API-avainten, tietokantojen salasanojen ja todennusvarmenteiden kaltaisten laitetunnisteiden jakeluun.\n\nSalaisuushallinnan avulla:\n- parannamme tietoturvaa\n- suoraviivastamme toimintoja\n- estämme kalliita salaisuusvuotoja\n\nOle ilmaisesta kokeilusta yhteydessä Bitwardeniin.\n\nKiitos avustasi!" }, "giveMembersAccess": { - "message": "Anna jäsenille pääsy:" + "message": "Myönnä jäsenille käyttöoikeus:" }, "viewAndSelectTheMembers": { - "message": "tarkastele ja valitse jäseniä, joille haluat antaa pääsyn Salaisuushallintaan." + "message": "tarkastele ja valitse jäsenet, joille haluat myöntää Salaisuushallinnan käyttöoikeuden." }, "openYourOrganizations": { "message": "Avaa organisaatiosi" @@ -5079,7 +5079,7 @@ "message": "Valitse valikkoa käyttäen" }, "toGrantAccessToSelectedMembers": { - "message": "myöntääksesi pääsyn valituille jäsenille." + "message": "myöntääksesi käyttöoikeuden valituille jäsenille." }, "sendVaultCardTryItNow": { "message": "kokeile sitä nyt", @@ -5492,7 +5492,7 @@ "message": "Kirjaa käyttäjät automaattisesti sisään sallittuihin sovelluksiin" }, "automaticAppLoginDesc": { - "message": "Kirjautumislomakkeet täytetään ja lähetetään automaattisesti määritetystä identiteettitarjoastasi käynnistetyissä sovelluksissa." + "message": "Kirjautumislomakkeet täytetään ja lähetetään automaattisesti määritetyltä identiteettitarjoaltasi käynnistetyissä sovelluksissa." }, "automaticAppLoginIdpHostLabel": { "message": "Identiteettitarjoajan osoite" @@ -5501,7 +5501,7 @@ "message": "Syötä identiteettitarjoajasi URL-osoite. Syötä useat URL-osoitteet pilkuin erotetuina." }, "tdeDisabledMasterPasswordRequired": { - "message": "Organisaatiosi on päivittänyt salauksen purkuasetukset. Käytä holviasi asettamalla pääsalasana." + "message": "Organisaatiosi on muuttanut salauksen purun asetuksia. Avaa holvisi asettamalla pääsalasana." }, "maximumVaultTimeout": { "message": "Holvin aikakatkaisu" @@ -5522,7 +5522,7 @@ "message": "Minuuttia" }, "vaultTimeoutPolicyInEffect": { - "message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tunti(a) $MINUTES$ minuutti(a).", + "message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tuntia $MINUTES$ minuuttia.", "placeholders": { "hours": { "content": "$1", @@ -5535,7 +5535,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "Enintään $HOURS$ tunti(a) ja $MINUTES$ minuutti(a).", + "message": "Enintään $HOURS$ tuntia $MINUTES$ minuuttia.", "placeholders": { "hours": { "content": "$1", @@ -5548,7 +5548,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) $MINUTES$ minuutti(a). Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", + "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tuntia $MINUTES$ minuuttia. Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -5577,7 +5577,7 @@ "message": "Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset." }, "vaultCustomTimeoutMinimum": { - "message": "Mukautetun aikakatkaisun vähimmäisaika on 1 minuutti." + "message": "Mukautetun aikakatkaisun vähimmäisaika on yksi minuutti." }, "vaultTimeoutRangeError": { "message": "Holvin aikakatkaisu ei ole sallitun alueen sisällä." @@ -7889,7 +7889,7 @@ "message": "Laitehyväksyntää pyydetty." }, "tdeOffboardingPasswordSet": { - "message": "User set a master password during TDE offboarding." + "message": "Käyttäjä asetti pääsalasanan TDE offboarding -prosessin aikana." }, "startYour7DayFreeTrialOfBitwardenFor": { "message": "Aloita seitsemän päivän ilmainen Bitwarden-kokeilu organisaatiolle $ORG$", @@ -8291,7 +8291,7 @@ "message": "Lisää kenttä" }, "editField": { - "message": "Edit field" + "message": "Muokkaa kenttää" }, "items": { "message": "Kohteet" @@ -8563,7 +8563,7 @@ } }, "deleteProviderWarningDescription": { - "message": "Kaikki pääteliitokset on poistettava ennen toimittajan $ID$ poistoa.", + "message": "Kaikki asiakaskytkökset on poistettava ennen toimittajan $ID$ poistoa.", "placeholders": { "id": { "content": "$1", @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Hallitse laskutusta Toimittajaportaaliista" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden-kokeilu" + "continueSettingUpFreeTrial": { + "message": "Jatka ilmaisen Bitwarden-kokeilusi käyttöönottoa" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Teams -kokeilusi" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Jatka ilmaisen Bitwarden Salasanahallinta -kokeilusi käyttöönottoa" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Families -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Enterprise -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salaisuushallinnan kokeilu" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salaisuushallinta Teams -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salaisuushallinta Families -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salaisuushallinta Enterprise -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salasanahallinnan kokeilu" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salasanahallinta Teams -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salasanahallinta Families -kokeilusi" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Aloita seitsemän päivän ilmainen Bitwarden Salasanahallinta Enterprise -kokeilusi" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Jatka ilmaisen Bitwarden Salaisuushallinta -kokeilusi käyttöönottoa" }, "enterTeamsOrgInfo": { "message": "Syötä Teams-organisaatiosi tiedot" @@ -8863,13 +8836,13 @@ "message": "Tarkastele organisaation jäsenten käyttöoikeuksia ryhmiin, kokoelmiin ja kokoelmien kohteisiin. CSV-vienti tuottaa yksityiskohtaisen jäsenkohtaisen erittelyn, joka sisältää kokoelmaoikeudet ja tilimääritykset." }, "memberAccessReportNoCollection": { - "message": "(Ei kokoelmaa)" + "message": "(ei kokoelmaa)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(ei kokoelman käyttöoikeutta)" }, "memberAccessReportNoGroup": { - "message": "(Ei ryhmää)" + "message": "(ei ryhmää)" }, "memberAccessReportTwoFactorEnabledTrue": { "message": "Käytössä" @@ -9027,7 +9000,67 @@ "message": "Tiedot" }, "purchasedSeatsRemoved": { - "message": "ostetut käyttäjäpaikat poistettiin" + "message": "ostetta käyttäjäpaikkaa poistettiin" + }, + "environmentVariables": { + "message": "Ympäristömuuttujat" + }, + "organizationId": { + "message": "Organisaatiotunniste" + }, + "projectIds": { + "message": "Projektitunnisteet" + }, + "projectId": { + "message": "Projektitunniste" + }, + "projectsAccessedByMachineAccount": { + "message": "Tämä konetili voi käyttää seuraavia projekteja." + }, + "config": { + "message": "Määritykset" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Lisätietoja varmuuskäytöstä" + }, + "learnMoreAboutMatchDetection": { + "message": "Lisätietoja tunnistustavoista" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Lisätietoja pääsalasanan uudelleenkyselystä" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Lisätietoja holvisi hausta" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Lisätietoja tilisi tunnistelausekkeesta" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Salausavaimesi kierrätyksen vaikutus" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Lisätietoja salausalgoritmeista" + }, + "learnMoreAboutKDFIterations": { + "message": "Lisätietoja KDF-toistoista" + }, + "learnMoreAboutLocalization": { + "message": "Lisätietoja lokalisoinnista" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Lisätietoja sivustokuvakkeiden käytöstä" + }, + "learnMoreAboutUserAccess": { + "message": "Lisätietoja käyttäjien käyttöoikeuksista" + }, + "learnMoreAboutMemberRoles": { + "message": "Lisätietoja jäsenten rooleista ja käyttöoikeuksista" + }, + "whatIsACvvNumber": { + "message": "Mikä on CVC-/CVV-numero?" + }, + "learnMoreAboutApi": { + "message": "Lisätietoja Bitwardenin API:sta" }, "fileSends": { "message": "Tiedosto-Sendit" @@ -9057,7 +9090,7 @@ "message": "Valinnainen oman palvelinympäristön käyttö" }, "upgradeFreeOrganization": { - "message": "Päivitä organisaatiosi $NAME$ ", + "message": "Päivitä $NAME$-organisaatiosi ", "placeholders": { "name": { "content": "$1", @@ -9087,7 +9120,7 @@ } }, "upgradePlans": { - "message": "Upgrade your plan to invite members and experience powerful security features." + "message": "Kutsu käyttäjiä ja koe tehokkaat suojausominaisuudet päivittämällä tilauksesi." }, "upgradeDiscount": { "message": "Säästä $AMOUNT$ %", @@ -9099,10 +9132,10 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Advanced capabilities for larger organizations" + "message": "Lisäominaisuuksia suurille organisaatioille" }, "teamsPlanUpgradeMessage": { - "message": "Resilient protection for growing teams" + "message": "Vahvaa suojausta kasvaville tiimeille" }, "teamsInviteMessage": { "message": "Kutsu rajattomasti jäseniä" @@ -9165,13 +9198,13 @@ "message": "Nykyinen" }, "secretsManagerSubscriptionInfo": { - "message": "Your Secrets Manager subscription will upgrade based on the plan selected" + "message": "Salaisuushallinta-tilauksesi päivittyy valitun tilauksen mukaisesti" }, "bitwardenPasswordManager": { "message": "Bitwarden Salasanahallinta" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "Vuoden veloitukseton Salasanahallinta-tilauksesi päivittyy valittuun tilaukseen. Sinua ei veloiteta ennen ilmaisjakson päättymistä." }, "fileSavedToDevice": { "message": "Tiedosto tallennettiin laitteelle. Hallitse sitä laitteesi latauksista." diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index ba5276be623..c907b7fc2a3 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 39347c3b1de..c1c669acc74 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Gérer la facturation depuis le Portail Fournisseur" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continuer à configurer votre essai gratuit de Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden pour les Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continuer à configurer votre essai gratuit du gestionnaire de mots de passe Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden pour Familles" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden pour Entreprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden Secrets Manager pour Équipes" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden Secrets Manager pour Familles" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Commencez votre essai gratuit de 7 jours de Bitwarden Secrets Manager pour Entreprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Commencez votre essai gratuit de 7 jours du Gestionnaire de Mots de Passe Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Commencez votre essai gratuit de 7 jours du Gestionnaire de Mots de Passe Bitwarden pour Équipes" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Commencez votre essai gratuit de 7 jours du Gestionnaire de Mots de Passe Bitwarden pour Familles" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Commencez votre essai gratuit de 7 jours du Gestionnaire de Mots de Passe Bitwarden pour Entreprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continuez à configurer votre essai gratuit de Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Entrez vos informations d'organisation pour Équipes" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "licenses achetées retirées" }, + "environmentVariables": { + "message": "Variables d'environnement" + }, + "organizationId": { + "message": "ID d’organisation" + }, + "projectIds": { + "message": "ID du projet" + }, + "projectId": { + "message": "ID du projet" + }, + "projectsAccessedByMachineAccount": { + "message": "Les projets suivants peuvent être consultés par ce compte machine." + }, + "config": { + "message": "Configuration" + }, + "learnMoreAboutEmergencyAccess": { + "message": "En savoir plus sur l'accès d'urgence" + }, + "learnMoreAboutMatchDetection": { + "message": "En savoir plus sur la détection de correspondance" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "En savoir plus sur la demande de ressaisie du mot de passe principal" + }, + "learnMoreAboutSearchingYourVault": { + "message": "En savoir plus sur la recherche dans votre coffre" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "En savoir plus sur la phrase d'empreinte de votre compte" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact de la rotation de votre clé de chiffrement" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "En savoir plus sur les algorithmes de chiffrement" + }, + "learnMoreAboutKDFIterations": { + "message": "En savoir plus sur les itérations KDF" + }, + "learnMoreAboutLocalization": { + "message": "En savoir plus sur la localisation" + }, + "learnMoreAboutWebsiteIcons": { + "message": "En savoir plus sur l'utilisation des icônes de site web" + }, + "learnMoreAboutUserAccess": { + "message": "En savoir plus sur l'accès des utilisateurs" + }, + "learnMoreAboutMemberRoles": { + "message": "En savoir plus sur les rôles et les autorisations des membres" + }, + "whatIsACvvNumber": { + "message": "Qu'est-ce qu'un numéro CVV ?" + }, + "learnMoreAboutApi": { + "message": "En savoir plus sur l'API de Bitwarden" + }, "fileSends": { "message": "Déposer des Sends" }, diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 1285661d94d..d41fbb4ff49 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index d873b52c217..2dd52d914bc 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index c4fb10fa487..0f08cf9ad5b 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 881984f7c34..82afe5fe3ab 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Upravljanje naplatom s Portala pružatelja usluga" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Započni 7-dnevnu besplatnu probu Bitwardena" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden paketa Timovi" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden paketa Obitelji" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden paketa Tvrtke" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Secrets Managera" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Secrets Manager paketa Timovi" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Secrets Manager paketa Obitelji" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Secrets Manager paketa Tvrtke" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Upravitelja lozinki" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Upravitelj lozinki paketa Timovi" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Upravitelj lozinki paketa Obitelji" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Započni 7-dnevnu besplatnu probu Bitwarden Upravitelj lozinki paketa Tvrtke" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Unesi podatke za organizaciju Timovi" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "kupljenih mjesta uklonjeno" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "Send datoteke" }, diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 4ae7cae7a9b..7db2c68e09e 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "A számlázás kezelése a szolgáltatói portálon keresztül" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "A Bitwarden 7 napos ingyenes próbaverziójának elindítása" + "continueSettingUpFreeTrial": { + "message": "Folytassuk a Bitwarden ingyenes próbaverziójának beállítását." }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "A Bitwarden for Teams 7 napos ingyenes próbaverziójának elindítása" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Folytassuk a Bitwarden jelszókezelő ingyenes próbaverziójának beállítását." }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "A Bitwarden for Families 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "A Bitwarden for Enterprise 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "A Bitwarden Secrets Manager 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "A Bitwarden Secrets Manager for Teams 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "A Bitwarden Secrets Manager for Families 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "A Bitwarden Secrets Manager for Enterprise 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "A Bitwarden Password Manager 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "A Bitwarden Password Manager for Teams 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "A Bitwarden Password Manager for Families 7 napos ingyenes próbaverziójának elindítása" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "A Bitwarden password Manager for Enterprise 7 napos ingyenes próbaverziójának elindítása" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Folytassuk a Bitwarden titkos kód kezelő ingyenes próbaverziójának beállítását." }, "enterTeamsOrgInfo": { "message": "Adjuk meg a Teams szervezet információit." @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "megvásárolt hely eltávolításra került." }, + "environmentVariables": { + "message": "Környezeti változók" + }, + "organizationId": { + "message": "Szervezet AZ" + }, + "projectIds": { + "message": "Projekt azonosítók" + }, + "projectId": { + "message": "Projekt azonosító" + }, + "projectsAccessedByMachineAccount": { + "message": "A következő projektek érhetők el ezzel a gépfiókkal." + }, + "config": { + "message": "Konfiguráció" + }, + "learnMoreAboutEmergencyAccess": { + "message": "További információ a vészhelyzeti hozzáférésről" + }, + "learnMoreAboutMatchDetection": { + "message": "További információ az egyezés észlelésről" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "További információ a mesterjelszó újbóli bekéréséről" + }, + "learnMoreAboutSearchingYourVault": { + "message": "További információ a széfben keresésről" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Továbi információ a fiók ujjlenyomat kifejezéséről" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "A titkosítási kulcs elforgatásának hatása" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "További információ a titkosítási algoritmusokról" + }, + "learnMoreAboutKDFIterations": { + "message": "További információ a KDF iterációkról" + }, + "learnMoreAboutLocalization": { + "message": "További információ a nyelvi fordításról" + }, + "learnMoreAboutWebsiteIcons": { + "message": "További információ a webhelyikonok használatáról" + }, + "learnMoreAboutUserAccess": { + "message": "További információ a felhasználói hozzáférésről" + }, + "learnMoreAboutMemberRoles": { + "message": "További információ a tagi szerepekről és engedélyekről" + }, + "whatIsACvvNumber": { + "message": "Mi az a CVV szám?" + }, + "learnMoreAboutApi": { + "message": "További információ a Bitwarden API-járól" + }, "fileSends": { "message": "Fájl küldés" }, diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index eb2d40161a0..8fb655a4ad6 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 8f8c396913a..7628e19211a 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Gestisci la fatturazione dal Portale del Fornitore" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Inizia la tua prova gratuita di 7 giorni di Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Inizia la tua prova gratuita di 7 giorni di Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Inizia la tua prova gratuita di 7 giorni di Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Inizia la tua prova gratuita di 7 giorni di Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Inizia la tua prova gratis di 7 giorni del Secrets Manager di Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Inizia la tua prova gratis di 7 giorni di Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Inserisci le informazioni dell'organizzazione del tuo team" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "slot acquistati rimossi" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "Send File" }, diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 109a48f53c1..a6bdd82e13e 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -270,17 +270,17 @@ "message": "真偽値" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "チェックボックス" }, "cfTypeLinked": { "message": "リンク済", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "フィールドタイプ" }, "fieldLabel": { - "message": "Field label" + "message": "フィールドラベル" }, "remove": { "message": "削除" @@ -8291,7 +8291,7 @@ "message": "フィールドを追加" }, "editField": { - "message": "Edit field" + "message": "フィールドを編集" }, "items": { "message": "アイテム" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "プロバイダーポータルからの請求を管理" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Bitwarden の 7 日間無料トライアルを開始" + "continueSettingUpFreeTrial": { + "message": "Bitwarden の無料トライアルのセットアップを続ける" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Bitwarden チームの7日間無料トライアルを開始" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Bitwarden パスワードマネージャーの無料トライアルのセットアップを続けます" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Bitwarden ファミリーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Bitwarden エンタープライズの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Bitwarden シークレットマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "チーム向け Bitwarden シークレットマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "ファミリー向け Bitwarden シークレットマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "エンタープライズ向け Bitwarden シークレットマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Bitwarden パスワードマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "チーム向け Bitwarden パスワードマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "ファミリー向け Bitwarden パスワードマネージャーの7日間無料トライアルを開始" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "エンタープライズ向け Bitwarden パスワードマネージャーの7日間無料トライアルを開始" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Bitwarden シークレットマネージャーの無料トライアルのセットアップを続けます" }, "enterTeamsOrgInfo": { "message": "チームの組織情報を入力してください" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "購入済みシートが削除されました" }, + "environmentVariables": { + "message": "環境変数" + }, + "organizationId": { + "message": "組織 ID" + }, + "projectIds": { + "message": "プロジェクト ID" + }, + "projectId": { + "message": "プロジェクト ID" + }, + "projectsAccessedByMachineAccount": { + "message": "次のプロジェクトに、このマシンアカウントでアクセスできます。" + }, + "config": { + "message": "設定" + }, + "learnMoreAboutEmergencyAccess": { + "message": "緊急アクセスの詳細" + }, + "learnMoreAboutMatchDetection": { + "message": "マッチ検出の詳細" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "マスターパスワードの再プロンプトの詳細" + }, + "learnMoreAboutSearchingYourVault": { + "message": "保管庫検索の詳細" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "アカウントのフィンガープリントフレーズの詳細" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "暗号化キーのロテートによる影響" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "暗号化アルゴリズムの詳細" + }, + "learnMoreAboutKDFIterations": { + "message": "KDF 反復回数の詳細" + }, + "learnMoreAboutLocalization": { + "message": "ローカライズの詳細" + }, + "learnMoreAboutWebsiteIcons": { + "message": "ウェブサイトアイコンの使用方法の詳細" + }, + "learnMoreAboutUserAccess": { + "message": "ユーザーアクセスの詳細" + }, + "learnMoreAboutMemberRoles": { + "message": "メンバーのロールと権限の詳細" + }, + "whatIsACvvNumber": { + "message": "CVV 番号とは?" + }, + "learnMoreAboutApi": { + "message": "Bitwarden API の詳細" + }, "fileSends": { "message": "ファイル Send" }, diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index fc5387b8293..d24cef82ec6 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index c47975bdfea..de896a154c4 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 018c3b09189..cf6597a3b1d 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 69ae834165c..51e53d0ec25 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 6ca929d460b..7c79cb9e989 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -270,17 +270,17 @@ "message": "Patiesuma vērtība" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Izvēles rūtiņa" }, "cfTypeLinked": { "message": "Saistīts", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Lauka veids" }, "fieldLabel": { - "message": "Field label" + "message": "Lauka iezīme" }, "remove": { "message": "Noņemt" @@ -6579,7 +6579,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanāš veids vai jāvēršas pie Duo pēc palīdzības." + "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanās veids vai jāvēršas pie Duo pēc palīdzības." }, "launchDuoAndFollowStepsToFinishLoggingIn": { "message": "Jāpalaiž DUO un jāseko soļiem, lai pabeigtu pieteikšanos." @@ -8291,7 +8291,7 @@ "message": "Pievienot lauku" }, "editField": { - "message": "Edit field" + "message": "Labot lauku" }, "items": { "message": "Vienumi" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Norēķinus var pārvaldīt Nodrošinātāju portālā" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden izmēģinājumu" + "continueSettingUpFreeTrial": { + "message": "Turpināt iestatīt savu Bitwarden bezmaksas izmēģinājumu" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden komandām izmēģinājumu" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Turpināt iestatīt savu Bitwarden paroļu pārvaldnieka bezmaksas izmēģinājumu" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden ģimenēm izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden uzņēmējdarbībai izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden noslēpumu pārvaldnieka izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden noslēpumu pārvaldnieka komandām izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden noslēpumu pārvaldnieka ģimenēm izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden noslēpumu pārvaldnieka uzņēmējdarbībai izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden paroļu pārvaldnieka izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden paroļu pārvaldnieka komandām izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden paroļu pārvaldnieka ģimenēm izmēģinājumu" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Uzsāc savu 7 dienu bezmaksas Bitwarden paroļu pārvaldnieka uzņēmējdarbībai izmēģinājumu" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Turpināt iestatīt savu Bitwarden noslēpumu pārvaldnieka bezmaksas izmēģinājumu" }, "enterTeamsOrgInfo": { "message": "Jāievada informācija par savas komandas apvienību" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "iegādātās vietas noņemtas" }, + "environmentVariables": { + "message": "Vides mainīgie" + }, + "organizationId": { + "message": "Apvienības Id" + }, + "projectIds": { + "message": "Projektu Id" + }, + "projectId": { + "message": "Projekta Id" + }, + "projectsAccessedByMachineAccount": { + "message": "Šis mašīnu konts var piekļūt zemāk esošajiem projektiem." + }, + "config": { + "message": "Konfigurācija" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Uzzināt vairāk par ārkārtas piekļuvi" + }, + "learnMoreAboutMatchDetection": { + "message": "Uzzināt vairāk par atbilstības noteikšanu" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Uzzināt vairāk par galvenās paroles atkārtotu uzvednes rādīšanu" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Uzzināt vairāk par meklēšanu savā glabātavā" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Uzzināt vairāk par sava konta atpazīšanas vārdkopu" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Šifrēšanas atslēgas maiņas ietekme" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Uzzināt vairāk par šifrēšanas algoritmiem" + }, + "learnMoreAboutKDFIterations": { + "message": "Uzzināt vairāk par KDF atkārtojumiem" + }, + "learnMoreAboutLocalization": { + "message": "Uzzināt vairāk par lokalizāciju" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Uzzināt vairāk par tīmekļvietņu ikonu izmantošanu" + }, + "learnMoreAboutUserAccess": { + "message": "Uzzināt vairāk par lietotāju piekļuvi" + }, + "learnMoreAboutMemberRoles": { + "message": "Uzzināt vairāk par dalībnieku lomām un atļaujām" + }, + "whatIsACvvNumber": { + "message": "Kas ir CVV numurs?" + }, + "learnMoreAboutApi": { + "message": "Uzzināt vairāk par Bitwarden API" + }, "fileSends": { "message": "Datņu Send" }, @@ -9162,7 +9195,7 @@ "message": "Līdz 20 mašīnu kontu" }, "current": { - "message": "Current" + "message": "Pašreizējais" }, "secretsManagerSubscriptionInfo": { "message": "Noslēpumu pārvaldnieka abonements tiks uzlabots atbilstoši izvēlētajam plānam" diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 581c7c90f5e..e3f9c72ea09 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index c47975bdfea..de896a154c4 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index c47975bdfea..de896a154c4 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 98df867e6bf..ca478c0e5d7 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 14c7f61fbe7..dd0b9042e71 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 96ae8d48182..9564258a68b 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Begin je 7-daagse gratis Bitwarden-proefperiode" + "continueSettingUpFreeTrial": { + "message": "Doorgaan met het instellen van je gratis proefperiode van Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Begin je 7-daagse gratis proefperiode voor Bitwarden voor Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Doorgaan met het instellen van je gratis proefperiode van Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Begin je 7-daagse gratis proefperiode voor Bitwarden voor Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Begin je 7-daagse gratis proefperiode voor Bitwarden voor Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Secrets Manager voor Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Secrets Manager voor Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Secrets Manager voor Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Wachtwoord Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Wachtwoord Manager voor Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Wachtwoord Manager voor Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Begin je gratis 7-daagse proefperiode van Bitwarden Wachtwoord Manager voor Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Doorgaan met het instellen van je gratis proefperiode van Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Voer je organisatie-informatie voor Teams in" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "gekochte plaatsen verwijderd" }, + "environmentVariables": { + "message": "Omgevingsvariabelen" + }, + "organizationId": { + "message": "Organisatie-ID" + }, + "projectIds": { + "message": "Project-IDs" + }, + "projectId": { + "message": "Project-ID" + }, + "projectsAccessedByMachineAccount": { + "message": "De volgende projecten zijn toegankelijk voor dit machine-account." + }, + "config": { + "message": "Configuratie" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Lees meer over noodtoegang" + }, + "learnMoreAboutMatchDetection": { + "message": "Lees meer over overeenkomstdetectie" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Lees meer over het opnieuw vragen van het hoofdwachtwoord" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Lees meer over het doorzoeken van je kluis" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Lees meer over de vingerafdrukzin van je account" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact van het roteren van je encryptiesleutel" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Lees meer over versleutelingsalgoritmen" + }, + "learnMoreAboutKDFIterations": { + "message": "Lees meer over KDF-iteraties" + }, + "learnMoreAboutLocalization": { + "message": "Lees meer over lokaliseren" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Lees meer over het gebruik van website-pictogrammen" + }, + "learnMoreAboutUserAccess": { + "message": "Lees meer over gebruikerstoegang" + }, + "learnMoreAboutMemberRoles": { + "message": "Lees meer over rollen en rechten van leden" + }, + "whatIsACvvNumber": { + "message": "Wat is een CVV-nummer?" + }, + "learnMoreAboutApi": { + "message": "Lees meer over Bitwarden's API" + }, "fileSends": { "message": "Bestand-Sends" }, diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index db857e8de66..1ccc3b7700d 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index c47975bdfea..de896a154c4 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 438733db707..fbc7ccbe781 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Zarządzaj płatnościami z portalu dostawcy" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Bitwarden dla zespołów" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Bitwarden dla rodzin" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Menedżera Sekretów Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Menedżera Sekretów Bitwarden dla zespołów" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny menedżera sekretów Bitwarden dla rodzin" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Menedżera haseł Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Menedżera haseł Bitwarden dla zespołów" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Rozpocznij 7-dniowy darmowy okres próbny Menedżera haseł Bitwarden dla rodzin" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "zakupione miejsca usunięte" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 552a00d074d..35e0c664f63 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Gerenciar faturamento a partir do Portal do Provedor" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Comece o seu teste grátis de 7 dias do Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden para Equipes" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden para as Famílias" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden para Empresas" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Inicie o seu teste gratuito de 7 dias do Gerenciador de Segredos do Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Comece o seu teste gratuito de 7 dias do Gerenciador de Segredos do Bitwarden para equipes" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden Secrets Manager para famílias" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden Secrets Manager para a Empresa" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Comece o seu teste gratuito de 7 dias do Gerenciador de Senhas do Bitwarden para Equipes" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden Password Manager para Famílias" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Comece o seu teste gratuito de 7 dias do Bitwarden Password Manager para a Empresa" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Insira as informações da organização de suas equipes" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "assentos comprados removidos" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "Arquivos enviados" }, diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 61bc9352918..0455402a94e 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -277,10 +277,10 @@ "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Tipo de campo" }, "fieldLabel": { - "message": "Field label" + "message": "Etiqueta do campo" }, "remove": { "message": "Remover" @@ -620,7 +620,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Copiar $FIELD$", "placeholders": { "field": { "content": "$1", @@ -629,34 +629,34 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "Copiar site" }, "copyNotes": { - "message": "Copy notes" + "message": "Copiar notas" }, "copyAddress": { - "message": "Copy address" + "message": "Copiar endereço" }, "copyPhone": { - "message": "Copy phone" + "message": "Copiar telefone" }, "copyEmail": { - "message": "Copy email" + "message": "Copiar e-mail" }, "copyCompany": { - "message": "Copy company" + "message": "Copiar empresa" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Copiar número de segurança social" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Copiar número do passaporte" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Copiar número da carta de condução" }, "copyName": { - "message": "Copy name" + "message": "Copiar nome" }, "me": { "message": "Eu" @@ -8291,7 +8291,7 @@ "message": "Adicionar campo" }, "editField": { - "message": "Edit field" + "message": "Editar campo" }, "items": { "message": "Itens" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Gira a faturação a partir do Portal do fornecedor" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continuar a configurar a sua versão experimental gratuita do Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden do plano Equipas" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continuar a configurar a sua versão experimental gratuita do Gestor de Palavras-passe do Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden do plano Familiar" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden do plano Empresarial" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Segredos" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Segredos do plano Equipas" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Segredos do plano Familiar" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Segredos do plano Empresarial" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Palavras-passe" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Palavras-passe do plano Equipas" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Palavras-passe do plano Familiar" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Inicie o seu período experimental gratuito de 7 dias do Bitwarden - Gestor de Palavras-passe do plano Empresarial" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continuar a configurar a sua versão experimental gratuita do Gestor de Segredos do Bitwarden" }, "enterTeamsOrgInfo": { "message": "Introduza as informações da organização do plano Equipas" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "lugares adquiridos removidos" }, + "environmentVariables": { + "message": "Variáveis de ambiente" + }, + "organizationId": { + "message": "ID da organização" + }, + "projectIds": { + "message": "IDs de projetos" + }, + "projectId": { + "message": "ID do projeto" + }, + "projectsAccessedByMachineAccount": { + "message": "Os seguintes projetos podem ser acedidos por esta conta automática." + }, + "config": { + "message": "Configuração" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Saiba mais sobre o acesso de emergência" + }, + "learnMoreAboutMatchDetection": { + "message": "Saiba mais sobre a deteção de correspondências" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Saiba mais sobre o novo pedido da palavra-passe mestra" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Saiba mais sobre como pesquisar no seu cofre" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Saiba mais sobre a frase de impressão digital da sua conta" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impacto da regeneração da sua chave de encriptação" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Saiba mais sobre os algoritmos de encriptação" + }, + "learnMoreAboutKDFIterations": { + "message": "Saiba mais sobre as iterações do KDF" + }, + "learnMoreAboutLocalization": { + "message": "Saiba mais sobre a localização" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Saiba mais sobre a utilização de ícones de sites" + }, + "learnMoreAboutUserAccess": { + "message": "Saiba mais sobre o acesso dos utilizadores" + }, + "learnMoreAboutMemberRoles": { + "message": "Saiba mais sobre os papéis e permissões dos membros" + }, + "whatIsACvvNumber": { + "message": "O que é um número CVV?" + }, + "learnMoreAboutApi": { + "message": "Saiba mais sobre a API do Bitwarden" + }, "fileSends": { "message": "Sends de ficheiros" }, diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 651808b005f..b60c3a5bb64 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 026f4c57c42..a771d49ab2c 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Управление биллингом на портале провайдера" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Начните 7-дневную бесплатную пробную версию Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Продолжить настройку бесплатной пробной версии Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Начните 7-дневную бесплатную пробную версию Bitwarden Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Продолжить настройку бесплатной пробной версии Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Начните 7-дневную бесплатную пробную версию Bitwarden Family" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Начните 7-дневную бесплатную пробную версию Bitwarden Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера секретов Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера секретов Bitwarden Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера секретов Bitwarden Family" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера секретов Bitwarden Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера паролей Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера паролей Bitwarden Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера паролей Bitwarden Family" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Начните 7-дневную бесплатную пробную версию менеджера паролей Bitwarden Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Продолжить настройку бесплатной пробной версии менеджера секретов Bitwarden" }, "enterTeamsOrgInfo": { "message": "Введите информацию о вашей команде" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "купленные места удалены" }, + "environmentVariables": { + "message": "Переменные окружения" + }, + "organizationId": { + "message": "ID организации" + }, + "projectIds": { + "message": "ID проектов" + }, + "projectId": { + "message": "ID проекта" + }, + "projectsAccessedByMachineAccount": { + "message": "С помощью этого машинного аккаунта можно получить доступ к следующим проектам." + }, + "config": { + "message": "Конфигурация" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Узнайте больше об экстренном доступе" + }, + "learnMoreAboutMatchDetection": { + "message": "Узнайте больше об обнаружении совпадений" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Узнайте больше о повторном запросе мастер-пароля" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Узнайте больше о поиске в хранилище" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Узнайте больше о фразе отпечатка вашего аккаунта" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Последствия поворота ключа шифрования" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Узнайте больше об алгоритмах шифрования" + }, + "learnMoreAboutKDFIterations": { + "message": "Узнайте больше об итерациях KDF" + }, + "learnMoreAboutLocalization": { + "message": "Узнайте больше о локализации" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Узнайте больше об использовании значков веб-сайтов" + }, + "learnMoreAboutUserAccess": { + "message": "Узнайте больше о пользовательском доступе" + }, + "learnMoreAboutMemberRoles": { + "message": "Узнайте больше о ролях и разрешениях пользователей" + }, + "whatIsACvvNumber": { + "message": "Что такое номер CVV?" + }, + "learnMoreAboutApi": { + "message": "Узнайте больше об API Bitwarden" + }, "fileSends": { "message": "Файловая Send" }, diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index cf12c847219..f0f2fdb14da 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index f465478db66..b5cdd9781bf 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -270,17 +270,17 @@ "message": "Áno/Nie" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Zaškrtávacie pole" }, "cfTypeLinked": { "message": "Prepojené", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Typ poľa" }, "fieldLabel": { - "message": "Field label" + "message": "Názov poľa" }, "remove": { "message": "Odstrániť" @@ -521,7 +521,7 @@ "message": "Zobraziť položku" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "Nové $TYPE$", "placeholders": { "type": { "content": "$1", @@ -530,7 +530,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Upraviť $TYPE$", "placeholders": { "type": { "content": "$1", @@ -7427,7 +7427,7 @@ "message": "Nahrať súbor" }, "upload": { - "message": "Upload" + "message": "Nahrať" }, "acceptedFormats": { "message": "Akceptované formáty:" @@ -8291,7 +8291,7 @@ "message": "Pridať pole" }, "editField": { - "message": "Edit field" + "message": "Upraviť pole" }, "items": { "message": "Položky" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Spravujte fakturáciu cez portál poskytovateľa" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Pokračujte v nastavovaní vašej bezplatnej skúšobnej doby Bitwardenu" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Pokračujte v nastavovaní vašej bezplatnej skúšobnej doby Bitwarden Správcu Hesiel" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Pokračujte v nastavovaní vašej bezplatnej skúšobnej doby Bitwarden správcu tajomstiev" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "zakúpené sedenia boli odstránené" }, + "environmentVariables": { + "message": "Premenné prostredia" + }, + "organizationId": { + "message": "ID organizácie" + }, + "projectIds": { + "message": "ID projektov" + }, + "projectId": { + "message": "ID projektu" + }, + "projectsAccessedByMachineAccount": { + "message": "Tento strojový účet môže pristupovať k nasledujúcim projektom." + }, + "config": { + "message": "Konfigurácia" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Dozvedieť sa viac o núdzovom prístupe" + }, + "learnMoreAboutMatchDetection": { + "message": "Dozvedieť sa viac o spôsobe mapovania" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Dozvedieť sa viac o opätovnej výzve na zadanie hlavného hesla" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Dozvedieť sa viac o vyhľadávaní vo vašom trezore" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Dozvedieť sa viac o fráze odtlačku účtu" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Dozvedieť sa viac o obnove vášho šifrovacieho kľúča" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Dozvedieť sa viac o šifrovacom algoritme" + }, + "learnMoreAboutKDFIterations": { + "message": "Dozvedieť sa viac o KDF iteráciách" + }, + "learnMoreAboutLocalization": { + "message": "Dozvedieť sa viac o lokalizácii" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Dozvedieť sa viac o ikonách stránok" + }, + "learnMoreAboutUserAccess": { + "message": "Dozvedieť sa viac o používateľskom prístupe" + }, + "learnMoreAboutMemberRoles": { + "message": "Dozvedieť sa viac o povoleniach a rolách členov" + }, + "whatIsACvvNumber": { + "message": "Čo je číslo CVV?" + }, + "learnMoreAboutApi": { + "message": "Dozvedieť sa viac o Bitwarden API" + }, "fileSends": { "message": "Sendy so súborom" }, @@ -9165,7 +9198,7 @@ "message": "Aktuálne" }, "secretsManagerSubscriptionInfo": { - "message": "Your Secrets Manager subscription will upgrade based on the plan selected" + "message": "Vaše predplatné Secrets Manager sa obnoví na základe vybraného plánu" }, "bitwardenPasswordManager": { "message": "Bitwarden Správca Hesiel" diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index fd85410de5e..b5b2a744532 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 47028dc73d7..588cce614be 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -270,17 +270,17 @@ "message": "Булове" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Поље за потврду" }, "cfTypeLinked": { "message": "Повезано", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Врста поља" }, "fieldLabel": { - "message": "Field label" + "message": "Ознака поља" }, "remove": { "message": "Уклони" @@ -530,7 +530,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Уреди $TYPE$", "placeholders": { "type": { "content": "$1", @@ -7427,7 +7427,7 @@ "message": "Отпремање датотеке" }, "upload": { - "message": "Upload" + "message": "Отпреми" }, "acceptedFormats": { "message": "Прихваћени формати:" @@ -8291,7 +8291,7 @@ "message": "Додај поље" }, "editField": { - "message": "Edit field" + "message": "Уреди поље" }, "items": { "message": "Ставке" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Управљајте наплатом из Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden-а" + "continueSettingUpFreeTrial": { + "message": "Наставите са подешавањем бесплатне пробне верзије Bitwarden-а" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden-а за Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Наставите са подешавањем бесплатне пробне верзије Bitwarden менаџер лозинки" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden-а за Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden-а за Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Secrets Manager за Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Secrets Manager за Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Secrets Manager за Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Password Manager за Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Password Manager за Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Започните своју 7-дневну бесплатну пробну Bitwarden Password Manager за Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Наставите са подешавањем бесплатне пробне верзије Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Унесите своје информације о организацији Teams" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "купљена места уклоњена" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Сазнајте више о приступу у хитним случајевима" + }, + "learnMoreAboutMatchDetection": { + "message": "Сазнајте више о откривању подударања" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Сазнајте више о поновном постављању главне лозинке" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Сазнајте више о претраживању вашег сефа" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Сазнајте више о фрази отиска прста на налогу" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Утицај ротирања кључа за шифровање" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Сазнајте више о алгоритмима за шифровање" + }, + "learnMoreAboutKDFIterations": { + "message": "Сазнајте више о KDF понављања" + }, + "learnMoreAboutLocalization": { + "message": "Сазнајте више о локализацији" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Сазнајте више о коришћењу икона веб локација" + }, + "learnMoreAboutUserAccess": { + "message": "Сазнајте више о приступу корисника" + }, + "learnMoreAboutMemberRoles": { + "message": "Сазнајте више о улогама и дозволама чланова" + }, + "whatIsACvvNumber": { + "message": "Шта је CVV број?" + }, + "learnMoreAboutApi": { + "message": "Сазнајте више о API Bitwarden-а" + }, "fileSends": { "message": "Датотека „Send“" }, @@ -9165,7 +9198,7 @@ "message": "Тренутно" }, "secretsManagerSubscriptionInfo": { - "message": "Your Secrets Manager subscription will upgrade based on the plan selected" + "message": "Ваша претплата на Secrets Manager ће се надоградити на основу одабраног плана" }, "bitwardenPasswordManager": { "message": "Bitwarden Менаџер Лозинке" diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 655e4ab9c1e..c9eb9391c1a 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index a9e0f922c71..43817b3f763 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -277,10 +277,10 @@ "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Fälttyp" }, "fieldLabel": { - "message": "Field label" + "message": "Fältetikett" }, "remove": { "message": "Ta bort" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Starta din 7-dagars gratis provperiod av Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Starta din 7-dagars gratis provperiod av Bitwarden Lösenordshanterare" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Miljövariabler" + }, + "organizationId": { + "message": "Organisations-ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Projekt-ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Läs mer om nödåtkomst" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "Vad är ett CVV-nummer?" + }, + "learnMoreAboutApi": { + "message": "Läs mer om Bitwardens API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index c47975bdfea..de896a154c4 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index c81b481680f..e9160221b09 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index eed06bb780a..03a18764bf0 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -270,17 +270,17 @@ "message": "Boolean" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Onay kutusu" }, "cfTypeLinked": { "message": "Bağlantılı", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Alan türü" }, "fieldLabel": { - "message": "Field label" + "message": "Alan etiketi" }, "remove": { "message": "Kaldır" @@ -8291,7 +8291,7 @@ "message": "Alan ekle" }, "editField": { - "message": "Edit field" + "message": "Alanı düzenle" }, "items": { "message": "Kayıtlar" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "7 günlük ücretsiz Bitwarden denemenizi başlatın" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Ortam değişkenleri" + }, + "organizationId": { + "message": "Kuruluş kimliği" + }, + "projectIds": { + "message": "Proje kimlikleri" + }, + "projectId": { + "message": "Proje kimliği" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Yapılandırma" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "Dosya Send'leri" }, diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index da6b1854c6c..745ca2379c9 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -270,17 +270,17 @@ "message": "Логічне значення" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Прапорець" }, "cfTypeLinked": { "message": "Пов'язано", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Тип поля" }, "fieldLabel": { - "message": "Field label" + "message": "Мітка поля" }, "remove": { "message": "Вилучити" @@ -7514,7 +7514,7 @@ "message": "Група/Користувач" }, "lowKdfIterations": { - "message": "Низький показник KDF-ітерацій" + "message": "Низьке значення ітерацій KDF" }, "updateLowKdfIterationsDesc": { "message": "Оновіть свої налаштування шифрування згідно з новими рекомендаціями щодо безпеки для вдосконалення захисту облікового запису." @@ -8291,7 +8291,7 @@ "message": "Додати поле" }, "editField": { - "message": "Edit field" + "message": "Редагувати поле" }, "items": { "message": "Записи" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Керування рахунками на порталі провайдера" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Розпочніть 7-денний пробний період Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Продовжити налаштування безплатної пробної версії Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Розпочніть 7-денний пробний період Bitwarden для команд" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Продовжити налаштування безплатної пробної версії менеджера паролів Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Розпочніть 7-денний пробний період Bitwarden для родини" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Розпочніть 7-денний пробний період Bitwarden для компаній" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера секретів Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера секретів Bitwarden для команд" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера секретів Bitwarden для родини" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера секретів Bitwarden для компаній" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера паролів Bitwarden" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера паролів Bitwarden для команд" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера паролів Bitwarden для родини" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Розпочніть безплатний 7-денний пробний період менеджера паролів Bitwarden для компаній" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Продовжити налаштування безплатної пробної версії менеджера секретів Bitwarden" }, "enterTeamsOrgInfo": { "message": "Введіть інформацію про організацію своєї команди" @@ -8793,7 +8766,7 @@ } }, "lowKDFIterationsBanner": { - "message": "Низьке значення KDF ітерацій. Збільште значення для посилання безпеки свого облікового запису." + "message": "Низьке значення ітерацій KDF. Збільште значення для посилення безпеки свого облікового запису." }, "changeKDFSettings": { "message": "Змінити налаштування KDF" @@ -8884,7 +8857,7 @@ "message": "Вимк" }, "higherKDFIterations": { - "message": "Вищі значення KDF-ітерацій можуть допомогти захистити ваш головний пароль від грубого зламу зловмисником." + "message": "Вищі значення ітерацій KDF можуть допомогти захистити ваш головний пароль від грубого зламу зловмисником." }, "incrementsOf100,000": { "message": "кроком 100 000" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "куплених місць вилучено" }, + "environmentVariables": { + "message": "Змінні середовища" + }, + "organizationId": { + "message": "Ідентифікатор організації" + }, + "projectIds": { + "message": "Ідентифікатори проєктів" + }, + "projectId": { + "message": "Ідентифікатор проєкту" + }, + "projectsAccessedByMachineAccount": { + "message": "За допомогою цього машинного облікового запису можна отримати доступ до таких проєктів." + }, + "config": { + "message": "Конфігурація" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Докладніше про екстрений доступ" + }, + "learnMoreAboutMatchDetection": { + "message": "Докладніше про виявлення збігів" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Докладніше про повторний запит головного пароля" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Докладніше про пошук у сховищі" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Докладніше про фразу відбитка вашого облікового запису" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Наслідки оновлення ключа шифрування" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Докладніше про алгоритми шифрування" + }, + "learnMoreAboutKDFIterations": { + "message": "Докладніше про ітерації KDF" + }, + "learnMoreAboutLocalization": { + "message": "Докладніше про локалізацію" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Докладніше про використання піктограм вебсайтів" + }, + "learnMoreAboutUserAccess": { + "message": "Докладніше про доступ користувачів" + }, + "learnMoreAboutMemberRoles": { + "message": "Докладніше про ролі учасників і дозволи" + }, + "whatIsACvvNumber": { + "message": "Що таке номер CVV?" + }, + "learnMoreAboutApi": { + "message": "Докладніше про Bitwarden API" + }, "fileSends": { "message": "Відправлення файлів" }, diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 28bc09fe280..529c08a56fb 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "Manage billing from the Provider Portal" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 7f4ed0436f1..28bb2f86185 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -246,7 +246,7 @@ "message": "Bitwarden 可以存储并填充两步验证码。选择相机图标来截取此网站的验证器二维码,或者手动复制并粘贴密钥到此字段。" }, "learnMoreAboutAuthenticators": { - "message": "了解更多关于验证器的信息" + "message": "进一步了解验证器" }, "folder": { "message": "文件夹" @@ -270,17 +270,17 @@ "message": "布尔型" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "复选框型" }, "cfTypeLinked": { "message": "链接型", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "字段类型" }, "fieldLabel": { - "message": "Field label" + "message": "字段标签" }, "remove": { "message": "移除" @@ -885,7 +885,7 @@ "message": "新增通行密钥" }, "learnMoreAboutPasswordless": { - "message": "了解更多关于无密码登录的信息" + "message": "进一步了解无密码登录" }, "creatingPasskeyLoading": { "message": "正在创建通行密钥..." @@ -3979,7 +3979,7 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "加密密钥更新无法继续" + "message": "无法继续加密密钥更新" }, "keyUpdateFoldersFailed": { "message": "更新您的加密密钥时,无法解密您的文件夹。要继续更新,文件夹必须被删除。继续操作不会删除密码库项目。" @@ -5604,7 +5604,7 @@ "message": "不完整或不信任的网站可以使用页面加载时自动填充。" }, "learnMoreAboutAutofill": { - "message": "了解更多关于自动填充的信息" + "message": "进一步了解自动填充" }, "selectType": { "message": "选择 SSO 类型" @@ -8291,7 +8291,7 @@ "message": "添加字段" }, "editField": { - "message": "Edit field" + "message": "编辑字段" }, "items": { "message": "项目" @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "从提供商门户管理账单" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "开始您的 Bitwarden 7 天免费试用" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "开始您的团队版 Bitwarden 7 天免费试用" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "开始您的家庭版 Bitwarden 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "开始您的企业版 Bitwarden 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "开始您的 Bitwarden 机密管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "开始您的团队版 Bitwarden 机密管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "开始您的家庭版 Bitwarden 机密管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "开始您的企业版 Bitwarden 机密管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "开始您的 Bitwarden 密码管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "开始您的团队版 Bitwarden 密码管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "开始您的家庭版 Bitwarden 密码管理器 7 天免费试用" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "开始您的企业版 Bitwarden 密码管理器 7 天免费试用" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "输入您的团队组织信息" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "购买的席位已移除" }, + "environmentVariables": { + "message": "环境变量" + }, + "organizationId": { + "message": "组织 ID" + }, + "projectIds": { + "message": "项目 ID" + }, + "projectId": { + "message": "项目 ID" + }, + "projectsAccessedByMachineAccount": { + "message": "以下项目可以通过本机账户访问。" + }, + "config": { + "message": "配置" + }, + "learnMoreAboutEmergencyAccess": { + "message": "进一步了解紧急访问" + }, + "learnMoreAboutMatchDetection": { + "message": "进一步了解匹配检测" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "进一步了解主密码重新提示" + }, + "learnMoreAboutSearchingYourVault": { + "message": "进一步了解搜索密码库" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "进一步了解账户指纹短语" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "轮换加密密钥的影响" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "进一步了解加密算法" + }, + "learnMoreAboutKDFIterations": { + "message": "进一步了解 KDF 迭代" + }, + "learnMoreAboutLocalization": { + "message": "进一步了解本地化" + }, + "learnMoreAboutWebsiteIcons": { + "message": "进一步了解网站图标的使用" + }, + "learnMoreAboutUserAccess": { + "message": "进一步了解用户访问权限" + }, + "learnMoreAboutMemberRoles": { + "message": "进一步了解成员角色和权限" + }, + "whatIsACvvNumber": { + "message": "CVV 码是什么?" + }, + "learnMoreAboutApi": { + "message": "进一步了解 Bitwarden API" + }, "fileSends": { "message": "文件 Send" }, diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 29b106af6bb..12ff2018a2e 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -867,7 +867,7 @@ "message": "保持此視窗打開,然後按照瀏覽器的提示進行操作。" }, "useADifferentLogInMethod": { - "message": "使用不同的登入方法" + "message": "改用不同的登入方式" }, "loginWithPasskey": { "message": "使用密碼金鑰登入" @@ -906,10 +906,10 @@ "message": "命名您的密碼金鑰以方便您辨識它。" }, "useForVaultEncryption": { - "message": "用於密碼庫加密" + "message": "用於驗證密碼庫" }, "useForVaultEncryptionInfo": { - "message": "於支援的裝置不使用主密碼登入與解鎖。依循後續於瀏覽器的指令以完成最終設定。\nLog in and unlock on supported devices without your master password. Follow the prompts from your browser to finalize setup." + "message": "不需要使用主密碼,就可在支援該功能的裝置上登入。請依照瀏覽器指示完成設定。" }, "useForVaultEncryptionErrorReadingPasskey": { "message": "密碼金鑰讀取錯誤。再試一次或者取消勾選此選項。" @@ -921,7 +921,7 @@ "message": "設定加密" }, "usedForEncryption": { - "message": "使用加密" + "message": "用於加密" }, "loginWithPasskeyEnabled": { "message": "密碼金鑰登入已開啓" @@ -1251,7 +1251,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "使用任何具有 WebAuthn 功能的安全鑰匙來存取您的帳戶。" + "message": "使用任何與 WebAuthn 相容的安全金鑰來存取您的帳戶。" }, "webAuthnMigrated": { "message": "(遷移自 FIDO)" @@ -1302,7 +1302,7 @@ "message": "您確定要繼續嗎?" }, "moveSelectedItemsDesc": { - "message": "Choose a folder that you would like to add the $COUNT$ selected item(s) to.", + "message": "選擇要將這 $COUNT$ 個項目移動至哪個資料夾。", "placeholders": { "count": { "content": "$1", @@ -1678,7 +1678,7 @@ "message": "資料匯入成功" }, "importSuccessNumberOfItems": { - "message": "一共匯入了 $AMOUNT$ 個項目。", + "message": "一共匯入 $AMOUNT$ 個項目。", "placeholders": { "amount": { "content": "$1", @@ -2111,7 +2111,7 @@ "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "orgsReportsDesc": { - "message": "點選下方的報告,識別並消除組織帳號的安全漏洞。", + "message": "點選下方的報告,辨識並消除組織帳號的安全漏洞。", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { @@ -2168,13 +2168,13 @@ "message": "說明" }, "exposedPasswordsReport": { - "message": "暴露的密碼" + "message": "洩露的密碼" }, "exposedPasswordsReportDesc": { "message": "在資料外洩事件中暴露的密碼很容易成為攻擊者的目標。變更這些密碼以防止潛在的入侵。" }, "exposedPasswordsFound": { - "message": "發現暴露的密碼" + "message": "發現洩露的密碼" }, "exposedPasswordsFoundReportDesc": { "message": "我們在你的 $VAULT$ 中發現 $COUNT$ 項項目的密碼在已知資料外洩事件中暴露。你應該變更它們以使用新密碼。", @@ -2193,7 +2193,7 @@ "message": "您的密碼庫中沒有在已知資料外洩事件中被暴露密碼的項目。" }, "checkExposedPasswords": { - "message": "檢查暴露的密碼" + "message": "檢查洩露的密碼" }, "exposedXTimes": { "message": "已暴露 $COUNT$ 次", @@ -2205,7 +2205,7 @@ } }, "weakPasswordsReport": { - "message": "弱式密碼" + "message": "弱密碼" }, "weakPasswordsReportDesc": { "message": "弱密碼很容易被攻擊者猜到。使用密碼產生器將這些密碼變更為安全性更高的密碼。" @@ -2397,7 +2397,7 @@ } }, "premiumPriceWithFamilyPlan": { - "message": "升級到進階會員只需 $PRICE$/年,或是可為 $FAMILYPLANUSERCOUNT$ 個使用者取得進階會員與無限制的家庭共享只需: ", + "message": "升級到進階會員只需 $PRICE$/年,或是升級到含有 $FAMILYPLANUSERCOUNT$ 位進階使用者,可無限制家庭共享的 ", "placeholders": { "price": { "content": "$1", @@ -2657,7 +2657,7 @@ "message": "聯絡客戶支援部門" }, "contactSupportShort": { - "message": "聯絡支援部門" + "message": "聯絡客服" }, "updatedPaymentMethod": { "message": "已更新付款方式。" @@ -2836,7 +2836,7 @@ } }, "onPremHostingOptional": { - "message": "內部部署(選用)" + "message": "內部架設(選用)" }, "usersGetPremium": { "message": "使用者取得了進階功能的存取權限" @@ -3034,7 +3034,7 @@ "message": "在下方輸入 Bitwarden 帳戶的電子郵件位址,以邀請新使用者加入您的組織。若他們沒有 Bitwarden 帳戶,系統將提示他們建立新帳戶。" }, "inviteMultipleEmailDesc": { - "message": "透過使用逗號分隔,您可以一次輸入最多 $COUNT$ 個電子郵件地阯。", + "message": "可使用逗號分隔最多 $COUNT$ 組電子郵件地址。", "placeholders": { "count": { "content": "$1", @@ -3055,7 +3055,7 @@ "message": "已確認" }, "clientOwnerEmail": { - "message": "用戶擁有者電子郵件" + "message": "用戶擁有者電子郵件地址" }, "owner": { "message": "擁有者" @@ -3121,7 +3121,7 @@ "message": "CLI 命令列介面" }, "bitWebVault": { - "message": "Bitwarden 網頁密碼庫" + "message": "Bitwarden 網頁版密碼庫" }, "bitSecretsManager": { "message": "Bitwarden Secrets Manager" @@ -3574,10 +3574,10 @@ "message": "群組存取" }, "groupAccessUserDesc": { - "message": "透過將成員添加到 1 個或多個群組來授予他們對集合的存取權限。" + "message": "將成員加入到 1 或多個群組,即可授予他們對不同分類的存取權限。" }, "invitedUsers": { - "message": "已邀請使用者。" + "message": "已邀請使用者" }, "resendInvitation": { "message": "重新傳送邀請" @@ -3586,7 +3586,7 @@ "message": "重新傳送電子郵件" }, "hasBeenReinvited": { - "message": "已重新邀請 $USER$。", + "message": "已重新邀請 $USER$", "placeholders": { "user": { "content": "$1", @@ -3643,7 +3643,7 @@ "message": "無法驗證電子郵件。請嘗試傳送一封新的驗證電子郵件。" }, "emailVerificationRequired": { - "message": "需要驗證電子郵件" + "message": "需要驗證電子郵件地址" }, "emailVerificationRequiredDesc": { "message": "必須驗證您的電子郵件才能使用此功能。" @@ -3706,7 +3706,7 @@ "message": "如果您的帳戶存在,我們將傳送一封包含詳細指示的電子郵件。" }, "deleteRecoverConfirmDesc": { - "message": "您已要求刪除您的 Bitwarden 帳戶。點選下方的按鈕以確認。" + "message": "您已要求刪除您的 Bitwarden 帳戶。請點選下方的按鈕確認。" }, "deleteRecoverOrgConfirmDesc": { "message": "You have requested to delete your Bitwarden organization." @@ -3838,7 +3838,7 @@ "message": "為您的訂閲設定席位限制。達到此限制後,您將無法邀請新的成員。" }, "limitSmSubscriptionDesc": { - "message": "為您的 Secrets Manger 訂閲設定席位限制。達到此限制後,就無法邀請新成員。" + "message": "為您的機密管理員訂閲設定席位限制。達到此限制後,就無法邀請新成員。" }, "maxSeatLimit": { "message": "席位限制(選用)", @@ -3877,7 +3877,7 @@ "message": "已更新訂閲" }, "subscribedToSecretsManager": { - "message": "訂閱已更新。您現在可以存取 Secrets Manager 了。" + "message": "訂閱已更新。您現在可以存取機密管理員了。" }, "additionalOptions": { "message": "額外選項" @@ -3904,7 +3904,7 @@ } }, "subscriptionUserSeatsWithoutAdditionalSeatsOption": { - "message": "您可以邀請最多 $COUNT$ 個成員,而無需額外付款。聯絡客戶支援團隊升級您的方案並邀請更多成員。", + "message": "您可以邀請最多 $COUNT$ 個成員,而無需額外付款。聯絡客服團隊升級您的方案並邀請更多成員。", "placeholders": { "count": { "content": "$1", @@ -3991,7 +3991,7 @@ "message": "更新加密金鑰" }, "updateEncryptionSchemeDesc": { - "message": "我們變更了加密方案以提供更好的安全性。 立即透過在下面輸入您的主密碼來更新您的加密金鑰。" + "message": "我們變更了加密方法以加強安全性。請在下面輸入主密碼來更新您的加密金鑰。" }, "updateEncryptionKeyWarning": { "message": "更新加密金鑰後,您需要登出並重新登入目前使用的所有 Bitwarden 應用程式(如行動應用程式或瀏覽器擴充套件)。登出和重新登入(這會下載新的加密金鑰)失敗可能會導致資料損毀。我們將嘗試自動登出,但可能會有所延遲。" @@ -4172,7 +4172,7 @@ "message": "此項目包含需要修正的舊檔案附件。" }, "attachmentFixDescription": { - "message": "此附件使用了過時的加密方式。 選擇「修正」以下載、重新加密,然後重新上傳此附件。" + "message": "此附件使用了過時的加密方式。選擇「修正」以下載、重新加密,然後重新上傳此附件。" }, "fix": { "message": "修正", @@ -4367,7 +4367,7 @@ } }, "permanentlyDeletedItemId": { - "message": "已永久刪除項目 $ID$", + "message": "已永久刪除 $ID$ 項目", "placeholders": { "id": { "content": "$1", @@ -4388,7 +4388,7 @@ "message": "項目已還原" }, "restoredItemId": { - "message": "已還原項目 $ID$", + "message": "已還原 $ID$ 項目", "placeholders": { "id": { "content": "$1", @@ -4448,13 +4448,13 @@ "message": "包含所有團隊版功能" }, "includeAllTeamsStarterFeatures": { - "message": "All Teams Starter features, plus:" + "message": "所有 Teams Starter 版功能,以及:" }, "chooseMonthlyOrAnnualBilling": { "message": "選擇按月或按年計費" }, "abilityToAddMoreThanNMembers": { - "message": "Ability to add more than $COUNT$ members", + "message": "能夠新增 $COUNT$ 位以上的成員", "placeholders": { "count": { "content": "$1", @@ -5098,7 +5098,7 @@ "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.**'" }, "sendAccessCreatorIdentifier": { - "message": "Bitwarden 成員 $USER_IDENTIFIER$ 與您共用了以下內容", + "message": "Bitwarden 成員 $USER_IDENTIFIER$ 與您分享下列資訊", "placeholders": { "user_identifier": { "content": "$1", @@ -5160,7 +5160,7 @@ "message": "撤銷成功!" }, "eventEnrollAccountRecovery": { - "message": "使用者 $ID$ 注冊了帳戶復原。", + "message": "使用者 $ID$ 參與帳戶復原。", "placeholders": { "id": { "content": "$1", @@ -5169,7 +5169,7 @@ } }, "eventWithdrawAccountRecovery": { - "message": "使用者 $ID$ 撤銷了帳戶復原", + "message": "使用者 $ID$ 撤銷了帳戶復原。", "placeholders": { "id": { "content": "$1", @@ -5325,7 +5325,7 @@ "message": "成功還原對組織的存取權限" }, "bulkFilteredMessage": { - "message": "已排除,不適用於此動作。" + "message": "已排除,不適用於此動作" }, "fingerprint": { "message": "指紋" @@ -5486,7 +5486,7 @@ "message": "您的主密碼不符合此組織原則的要求。您必須現在更新主密碼才可以加入此組織。繼續操作會登出您目前的工作階段,並要求您重新登入帳戶。其他裝置上的活動工作階段最多會保持一個小時。" }, "updateWeakMasterPasswordWarning": { - "message": "您的主密碼不符合一個或多個組織原則要求。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能繼續長達一小時。" + "message": "您的主密碼不符合一個或多個組織政策規定。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能持續長達一小時。" }, "automaticAppLogin": { "message": "Automatically log in users for allowed applications" @@ -5522,7 +5522,7 @@ "message": "分鐘" }, "vaultTimeoutPolicyInEffect": { - "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。", + "message": "您的組織政策已限定您密碼庫逾時的時間長度。密碼庫逾時時間最高可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。", "placeholders": { "hours": { "content": "$1", @@ -5548,7 +5548,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作被設定為 $ACTION$。", + "message": "您的組織政策正影響您的密碼庫逾時時間。密碼庫逾時時間最高可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作被設定為 $ACTION$。", "placeholders": { "hours": { "content": "$1", @@ -5565,7 +5565,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "您的組織原則已將密碼庫逾時動作設定為 $ACTION$。", + "message": "您的組織政策已將密碼庫逾時動作設定為 $ACTION$。", "placeholders": { "action": { "content": "$1", @@ -5598,10 +5598,10 @@ "message": "啓用自動填入" }, "activateAutofillPolicyDesc": { - "message": "為所有現有的和新的成員啓用瀏覽器擴充套件上的頁面載入時自動填入設定。" + "message": "為所有現有的和新的成員,啓用瀏覽器擴充套件上的頁面載入自動填入設定。" }, "experimentalFeature": { - "message": "被入侵或不可信任的網站可不當利用頁面載入時的自動填入功能。" + "message": "被入侵或不被信任的網站,可能會濫用頁面載入的自動填入功能。" }, "learnMoreAboutAutofill": { "message": "進一步瞭解「自動填入」功能" @@ -5634,7 +5634,7 @@ "message": "客戶 ID" }, "clientSecret": { - "message": "客戶端機密" + "message": "客戶機密" }, "metadataAddress": { "message": "中繼資料位址" @@ -5724,7 +5724,7 @@ "message": "簽署身分驗證要求" }, "ssoSettingsSaved": { - "message": "已儲存單一登入設定。" + "message": "單一登入設定已儲存" }, "sponsoredFamilies": { "message": "免費的 Bitwarden 家庭方案" @@ -5742,7 +5742,7 @@ "message": "最多 6 位使用者的付費方案存取權限" }, "sponsoredFamiliesSharedCollections": { - "message": "用於家庭機密的共用集合" + "message": "用於家庭機密的共用分類" }, "badToken": { "message": "連結已失效。請讓贊助者重新傳送邀請。" @@ -6102,7 +6102,7 @@ "message": "必填" }, "charactersCurrentAndMaximum": { - "message": "$CURRENT$/$MAX$ character maximum", + "message": "最多 $CURRENT$/$MAX$ 字元", "placeholders": { "current": { "content": "$1", @@ -6154,7 +6154,7 @@ } }, "exportingOrganizationVaultDesc": { - "message": "僅匯出與 $ORGANIZATION$ 關聯的組織密碼庫項目。個人密碼庫項目或其他組織中的項目將不包括在内。", + "message": "僅匯出與 $ORGANIZATION$ 相關的組織密碼庫項目。個人密碼庫項目或其他組織中的項目將不包括在内。", "placeholders": { "organization": { "content": "$1", @@ -6558,10 +6558,10 @@ } }, "multipleInputEmails": { - "message": "一個或多個電子郵件無效" + "message": "一或多個電子郵件地址無效" }, "tooManyEmails": { - "message": "您一次最多只能送出 $COUNT$ 個電子郵件", + "message": "您一次最多只能送出 $COUNT$ 組電子郵件地址", "placeholders": { "count": { "content": "$1", @@ -7085,7 +7085,7 @@ "message": "更新" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "再加上 $QUANTITY$ 個", "placeholders": { "quantity": { "content": "$1", @@ -7100,7 +7100,7 @@ "message": "授予成員對該群組已指派的集合的存取權限。" }, "editGroupCollectionsDesc": { - "message": "透過將他們添加到此群組,授予對集合的存取權限。" + "message": "將成員加入到此群組,即可授予他們對不同分類的存取權限。" }, "restrictedCollectionAssignmentDesc": { "message": "You can only assign collections you manage." @@ -7109,7 +7109,7 @@ "message": "選擇成員" }, "selectCollections": { - "message": "選擇集合" + "message": "選擇分類" }, "role": { "message": "角色" @@ -7118,10 +7118,10 @@ "message": "移除成員" }, "collection": { - "message": "集合" + "message": "分類" }, "noCollection": { - "message": "沒有集合" + "message": "沒有分類" }, "canView": { "message": "可以檢視" @@ -7136,7 +7136,7 @@ "message": "可以編輯(除了密碼)" }, "noCollectionsAdded": { - "message": "未新增任何集合" + "message": "未新增任何分類" }, "noMembersAdded": { "message": "未新增任何成員" @@ -7157,7 +7157,7 @@ "message": "沒有網域" }, "noDomainsSubText": { - "message": "連線網域允許成員在使用 SSO 登入期間跳過 SSO 識別碼欄位。" + "message": "與網域連線後,成員在使用 SSO 登入期間就可以跳過 SSO 識別碼欄位。" }, "verifyDomain": { "message": "驗證網域" @@ -7181,7 +7181,7 @@ "message": "自動網域驗證" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden 將在前 72 小時內嘗試驗證網域 3 次。如果無法驗證此網域,請檢查主機中的 DNS 記錄並手動驗證。如果無法驗證,該網域將在 7 天內從您的組織中移除" + "message": "Bitwarden 將在 72 小時內嘗試驗證網域 3 次。如果無法驗證此網域,請檢查主機的 DNS 記錄並手動進行驗證。如果超過 7 天仍無法驗證,將從您的組織中移除該網域" }, "invalidDomainNameMessage": { "message": "輸入的格式無效。格式:mydomain.com。子網域需要單獨的條目進行驗證。" @@ -7370,7 +7370,7 @@ } }, "teamsStarterPlanInvLimitReachedManageBilling": { - "message": "Teams Starter plans may have up to $SEATCOUNT$ members. Upgrade to your plan to invite more members.", + "message": "Teams Starter 方案最多可以有 $SEATCOUNT$ 個成員。請聯絡客服來升級方案,就可邀請更多成員。", "placeholders": { "seatcount": { "content": "$1", @@ -7379,7 +7379,7 @@ } }, "teamsStarterPlanInvLimitReachedNoManageBilling": { - "message": "Teams Starter plans may have up to $SEATCOUNT$ members. Contact your organization owner to upgrade your plan and invite more members.", + "message": "Teams Starter 方案最多可以有 $SEATCOUNT$ 個成員。請聯絡您的組織擁有者來升級方案,並且邀請更多成員。", "placeholders": { "seatcount": { "content": "$1", @@ -7415,7 +7415,7 @@ "message": "匯出組織機密資料" }, "exportingOrganizationSecretDataDescription": { - "message": "僅匯出與 $ORGANIZATION$ 關聯的 Secrets Manager 資料。其他產品中的項目或來自其他組織的項目將不包括在內。", + "message": "僅匯出與 $ORGANIZATION$ 關聯的機密管理員資料。其他產品中的項目或來自其他組織的項目將不包括在內。", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -7457,16 +7457,16 @@ "message": "授權成功同步" }, "licenseUploadSuccess": { - "message": "授權証上傳成功" + "message": "授權上傳成功" }, "lastLicenseSync": { - "message": "最近授权同步" + "message": "最近授權同步" }, "billingSyncHelp": { "message": "計費同步幫助" }, "licensePaidFeaturesHelp": { - "message": "授權付費功能幫助" + "message": "授權付費功能說明" }, "selfHostGracePeriodHelp": { "message": "訂閱逾期後,您有 60 天的時間將已更新的授權檔案套用到您的組織。寬限期結束於 $GRACE_PERIOD_END_DATE$。", @@ -7523,10 +7523,10 @@ "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." }, "secretsManager": { - "message": "Secrets Manager" + "message": "機密管理員" }, "secretsManagerAccessDescription": { - "message": "激活對 Secrets Manager 的使用者存取權限。" + "message": "啟用機密管理員的使用者存取權限。" }, "userAccessSecretsManagerGA": { "message": "此使用者可以存取 Secrets Manager" @@ -7554,7 +7554,7 @@ "message": "請解決下面的錯誤然後再試一次。" }, "description": { - "message": "描述" + "message": "說明" }, "errorReadingImportFile": { "message": "嘗試讀取匯入檔案時發生錯誤" @@ -7589,7 +7589,7 @@ "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" + "message": "機密管理員 CLI" }, "importSecrets": { "message": "匯入機密" @@ -7653,22 +7653,22 @@ "message": "移除存取權限" }, "checkForBreaches": { - "message": "檢查外洩密碼資料庫中是否有此密碼" + "message": "檢查外洩的密碼資料庫中是否包含此密碼" }, "exposedMasterPassword": { - "message": "已暴露的主密碼" + "message": "已洩露的主密碼" }, "exposedMasterPasswordDesc": { - "message": "在資料外洩事件中找到了密碼。我們建議您使用一個獨特的密碼來保護您的帳戶,您確定要使用已暴露的密碼嗎?" + "message": "該密碼已洩露。建議您使用一個獨特的密碼來保護您的帳戶,您確定要使用已洩露的密碼嗎?" }, "weakAndExposedMasterPassword": { - "message": "強度不足且已暴露的主密碼" + "message": "強度不足且已洩露的主密碼" }, "weakAndBreachedMasterPasswordDesc": { - "message": "密碼強度不足,且在資料外洩事件中找到了這個密碼。使用一個強度足夠和獨特的密碼來保護您的帳戶。您確定要使用這個密碼嗎?" + "message": "密碼強度不足,且該密碼已洩露。請使用一個強度足夠和獨特的密碼來保護您的帳戶。您確定要使用這個密碼嗎?" }, "characterMinimum": { - "message": "$LENGTH$ 個字元以上", + "message": "最少 $LENGTH$ 個字元以上", "placeholders": { "length": { "content": "$1", @@ -7686,7 +7686,7 @@ } }, "inputTrimValidator": { - "message": "輸入不得僅包含空格。", + "message": "輸入內容不得只有空格。", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "dismiss": { @@ -7714,19 +7714,19 @@ "message": "更新 KDF 設定" }, "loginInitiated": { - "message": "登入已發起" + "message": "登入已啟動" }, "deviceApprovalRequired": { - "message": "裝置核准已要求。請在下面選擇一個核准選項:" + "message": "裝置需要取得核准。請在下面選擇一個核准選項:" }, "rememberThisDevice": { "message": "記住這個裝置" }, "uncheckIfPublicDevice": { - "message": "若使用公用裝置,请勿選中" + "message": "若使用公用裝置,請勿勾選" }, "approveFromYourOtherDevice": { - "message": "從其他裝置核准" + "message": "使用其他裝置核准" }, "requestAdminApproval": { "message": "要求管理員核准" @@ -7769,11 +7769,11 @@ "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, SSO required policy, and account recovery administration policy with automatic enrollment will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "您的組織權限已更新,要求您設定一個主密碼。", + "message": "您的組織權限已更新,因此您需要設定主密碼。", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "您的組織要求您設定一個主密碼。", + "message": "您的組織要求您設定主密碼。", "description": "Used as a card title description on the set password page to explain why the user is there" }, "notFound": { @@ -7793,21 +7793,21 @@ "message": "復原帳戶" }, "updatedTempPassword": { - "message": "使用者更新了透過帳戶復原頒發的密碼。" + "message": "使用者更新了透過帳戶復原發送的密碼。" }, "activatedAccessToSecretsManager": { - "message": "已激活對 Secrets Manager 的存取權限", + "message": "已啟用對機密管理員的存取權限", "description": "Confirmation message that one or more users gained access to Secrets Manager" }, "activateAccess": { - "message": "激活存取權限" + "message": "啟用存取權限" }, "bulkEnableSecretsManagerDescription": { - "message": "授予以下成員對 Secrets Manager 的存取權限。在 Password Manager 授予的角色也適用於 Secrets Manager。", + "message": "授予以下成員對機密管理員的存取權限。在密碼管理員授予的角色也適用於機密管理員。", "description": "This description is shown to an admin when they are attempting to add more users to Secrets Manager." }, "activateSecretsManager": { - "message": "激活 Secrets Manager" + "message": "啟用 Secrets Manager" }, "yourOrganizationsFingerprint": { "message": "您組織的指紋短語", @@ -7913,13 +7913,13 @@ "message": "下一步" }, "ssoLoginIsRequired": { - "message": "SSO login is required" + "message": "需要登入 SSO" }, "selectedRegionFlag": { "message": "選定的區域標記" }, "accountSuccessfullyCreated": { - "message": "已成功建立帳戶!" + "message": "帳戶已成功建立!" }, "adminApprovalRequested": { "message": "已要求管理員核准" @@ -7937,7 +7937,7 @@ "message": "登入已核准" }, "userEmailMissing": { - "message": "缺少使用者電子郵件" + "message": "缺少使用者電子郵件地址" }, "deviceTrusted": { "message": "裝置已信任" @@ -7954,7 +7954,7 @@ "message": "邀請使用者" }, "secretsManagerForPlan": { - "message": "Secrets Manager for $PLAN$", + "message": "$PLAN$ 的 Secrets Manager", "placeholders": { "plan": { "content": "$1", @@ -8002,10 +8002,10 @@ } }, "subscribeToSecretsManager": { - "message": "訂閲 Secrets Manager" + "message": "訂閲機密管理員" }, "addSecretsManagerUpgradeDesc": { - "message": "將 Secrets Manager 加入您的升級方案,來記錄維持存取於先前方案中保存的秘密資訊。" + "message": "將機密管理員加入您的升級方案,來維持先前方案建立的秘密資訊的存取權限。" }, "additionalServiceAccounts": { "message": "額外服務帳戶" @@ -8029,28 +8029,28 @@ } }, "collectionManagement": { - "message": "集合管理" + "message": "分類管理" }, "collectionManagementDesc": { - "message": "管理組織集合的行為" + "message": "管理組織分類的行為" }, "limitCollectionCreationDeletionDesc": { "message": "對擁有者和管理員限制集合的建立和刪除" }, "allowAdminAccessToAllCollectionItemsDesc": { - "message": "Owners and admins can manage all collections and items" + "message": "擁有人與管理員可以管理所有分類與項目" }, "updatedCollectionManagement": { "message": "更新了集合管理設定" }, "passwordManagerPlanPrice": { - "message": "密碼管理器方案價格" + "message": "密碼管理員方案價格" }, "secretsManagerPlanPrice": { - "message": "Secrets Manager 方案價格" + "message": "機密管理員方案價格" }, "passwordManager": { - "message": "密碼管理器" + "message": "密碼管理員" }, "freeOrganization": { "message": "免費組織" @@ -8074,13 +8074,13 @@ "message": "Beta 版" }, "assignCollectionAccess": { - "message": "指派集合存取權限" + "message": "指派分類存取權限" }, "editedCollections": { - "message": "編輯了集合" + "message": "編輯了分類" }, "baseUrl": { - "message": "伺服器 URL" + "message": "伺服器網址" }, "aliasDomain": { "message": "別名網域" @@ -8107,7 +8107,7 @@ "message": "密碼金鑰不會被複製到新的項目中。您要繼續複製此項目嗎?" }, "modifiedCollectionManagement": { - "message": "修改了集合管理設定 $ID$。", + "message": "已修改的分類管理設定 $ID$。", "placeholders": { "id": { "content": "$1", @@ -8116,7 +8116,7 @@ } }, "seeDetailedInstructions": { - "message": "請參閱我們的幫助網站上的詳細說明:", + "message": "請參閱我們說明網站上的詳細說明於", "description": "This is followed a by a hyperlink to the help website." }, "installBrowserExtension": { @@ -8126,22 +8126,22 @@ "message": "Use the extension to quickly save logins and auto-fill forms without opening the web app." }, "projectAccessUpdated": { - "message": "Project access updated" + "message": "專案存取權限已更新" }, "unexpectedErrorSend": { - "message": "An unexpected error has occurred while loading this Send. Try again later." + "message": "載入此 Send 時發生了為預期錯誤。請稍後再試一次。" }, "seatLimitReached": { - "message": "Seat limit has been reached" + "message": "已達到席次上限" }, "contactYourProvider": { - "message": "Contact your provider to purchase additional seats." + "message": "請聯絡您的供應商並購買額外席次。" }, "seatLimitReachedContactYourProvider": { - "message": "Seat limit has been reached. Contact your provider to purchase additional seats." + "message": "已達到席次上限,請聯絡您的供應商並購買額外席次。" }, "collectionAccessRestricted": { - "message": "Collection access is restricted" + "message": "有限的分類的存取權限" }, "readOnlyCollectionAccess": { "message": "You do not have access to manage this collection." @@ -8683,41 +8683,14 @@ "manageBillingFromProviderPortalMessage": { "message": "從提供者入口網站管理計費" }, - "startYour7DayFreeTrialOfBitwarden": { - "message": "Start your 7-Day free trial of Bitwarden" + "continueSettingUpFreeTrial": { + "message": "Continue setting up your free trial of Bitwarden" }, - "startYour7DayFreeTrialOfBitwardenForTeams": { - "message": "Start your 7-Day free trial of Bitwarden for Teams" + "continueSettingUpFreeTrialPasswordManager": { + "message": "Continue setting up your free trial of Bitwarden Password Manager" }, - "startYour7DayFreeTrialOfBitwardenForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden for Families" - }, - "startYour7DayFreeTrialOfBitwardenForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManager": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManager": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForTeams": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Teams" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForFamilies": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Families" - }, - "startYour7DayFreeTrialOfBitwardenPasswordManagerForEnterprise": { - "message": "Start your 7-Day free trial of Bitwarden Password Manager for Enterprise" + "continueSettingUpFreeTrialSecretsManager": { + "message": "Continue setting up your free trial of Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Enter your Teams organization information" @@ -9029,6 +9002,66 @@ "purchasedSeatsRemoved": { "message": "purchased seats removed" }, + "environmentVariables": { + "message": "Environment variables" + }, + "organizationId": { + "message": "Organization ID" + }, + "projectIds": { + "message": "Project IDs" + }, + "projectId": { + "message": "Project ID" + }, + "projectsAccessedByMachineAccount": { + "message": "The following projects can be accessed by this machine account." + }, + "config": { + "message": "Config" + }, + "learnMoreAboutEmergencyAccess": { + "message": "Learn more about emergency access" + }, + "learnMoreAboutMatchDetection": { + "message": "Learn more about match detection" + }, + "learnMoreAboutMasterPasswordReprompt": { + "message": "Learn more about master password re-prompt" + }, + "learnMoreAboutSearchingYourVault": { + "message": "Learn more about searching your vault" + }, + "learnMoreAboutYourAccountFingerprintPhrase": { + "message": "Learn about your account fingerprint phrase" + }, + "impactOfRotatingYourEncryptionKey": { + "message": "Impact of rotating your encryption key" + }, + "learnMoreAboutEncryptionAlgorithms": { + "message": "Learn more about encryption algorithms" + }, + "learnMoreAboutKDFIterations": { + "message": "Learn more about KDF iterations" + }, + "learnMoreAboutLocalization": { + "message": "Learn more about localization" + }, + "learnMoreAboutWebsiteIcons": { + "message": "Learn more about using website icons" + }, + "learnMoreAboutUserAccess": { + "message": "Learn more about user access" + }, + "learnMoreAboutMemberRoles": { + "message": "Learn more about member roles and permissions" + }, + "whatIsACvvNumber": { + "message": "What is a CVV number?" + }, + "learnMoreAboutApi": { + "message": "Learn more about Bitwarden's API" + }, "fileSends": { "message": "File Sends" }, From 69bf91a15e0705338eec05947d488dede21ca2e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 09:48:14 +0000 Subject: [PATCH 082/104] Autosync the updated translations (#11196) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/fi/messages.json | 10 +- apps/desktop/src/locales/lv/messages.json | 2 +- apps/desktop/src/locales/zh_TW/messages.json | 178 +++++++++---------- 3 files changed, 95 insertions(+), 95 deletions(-) diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 430aaf6c7fe..76941909112 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -515,7 +515,7 @@ "message": "Pääsalasana" }, "masterPassDesc": { - "message": "Pääsalasanalla pääset käsiksi holviisi. On erittäin tärkeää, että muistat pääsalasanasi, koska sen palautus ei ole mahdollista, jos unohdat sen." + "message": "Pääsalasanalla pääset käsiksi holviisi. On erittäin tärkeää, että muistat pääsalasanasi, koska sitä ei ole mahdollista palauttaa, jos unohdat sen." }, "masterPassHintDesc": { "message": "Pääsalasanan vihje voi auttaa sinua muistamaan unohtamasi salasanan." @@ -543,7 +543,7 @@ "message": "Pääsalasana" }, "masterPassImportant": { - "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" }, "confirmMasterPassword": { "message": "Vahvista pääsalasana" @@ -2103,7 +2103,7 @@ "message": "Minuuttia" }, "vaultTimeoutPolicyInEffect1": { - "message": "Enintään $HOURS$ tunti(a) ja $MINUTES$ minuutti(a).", + "message": "Enintään $HOURS$ tuntia $MINUTES$ minuuttia.", "placeholders": { "hours": { "content": "$1", @@ -2116,7 +2116,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) $MINUTES$ minuutti(a). Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", + "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tuntia $MINUTES$ minuuttia. Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2611,7 +2611,7 @@ "message": "Sinut on kirjattu ulos, koska päivitystunnistettasi ei voitu noutaa. Ratkaise ongelma kirjautumalla sisään uudelleen." }, "masterPasswordHint": { - "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" }, "characterMinimum": { "message": "Vähintään $LENGTH$ merkkiä", diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 04095d43a39..19b07379e5c 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -2848,7 +2848,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanāš veids vai jāvēršas pie Duo pēc palīdzības." + "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanās veids vai jāvēršas pie Duo pēc palīdzības." }, "launchDuoAndFollowStepsToFinishLoggingIn": { "message": "Jāpalaiž Duo un jāseko soļiem, lai pabeigtu pieteikšanos." diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index a24be1b0c39..954af24c45f 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -239,7 +239,7 @@ "message": "Ms" }, "mx": { - "message": "Mx" + "message": "非二元" }, "dr": { "message": "Dr" @@ -419,7 +419,7 @@ "message": "特殊字元 (!@#$%^&*)" }, "numWords": { - "message": "單字數量" + "message": "單字數" }, "wordSeparator": { "message": "單字分隔字元" @@ -479,7 +479,7 @@ "message": "檔案最大為 500MB。" }, "encryptionKeyMigrationRequired": { - "message": "需要遷移加密金鑰。請透過網頁版密碼庫登入以更新您的加密金鑰。" + "message": "需要遷移加密金鑰。請透過網頁版登入密碼庫以更新您的加密金鑰。" }, "editedFolder": { "message": "資料夾已儲存" @@ -500,7 +500,7 @@ "message": "建立帳戶" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "設定一個強密碼" }, "finishCreatingYourAccountBySettingAPassword": { "message": "Finish creating your account by setting a password" @@ -540,19 +540,19 @@ } }, "masterPassword": { - "message": "Master password" + "message": "主密碼" }, "masterPassImportant": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "如果您忘記主密碼,沒有復原的方法!" }, "confirmMasterPassword": { - "message": "Confirm master password" + "message": "確認主密碼" }, "masterPassHintLabel": { - "message": "Master password hint" + "message": "主密碼提示" }, "joinOrganization": { - "message": "Join organization" + "message": "加入組織" }, "finishJoiningThisOrganizationBySettingAMasterPassword": { "message": "Finish joining this organization by setting a master password." @@ -561,13 +561,13 @@ "message": "設定" }, "accountEmail": { - "message": "Account email" + "message": "電子郵件帳戶:" }, "requestHint": { "message": "Request hint" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "主密碼提示" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" @@ -787,7 +787,7 @@ "message": "圖示伺服器 URL" }, "environmentSaved": { - "message": "環境 URL 已儲存" + "message": "已儲存環境網址" }, "ok": { "message": "確定" @@ -835,7 +835,7 @@ "message": "登出" }, "addNewLogin": { - "message": "新增登入資料" + "message": "新增登入資訊" }, "addNewItem": { "message": "新增項目" @@ -1068,7 +1068,7 @@ "message": "即使最小化到選單列,也在 Dock 中顯示 Bitwarden 圖示。" }, "confirmTrayTitle": { - "message": "確認隱藏到系統匣" + "message": "確認隱藏系統匣" }, "confirmTrayDesc": { "message": "禁用此設定也將禁用所有其他系統匣相關設定。" @@ -1406,31 +1406,31 @@ "message": "檔案格式" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "此檔案匯出將受密碼保護,需要檔案密碼才能解密。" }, "filePassword": { "message": "檔案密碼" }, "exportPasswordDescription": { - "message": "This password will be used to export and import this file" + "message": "此密碼將用於匯出和匯入此檔案" }, "accountRestrictedOptionDescription": { - "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + "message": "使用衍生自您帳戶的使用者名稱與主密碼的加密金鑰,加密此匯出檔案,並限制只能匯入到目前的 Bitwarden 帳戶。" }, "passwordProtected": { - "message": "Password protected" + "message": "密碼保護" }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "設定一組檔案密碼來加密匯出的資料,並使用此密碼解密以匯入至任意 Bitwarden 帳戶。" }, "exportTypeHeading": { - "message": "Export type" + "message": "匯出類型" }, "accountRestricted": { - "message": "Account restricted" + "message": "帳戶已限制" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm file password“ do not match." + "message": "「檔案密碼」與「確認檔案密碼」不一致。" }, "hCaptchaUrl": { "message": "hCaptcha URL", @@ -1556,19 +1556,19 @@ "message": "解鎖您的密碼庫" }, "autoPromptWindowsHello": { - "message": "啟動時詢問 Windows Hello" + "message": "啟動應用程式時詢問 Windows Hello" }, "autoPromptPolkit": { "message": "Ask for system authentication on launch" }, "autoPromptTouchId": { - "message": "啟動時詢問 Touch ID" + "message": "啟動應用程式時要求 Touch ID" }, "requirePasswordOnStart": { - "message": "需要在啟動應用程式時輸入密碼或 PIN 碼。" + "message": "要求在啟動應用程式時輸入密碼或 PIN 碼" }, "recommendedForSecurity": { - "message": "Recommended for security." + "message": "為提升安全,建議使用。" }, "lockWithMasterPassOnRestart1": { "message": "Lock with master password on restart" @@ -1644,7 +1644,7 @@ "message": "需要重新驗證才能再次存取密碼庫。" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "設定解鎖方法來變更您的密碼庫逾時動作。" + "message": "設定一個解鎖方式來變更您的密碼庫逾時動作。" }, "lock": { "message": "鎖定", @@ -1685,11 +1685,11 @@ "message": "設定主密碼" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "你的組織權限已更新,要求你設定一個主密碼。", + "message": "您的組織權限已更新,因此您需要設定主密碼。", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "你的組織要求你設定一個主密碼。", + "message": "您的組織要求您設定主密碼。", "description": "Used as a card title description on the set password page to explain why the user is there" }, "verificationRequired": { @@ -1835,10 +1835,10 @@ "message": "如果您沒有發起過此要求,請不要核准它。" }, "biometricsNotEnabledTitle": { - "message": "生物特徵辨識未啟用" + "message": "生物特徵辨識功能未設定" }, "biometricsNotEnabledDesc": { - "message": "需先在桌面應用程式的設定中啟用生物特徵辨識,才能使用瀏覽器的生物特徵辨識。" + "message": "需先在桌面應用程式設定中設定生物特徵辨識,才能使用瀏覽器的生物特徵辨識功能。" }, "biometricsManualSetupTitle": { "message": "Automatic setup not available" @@ -1847,7 +1847,7 @@ "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?" }, "personalOwnershipSubmitError": { - "message": "由於某個企業原則,您被限制為儲存項目到您的個人密碼庫。將擁有權變更為組織,並從可用的集合中選擇。" + "message": "由於生效中的某個企業原則,您不可將項目儲存至您的個人密碼庫。請將所有權變更為組織帳號,並選擇可用的分類。" }, "hintEqualsPassword": { "message": "密碼提示不能與您的密碼相同。" @@ -1856,7 +1856,7 @@ "message": "組織原則正在影響您的擁有權選項。" }, "personalOwnershipPolicyInEffectImports": { - "message": "組織原則已禁止您將項目匯入至您的個人密碼庫。" + "message": "某個組織政策已禁止您將項目匯入至您的個人密碼庫。" }, "allSends": { "message": "所有 Send", @@ -1908,7 +1908,7 @@ "message": "目前存取次數" }, "disableSend": { - "message": "停用此 Send 以阻止任何人存取。", + "message": "停用 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { @@ -2055,7 +2055,7 @@ "message": "您的主密碼最近被您的組織管理者變更過。要存取密碼庫,您必須現在更新主密碼。繼續操作會登出目前的登入階段,要求您重新登入。其他裝置上使用中的登入階段可能持續最長一個小時。" }, "updateWeakMasterPasswordWarning": { - "message": "您的主密碼不符合一個或多個組織原則要求。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能繼續長達一小時。" + "message": "您的主密碼不符合一個或多個組織政策規定。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能持續長達一小時。" }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." @@ -2116,7 +2116,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作被設定為 $ACTION$。", + "message": "您的組織政策正影響您的密碼庫逾時時間。密碼庫逾時時間最高可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作被設定為 $ACTION$。", "placeholders": { "hours": { "content": "$1", @@ -2133,7 +2133,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "您的組織原則已將密碼庫逾時動作設定為 $ACTION$。", + "message": "您的組織政策已將密碼庫逾時動作設定為 $ACTION$。", "placeholders": { "action": { "content": "$1", @@ -2145,7 +2145,7 @@ "message": "您的密碼庫逾時時間超過組織設定的限制。" }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "邀請已接受" }, "resetPasswordPolicyAutoEnroll": { "message": "自動註冊" @@ -2217,7 +2217,7 @@ "message": "切換帳戶" }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "已經有一個帳戶了嗎?" }, "options": { "message": "選項" @@ -2238,10 +2238,10 @@ } }, "exportingOrganizationVaultTitle": { - "message": "Exporting organization vault" + "message": "正匯出組織密碼庫" }, "exportingOrganizationVaultDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "message": "僅匯出與 $ORGANIZATION$ 相關的組織密碼庫項目。個人密碼庫項目或其他組織中的項目將不包括在内。", "placeholders": { "organization": { "content": "$1", @@ -2468,7 +2468,7 @@ "message": "使用其他裝置登入" }, "loginInitiated": { - "message": "登入已發起" + "message": "登入已啟動" }, "notificationSentDevice": { "message": "已傳送通知至您的裝置。" @@ -2480,7 +2480,7 @@ "message": "指紋短語" }, "needAnotherOption": { - "message": "必須先在 Bitwarden 應用程式設定中開啟後,才可以使用裝置登入。要改用其他選項嗎?" + "message": "必須先在 Bitwarden 應用程式設定中開啟,才可以使用裝置登入。要改用其他選項嗎?" }, "viewAllLoginOptions": { "message": "檢視所有登入選項" @@ -2551,7 +2551,7 @@ "message": "登入要求已逾期。" }, "thisRequestIsNoLongerValid": { - "message": "此請求已失效" + "message": "此請求已失效。" }, "confirmLoginAtemptForMail": { "message": "確認 $EMAIL$ 的登入嘗試", @@ -2587,19 +2587,19 @@ "message": "to edit your email address." }, "exposedMasterPassword": { - "message": "已暴露的主密碼" + "message": "已洩露的主密碼" }, "exposedMasterPasswordDesc": { - "message": "在資料外洩事件中找到了密碼。我們建議您使用一個獨特的密碼來保護您的帳戶,您確定要使用已暴露的密碼嗎?" + "message": "該密碼已洩露。建議您使用一個獨特的密碼來保護您的帳戶,您確定要使用已洩露的密碼嗎?" }, "weakAndExposedMasterPassword": { - "message": "強度不足且已暴露的主密碼" + "message": "強度不足且已洩露的主密碼" }, "weakAndBreachedMasterPasswordDesc": { - "message": "密碼強度不足,且在資料外洩事件中找到了這個密碼。使用一個強度足夠和獨特的密碼來保護您的帳戶。您確定要使用這個密碼嗎?" + "message": "密碼強度不足,且該密碼已洩露。請使用一個強度足夠和獨特的密碼來保護您的帳戶。您確定要使用這個密碼嗎?" }, "checkForBreaches": { - "message": "檢查外洩密碼資料庫中是否有此密碼" + "message": "檢查外洩的密碼資料庫中是否包含此密碼" }, "important": { "message": "重要:" @@ -2611,10 +2611,10 @@ "message": "You have been logged out because your refresh token could not be retrieved. Please log in again to resolve this issue." }, "masterPasswordHint": { - "message": "如果您忘記主密碼,沒有復原的方法!" + "message": "若您忘記主密碼,將會無法找回!" }, "characterMinimum": { - "message": "$LENGTH$ 個字元以上", + "message": "最少 $LENGTH$ 個字元以上", "placeholders": { "length": { "content": "$1", @@ -2626,50 +2626,50 @@ "message": "Bitwarden 建議更新您的生物特徵辨識設定,以便在首次解鎖時要求您的主密碼(或 PIN 碼)。您想立即更新您的設定嗎?" }, "windowsBiometricUpdateWarningTitle": { - "message": "Recommended Settings Update" + "message": "建議設定更新" }, "deviceApprovalRequired": { - "message": "裝置核准已要求。請在下面選擇一個核准選項:" + "message": "裝置需要取得核准。請在下面選擇一個核准選項:" }, "rememberThisDevice": { "message": "記住這個裝置" }, "uncheckIfPublicDevice": { - "message": "若使用公用裝置,请勿選中" + "message": "若使用公用裝置,請勿勾選" }, "approveFromYourOtherDevice": { - "message": "從其他裝置批准" + "message": "使用其他裝置核准" }, "requestAdminApproval": { "message": "要求管理員核准" }, "approveWithMasterPassword": { - "message": "使用主密碼批准" + "message": "使用主密碼核准" }, "region": { "message": "區域" }, "ssoIdentifierRequired": { - "message": "需要單一登入 (SSO) 組織識別碼。" + "message": "需要組織 SSO 識別碼。" }, "eu": { - "message": "EU", + "message": "歐盟", "description": "European Union" }, "loggingInOn": { "message": "正登入到" }, "selfHostedServer": { - "message": "自建" + "message": "自架" }, "accessDenied": { "message": "拒絕存取。您沒有檢視此頁面的權限。" }, "accountSuccessfullyCreated": { - "message": "已成功建立帳戶!" + "message": "帳戶已成功建立!" }, "adminApprovalRequested": { - "message": "需要管理員批准" + "message": "已要求管理員核准" }, "adminApprovalRequestSentToAdmins": { "message": "您的要求已傳送給您的管理員。" @@ -2684,7 +2684,7 @@ "message": "登入已核准" }, "userEmailMissing": { - "message": "缺少使用者電子郵件" + "message": "缺少使用者電子郵件地址" }, "deviceTrusted": { "message": "裝置已信任" @@ -2744,10 +2744,10 @@ } }, "multipleInputEmails": { - "message": "一個或多個電子郵件無效。" + "message": "一或多個電子郵件地址無效" }, "inputTrimValidator": { - "message": "輸入不得僅包含空格。", + "message": "輸入內容不得只有空格。", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { @@ -2778,7 +2778,7 @@ "message": "全部清除" }, "plusNMore": { - "message": "+ $QUANTITY$ 個更多", + "message": "再加上 $QUANTITY$ 個", "placeholders": { "quantity": { "content": "$1", @@ -2802,7 +2802,7 @@ "message": "密碼金鑰不會被複製" }, "passkeyNotCopiedAlert": { - "message": "密碼金鑰不會被複製到克隆的項目。 您想繼續克隆該項目嗎?" + "message": "不會將密碼金鑰複製到拓製的項目中。您想繼續拓製該項目嗎?" }, "aliasDomain": { "message": "別名網域" @@ -2815,19 +2815,19 @@ "message": "匯入時發生錯誤" }, "importErrorDesc": { - "message": "您嘗試匯入的資料有問題,請處理下方列出的來源檔案中的錯誤然後再試一次。" + "message": "您嘗試匯入的資料有問題,請解決下列來源檔案中的錯誤然後再試一次。" }, "resolveTheErrorsBelowAndTryAgain": { "message": "請解決下面的錯誤然後再試一次。" }, "description": { - "message": "描述" + "message": "說明" }, "importSuccess": { "message": "資料匯入成功" }, "importSuccessNumberOfItems": { - "message": "一共匯入了 $AMOUNT$ 個項目。", + "message": "一共匯入 $AMOUNT$ 個項目。", "placeholders": { "amount": { "content": "$1", @@ -2860,10 +2860,10 @@ "message": "Launch Duo in Browser" }, "importFormatError": { - "message": "資料格式不正確。請檢查您匯入的檔案後再試一次。" + "message": "資料格式不正確。請檢查匯入檔案後再試一次。" }, "importNothingError": { - "message": "沒有匯入任何內容。" + "message": "未匯入任何內容。" }, "importEncKeyError": { "message": "解密匯出的檔案時發生錯誤,您的加密金鑰與匯出資料時使用的金鑰不同。" @@ -2881,10 +2881,10 @@ "message": "選擇一個資料夾" }, "selectImportCollection": { - "message": "選擇一個集合" + "message": "選擇一個分類" }, "importTargetHint": { - "message": "如果您要將匯入檔案的内容移動到 $DESTINATION$,請選擇此選項", + "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": { @@ -2894,7 +2894,7 @@ } }, "importUnassignedItemsError": { - "message": "檔案包含未指派的項目。" + "message": "檔案包含未指派項目。" }, "selectFormat": { "message": "選擇匯入檔案的格式" @@ -2931,7 +2931,7 @@ "message": "確認檔案密碼" }, "exportSuccess": { - "message": "Vault data exported" + "message": "密碼庫資料已匯出" }, "multifactorAuthenticationCancelled": { "message": "多因素驗證已取消" @@ -2946,7 +2946,7 @@ "message": "密碼不正確" }, "incorrectCode": { - "message": "驗證碼不正確" + "message": "代碼不正確" }, "incorrectPin": { "message": "PIN 碼不正確" @@ -2958,28 +2958,28 @@ "message": "包含共用的資料夾" }, "lastPassEmail": { - "message": "LastPass Email" + "message": "LastPass 電子郵件" }, "importingYourAccount": { - "message": "正在匯入您的帳戶..." + "message": "正在匯入您的帳戶…" }, "lastPassMFARequired": { - "message": "要求 LastPass 多因素驗證" + "message": "需要進行 LastPass 多因素驗證" }, "lastPassMFADesc": { - "message": "輸入來自身分驗證 App 的一次性通行代碼" + "message": "輸入來自驗證程式的單次使用通行碼" }, "lastPassOOBDesc": { - "message": "在身分驗證 App 中核准登入請求或輸入一次性通行代碼。" + "message": "在驗證程式中核准登入請求或輸入單次使用通行碼。" }, "passcode": { - "message": "繞行代碼" + "message": "密碼" }, "lastPassMasterPassword": { "message": "LastPass 主密碼" }, "lastPassAuthRequired": { - "message": "要求 LastPass 驗證" + "message": "需要 LastPass 驗證" }, "awaitingSSO": { "message": "等待 SSO 驗證" @@ -2988,7 +2988,7 @@ "message": "請使用您的公司憑證繼續登入。" }, "seeDetailedInstructions": { - "message": "請參閱我們的幫助網站上的詳細說明:", + "message": "請參閱我們說明網站上的詳細說明於", "description": "This is followed a by a hyperlink to the help website." }, "importDirectlyFromLastPass": { @@ -2998,13 +2998,13 @@ "message": "從 CSV 匯入" }, "lastPassTryAgainCheckEmail": { - "message": "Try again or look for an email from LastPass to verify it's you." + "message": "請再嘗試一次,或檢查電子郵件信箱中來自 LastPass 的驗證信。" }, "collection": { - "message": "集合" + "message": "分類" }, "lastPassYubikeyDesc": { - "message": "將與您的 LastPass 帳戶關聯的 YubiKey 插入電腦的 USB 連接埠,然後觸摸其按鈕。" + "message": "將與您的 LastPass 帳戶連結的 YubiKey 插入電腦的 USB 連接埠,然後按下按鈕。" }, "commonImportFormats": { "message": "常見格式", @@ -3023,10 +3023,10 @@ "message": "啟用硬體加速並重新啟動" }, "removePasskey": { - "message": "移除金鑰" + "message": "移除密碼金鑰" }, "passkeyRemoved": { - "message": "金鑰已移除" + "message": "密碼金鑰已移除" }, "errorAssigningTargetCollection": { "message": "Error assigning target collection." From 17c9b26336c5fe03d9c248851d281817e72b19b6 Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Mon, 23 Sep 2024 08:55:23 -0500 Subject: [PATCH 083/104] [PM-12252] Autofill name of new ciphers (#11127) * autofill name for new ciphers * only include name and uri when the extension is not popped out * only populate name and uri for login ciphers * source the URL directly from the new item dropdown component * fix new item dropdown tests --- .../new-item-dropdown-v2.component.spec.ts | 56 +++++++++++++++---- .../new-item-dropdown-v2.component.ts | 24 ++++++-- .../components/vault/vault-v2.component.ts | 2 - 3 files changed, 64 insertions(+), 18 deletions(-) diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts index 868cb242aa2..6842f35ea6f 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.spec.ts @@ -7,6 +7,8 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { CipherType } from "@bitwarden/common/vault/enums"; import { ButtonModule, DialogService, MenuModule } from "@bitwarden/components"; +import { BrowserApi } from "../../../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; import { AddEditQueryParams } from "../add-edit/add-edit-v2.component"; import { AddEditFolderDialogComponent } from "../add-edit-folder-dialog/add-edit-folder-dialog.component"; @@ -18,6 +20,10 @@ describe("NewItemDropdownV2Component", () => { const open = jest.fn(); const navigate = jest.fn(); + jest + .spyOn(BrowserApi, "getTabFromCurrentWindow") + .mockResolvedValue({ url: "https://example.com" } as chrome.tabs.Tab); + beforeEach(async () => { open.mockClear(); navigate.mockClear(); @@ -54,46 +60,74 @@ describe("NewItemDropdownV2Component", () => { jest.spyOn(component, "newItemNavigate"); }); - it("navigates to new login", () => { - component.newItemNavigate(CipherType.Login); + it("navigates to new login", async () => { + await component.newItemNavigate(CipherType.Login); expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { - queryParams: { type: CipherType.Login.toString(), ...emptyParams }, + queryParams: { + type: CipherType.Login.toString(), + name: "example.com", + uri: "https://example.com", + ...emptyParams, + }, }); }); - it("navigates to new card", () => { - component.newItemNavigate(CipherType.Card); + it("navigates to new card", async () => { + await component.newItemNavigate(CipherType.Card); expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { queryParams: { type: CipherType.Card.toString(), ...emptyParams }, }); }); - it("navigates to new identity", () => { - component.newItemNavigate(CipherType.Identity); + it("navigates to new identity", async () => { + await component.newItemNavigate(CipherType.Identity); expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { queryParams: { type: CipherType.Identity.toString(), ...emptyParams }, }); }); - it("navigates to new note", () => { - component.newItemNavigate(CipherType.SecureNote); + it("navigates to new note", async () => { + await component.newItemNavigate(CipherType.SecureNote); expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { queryParams: { type: CipherType.SecureNote.toString(), ...emptyParams }, }); }); - it("includes initial values", () => { + it("includes initial values", async () => { component.initialValues = { folderId: "222-333-444", organizationId: "444-555-666", collectionId: "777-888-999", } as NewItemInitialValues; - component.newItemNavigate(CipherType.Login); + await component.newItemNavigate(CipherType.Login); + + expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { + queryParams: { + type: CipherType.Login.toString(), + folderId: "222-333-444", + organizationId: "444-555-666", + collectionId: "777-888-999", + uri: "https://example.com", + name: "example.com", + }, + }); + }); + + it("does not include name or uri when the extension is popped out", async () => { + jest.spyOn(BrowserPopupUtils, "inPopout").mockReturnValue(true); + + component.initialValues = { + folderId: "222-333-444", + organizationId: "444-555-666", + collectionId: "777-888-999", + } as NewItemInitialValues; + + await component.newItemNavigate(CipherType.Login); expect(navigate).toHaveBeenCalledWith(["/add-cipher"], { queryParams: { diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts index daa0f3d795c..a1d5cbd332d 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts @@ -3,10 +3,13 @@ import { Component, Input } from "@angular/core"; import { Router, RouterLink } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums"; import { ButtonModule, DialogService, MenuModule, NoItemsModule } from "@bitwarden/components"; +import { BrowserApi } from "../../../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; import { AddEditQueryParams } from "../add-edit/add-edit-v2.component"; import { AddEditFolderDialogComponent } from "../add-edit-folder-dialog/add-edit-folder-dialog.component"; @@ -14,7 +17,6 @@ export interface NewItemInitialValues { folderId?: string; organizationId?: OrganizationId; collectionId?: CollectionId; - uri?: string; } @Component({ @@ -37,18 +39,30 @@ export class NewItemDropdownV2Component { private dialogService: DialogService, ) {} - private buildQueryParams(type: CipherType): AddEditQueryParams { + private async buildQueryParams(type: CipherType): Promise { + const tab = await BrowserApi.getTabFromCurrentWindow(); + const poppedOut = BrowserPopupUtils.inPopout(window); + + const loginDetails: { uri?: string; name?: string } = {}; + + // When a Login Cipher is created and the extension is not popped out, + // pass along the uri and name + if (!poppedOut && type === CipherType.Login && tab) { + loginDetails.uri = tab.url; + loginDetails.name = Utils.getHostname(tab.url); + } + return { type: type.toString(), collectionId: this.initialValues?.collectionId, organizationId: this.initialValues?.organizationId, folderId: this.initialValues?.folderId, - uri: this.initialValues?.uri, + ...loginDetails, }; } - newItemNavigate(type: CipherType) { - void this.router.navigate(["/add-cipher"], { queryParams: this.buildQueryParams(type) }); + async newItemNavigate(type: CipherType) { + await this.router.navigate(["/add-cipher"], { queryParams: await this.buildQueryParams(type) }); } openFolderDialog() { diff --git a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts index c0886264875..21c71332997 100644 --- a/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault/vault-v2.component.ts @@ -12,7 +12,6 @@ import { ButtonModule, Icons, NoItemsModule } from "@bitwarden/components"; import { VaultIcons } from "@bitwarden/vault"; import { CurrentAccountComponent } from "../../../../auth/popup/account-switching/current-account.component"; -import { BrowserApi } from "../../../../platform/browser/browser-api"; import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; @@ -72,7 +71,6 @@ export class VaultV2Component implements OnInit, OnDestroy { filter.collection?.organizationId) as OrganizationId, collectionId: filter.collection?.id as CollectionId, folderId: filter.folder?.id, - uri: (await BrowserApi.getTabFromCurrentWindow())?.url, }) as NewItemInitialValues, ), shareReplay({ refCount: true, bufferSize: 1 }), From c484f8306c4deaa5d608bba18f57857aeec701d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 14:13:04 +0000 Subject: [PATCH 084/104] Autosync the updated translations (#11167) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 150 +++++++++- apps/browser/src/_locales/az/messages.json | 158 +++++++++- apps/browser/src/_locales/be/messages.json | 150 +++++++++- apps/browser/src/_locales/bg/messages.json | 150 +++++++++- apps/browser/src/_locales/bn/messages.json | 150 +++++++++- apps/browser/src/_locales/bs/messages.json | 150 +++++++++- apps/browser/src/_locales/ca/messages.json | 150 +++++++++- apps/browser/src/_locales/cs/messages.json | 148 +++++++++- apps/browser/src/_locales/cy/messages.json | 150 +++++++++- apps/browser/src/_locales/da/messages.json | 206 ++++++++++--- apps/browser/src/_locales/de/messages.json | 156 +++++++++- apps/browser/src/_locales/el/messages.json | 156 +++++++++- apps/browser/src/_locales/en_GB/messages.json | 148 +++++++++- apps/browser/src/_locales/en_IN/messages.json | 148 +++++++++- apps/browser/src/_locales/es/messages.json | 150 +++++++++- apps/browser/src/_locales/et/messages.json | 150 +++++++++- apps/browser/src/_locales/eu/messages.json | 150 +++++++++- apps/browser/src/_locales/fa/messages.json | 150 +++++++++- apps/browser/src/_locales/fi/messages.json | 214 +++++++++++--- apps/browser/src/_locales/fil/messages.json | 150 +++++++++- apps/browser/src/_locales/fr/messages.json | 148 +++++++++- apps/browser/src/_locales/gl/messages.json | 150 +++++++++- apps/browser/src/_locales/he/messages.json | 150 +++++++++- apps/browser/src/_locales/hi/messages.json | 150 +++++++++- apps/browser/src/_locales/hr/messages.json | 160 ++++++++++- apps/browser/src/_locales/hu/messages.json | 150 +++++++++- apps/browser/src/_locales/id/messages.json | 150 +++++++++- apps/browser/src/_locales/it/messages.json | 154 +++++++++- apps/browser/src/_locales/ja/messages.json | 148 +++++++++- apps/browser/src/_locales/ka/messages.json | 150 +++++++++- apps/browser/src/_locales/km/messages.json | 150 +++++++++- apps/browser/src/_locales/kn/messages.json | 150 +++++++++- apps/browser/src/_locales/ko/messages.json | 158 +++++++++- apps/browser/src/_locales/lt/messages.json | 150 +++++++++- apps/browser/src/_locales/lv/messages.json | 172 +++++++++-- apps/browser/src/_locales/ml/messages.json | 150 +++++++++- apps/browser/src/_locales/mr/messages.json | 150 +++++++++- apps/browser/src/_locales/my/messages.json | 150 +++++++++- apps/browser/src/_locales/nb/messages.json | 150 +++++++++- apps/browser/src/_locales/ne/messages.json | 150 +++++++++- apps/browser/src/_locales/nl/messages.json | 150 +++++++++- apps/browser/src/_locales/nn/messages.json | 150 +++++++++- apps/browser/src/_locales/or/messages.json | 150 +++++++++- apps/browser/src/_locales/pl/messages.json | 150 +++++++++- apps/browser/src/_locales/pt_BR/messages.json | 148 +++++++++- apps/browser/src/_locales/pt_PT/messages.json | 148 +++++++++- apps/browser/src/_locales/ro/messages.json | 150 +++++++++- apps/browser/src/_locales/ru/messages.json | 148 +++++++++- apps/browser/src/_locales/si/messages.json | 150 +++++++++- apps/browser/src/_locales/sk/messages.json | 168 ++++++++++- apps/browser/src/_locales/sl/messages.json | 150 +++++++++- apps/browser/src/_locales/sr/messages.json | 158 +++++++++- apps/browser/src/_locales/sv/messages.json | 174 +++++++++-- apps/browser/src/_locales/te/messages.json | 150 +++++++++- apps/browser/src/_locales/th/messages.json | 150 +++++++++- apps/browser/src/_locales/tr/messages.json | 176 ++++++++++-- apps/browser/src/_locales/uk/messages.json | 150 +++++++++- apps/browser/src/_locales/vi/messages.json | 148 +++++++++- apps/browser/src/_locales/zh_CN/messages.json | 158 +++++++++- apps/browser/src/_locales/zh_TW/messages.json | 272 +++++++++++++----- 60 files changed, 8886 insertions(+), 486 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index e1fcf72c811..1b59a7805e7 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "التعبئة التلقائية" }, @@ -179,6 +194,18 @@ "addItem": { "message": "إضافة عنصر" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "تلميح كلمة المرور" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "البحث في الخزنة" }, @@ -504,6 +535,9 @@ "notes": { "message": "الملاحظات" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "الملاحظة" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "نفذ وقت الخزنة" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "إقفل الآن" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "تسجيل الدخول بخطوتين يجعل حسابك أكثر أمنا من خلال مطالبتك بالتحقق من تسجيل الدخول باستخدام جهاز آخر مثل مفتاح الأمان، تطبيق المصادقة، الرسائل القصيرة، المكالمة الهاتفية، أو البريد الإلكتروني. يمكن تمكين تسجيل الدخول بخطوتين على خزنة الويب bitwarden.com. هل تريد زيارة الموقع الآن؟" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "حُفظ المجلد" }, @@ -892,7 +938,7 @@ "message": "قائمة عناصر البطاقة في صفحة التبويب لسهولة التعبئة التلقائية." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "إظهار الهويات على صفحة التبويب" @@ -1097,6 +1143,9 @@ "file": { "message": "الملف" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "حدد ملفًا" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "فتح باستخدام رمز PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "تعيين رمز PIN الخاص بك لإلغاء قفل Bitwarden. سيتم إعادة تعيين إعدادات PIN الخاصة بك إذا قمت بتسجيل الخروج بالكامل من التطبيق." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "رمز PIN مطلوب." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "قفل مع كلمة المرور الرئيسية عند إعادة تشغيل المتصفح" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "يجب عليك تحديد مجموعة واحدة على الأقل." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "إجراء مهلة المخزن" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "قفل", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "سلة المهملات", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "عدم تطابق الحساب" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "لم يتم إعداد القياسات الحيوية" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "إرسال", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "نص" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ملف" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "تاريخ انتهاء الصلاحية" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "دقائق" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "سياسات مؤسستك تؤثر على مهلة الخزنة الخاص بك. الحد الأقصى المسموح به لمهلة الخزنة هو $HOURS$ ساعة/ساعات و $MINUTES$ دقيقة/دقائق", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index a6b2a35e133..795cd371232 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Lisenziya nömrəsini kopyala" }, + "copyCustomField": { + "message": "$FIELD$ - kopyala", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Veb saytı kopyala" + }, + "copyNotes": { + "message": "Notları kopyala" + }, "autoFill": { "message": "Avto-doldurma" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Element əlavə et" }, + "accountEmail": { + "message": "Hesab e-poçtu" + }, + "requestHint": { + "message": "İpucu tələb et" + }, + "requestPasswordHint": { + "message": "Parol ipucusu tələb et" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Hesabınızın e-poçt ünvanını daxil edin və parolunuz üçün ipucu sizə göndəriləcək" + }, "passwordHint": { "message": "Parol ipucu" }, @@ -308,7 +335,7 @@ "message": "Qovluq adı" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Ana qovluğun adından sonra \"/\" əlavə edərək qovluğu ardıcıl yerləşdirin. Nümunə: Social/Forums" }, "noFoldersAdded": { "message": "Heç bir qovluq əlavə edilmədi" @@ -462,6 +489,10 @@ "message": "Anlaşılmaz xarakterlərdən çəkin", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Anbarda axtar" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notlar" }, + "privateNote": { + "message": "Şəxsi not" + }, "note": { "message": "Not" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Seans vaxt bitməsi" }, + "vaultTimeoutHeader": { + "message": "Anbar vaxtının bitməsi" + }, "otherOptions": { "message": "Digər seçimlər" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Anbara müraciət bitəcək" }, + "vaultTimeout1": { + "message": "Vaxt bitmə" + }, "lockNow": { "message": "İndi kilidlə" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "İki addımlı giriş, güvənlik açarı, kimlik doğrulayıcı tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi doğrulamanızı tələb edərək hesabınızı daha da güvənli edir. İki addımlı giriş, bitwarden.com veb anbarında qurula bilər. Veb saytı indi ziyarət etmək istəyirsiniz?" }, + "twoStepLoginConfirmationContent": { + "message": "Bitwarden veb tətbiqində iki addımlı girişi quraraq hesabınızı daha güvənli edin." + }, + "twoStepLoginConfirmationTitle": { + "message": "Veb tətbiqlə davam edilsin?" + }, "editedFolder": { "message": "Qovluğ saxlanıldı" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Fayl" }, + "fileToShare": { + "message": "Paylaşılacaq fayl" + }, "selectFile": { "message": "Bir fayl seçin" }, @@ -1797,13 +1846,13 @@ "message": "Sadalanacaq heç bir parol yoxdur." }, "clearHistory": { - "message": "Clear history" + "message": "Tarixçəni təmizlə" }, "noPasswordsToShow": { - "message": "No passwords to show" + "message": "Göstəriləcək parol yoxdur." }, "noRecentlyGeneratedPassword": { - "message": "You haven't generated a password recently" + "message": "Təzəlikcə parol yaratmamısınız." }, "remove": { "message": "Çıxart" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "PIN ilə kilidi açın" }, + "setYourPinTitle": { + "message": "PIN təyin et" + }, + "setYourPinButton": { + "message": "PIN təyin et" + }, "setYourPinCode": { "message": "Bitwarden-in kilidini açmaq üçün PIN kodunuzu ayarlayın. Tətbiqdən tam çıxış etdikdə PIN ayarlarınız sıfırlanacaq." }, + "setYourPinCode1": { + "message": "Bitwarden kilidini açmaq üçün ana parolunuzun əvəzinə PIN-iniz istifadə ediləcək. Bitwarden-dən tamamilə çıxış etdikdə PIN-iniz sıfırlanacaq." + }, "pinRequired": { "message": "PIN kod lazımdır." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Brauzer yenidən başladılanda ana parolla kilidlə" }, + "lockWithMasterPassOnRestart1": { + "message": "Brauzer yenidən başladılanda ana parolu tələb et" + }, "selectOneCollection": { "message": "Ən azı bir kolleksiya seçməlisiniz." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Anbar vaxtının bitmə əməliyyatı" }, + "vaultTimeoutAction1": { + "message": "Vaxt bitmə əməliyyatı" + }, "lock": { "message": "Kilidlə", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Tullantı qutusu", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Hesablar uyuşmur" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrik kilidini açma uğursuz oldu. Biometrik sirr açarı anbarın kilidini aça bilmədi. Lütfən biometriki yenidən qurmağa çalışın." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometrik açarı uyuşmazlığı" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrik kilidini açma uğursuz oldu. Biometrik sirr açarı anbarın kilidini aça bilmədi. Lütfən biometriki yenidən qurmağa çalışın." + }, "biometricsNotEnabledTitle": { "message": "Biometriklər qurulmayıb" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "İstisna domen dəyişikliyi saxlanıldı" }, + "limitSendViews": { + "message": "Baxışları limitlə" + }, + "limitSendViewsHint": { + "message": "Limitə çatdıqdan sonra bu Send-ə heç kim baxa bilməz.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ baxış qaldı", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send detalları", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "\"Send\"ləri axtar", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Mətn" }, + "sendTypeTextToShare": { + "message": "Paylaşılacaq mətn" + }, "sendTypeFile": { "message": "Fayl" }, @@ -2232,6 +2320,9 @@ "message": "Bütün \"Send\"lər", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Mətni ilkin olaraq gizlət" + }, "maxAccessCountReached": { "message": "Maksimal müraciət sayına çatıldı", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "\"Send\" göstərilən tarix və saatda birdəfəlik silinəcək.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send, bu tarixdə həmişəlik silinəcək.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Bitmə tarixi" }, @@ -2338,6 +2433,10 @@ "message": "İstəyinizə görə istifadəçilərdən bu \"Send\"ə müraciət edərkən parol tələb edə bilərsiniz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Send-ə baxmaq üçün bu parol tələb edilsin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Bu \"Send\" ilə bağlı gizli notlar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "E-poçt ünvanımı alıcılardan gizlət." }, + "hideYourEmail": { + "message": "E-poçt ünvanınız baxanlardan gizlədilsin." + }, "sendOptionsPolicyInEffect": { "message": "Bir və ya daha çox təşkilat siyasətləri \"Send\" seçimlərinizə təsir edir." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Dəqiqə" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Müəssisə siyasət tələbləri, vaxt bitmə seçimlərinizə tətbiq edildi" + }, "vaultTimeoutPolicyInEffect": { "message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maksimum $HOURS$ saat və $MINUTES$ dəqiqə.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Vaxt bitməsinə təyin olunan vaxt, təşkilatınız tərəfindən ayarlanan məhdudiyyəti aşır: Maksimum $HOURS$ saat və $MINUTES$ dəqiqə", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir. Anbar vaxt bitişi əməliyyatı $ACTION$ olaraq ayarlandı.", "placeholders": { @@ -4309,8 +4440,17 @@ "enterprisePolicyRequirementsApplied": { "message": "Müəssisə siyasət tələbləri bu ayara tətbiq edildi" }, + "retry": { + "message": "Yenidən sına" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum özəl bitmə vaxtı 1 dəqiqədir." + }, + "additionalContentAvailable": { + "message": "Əlavə məzmun əlçatandır" + }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Fayl cihazda saxlanıldı. Endirilənləri cihazınızdan idarə edin." }, "showCharacterCount": { "message": "Xarakter sayını göstər" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index cf14c8e32a0..384036840d3 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Аўтазапаўненне" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Дадаць элемент" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Падказка да пароля" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Пошук у сховішчы" }, @@ -504,6 +535,9 @@ "notes": { "message": "Нататкі" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Нататка" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Час чакання сховішча" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Заблакіраваць зараз" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Двухэтапны ўваход робіць ваш уліковы запіс больш бяспечным, патрабуючы пацвярджэнне ўваходу на іншай прыладзе з выкарыстаннем ключа бяспекі, праграмы аўтэнтыфікацыі, SMS, тэлефоннага званка або электроннай пошты. Двухэтапны ўваход уключаецца на bitwarden.com. Перайсці на вэб-сайт, каб зрабіць гэта?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Папка адрэдагавана" }, @@ -892,7 +938,7 @@ "message": "Спіс элементаў картак на старонцы з укладкамі для лёгкага аўтазапаўнення." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Паказваць пасведчанні на старонцы з укладкамі" @@ -1097,6 +1143,9 @@ "file": { "message": "Файл" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Выберыце файл." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Разблакіраваць PIN-кодам" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Прызначце PIN-код для разблакіроўкі Bitwarden. Налады PIN-кода будуць скінуты, калі вы калі-небудзь цалкам выйдзеце з праграмы." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Патрабуецца PIN-код." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Заблакіраваць асноўным паролем пры перазапуску браўзера" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Вы павінны выбраць прынамсі адну калекцыю." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Дзеянне пасля заканчэння часу чакання сховішча" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Заблакіраваць", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Сметніца", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Неадпаведнасць уліковых запісаў" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Біяметрыя не ўключана" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Пошук у Send'ах", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Тэкст" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Файл" }, @@ -2232,6 +2320,9 @@ "message": "Усе Send’ы", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Дасягнута максімальная колькасць доступаў", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send будзе незваротна выдалены ў азначаныя дату і час.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Дата завяршэння" }, @@ -2338,6 +2433,10 @@ "message": "Па магчымасці запытваць у карыстальнікаў пароль для доступу да гэтага Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Прыватныя нататкі пра гэты Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Схаваць мой адрас электроннай пошты ад атрымальнікаў." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Адна або больш палітык арганізацыі ўплываюць на параметры Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Хвіліны" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае $HOURS$ гадз. і $MINUTES$ хв.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае гадзін: $HOURS$; хвілін: $MINUTES$. Для часу чакання вашага сховішча прызначана дзеянне $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 9d90293b0ca..df91be9ff49 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Копиране на номера на свидетелството" }, + "copyCustomField": { + "message": "Копиране на $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Копиране на уеб сайта" + }, + "copyNotes": { + "message": "Копиране на бележките" + }, "autoFill": { "message": "Автоматично дописване" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Добавяне на елемент" }, + "accountEmail": { + "message": "Е-поща на регистрацията" + }, + "requestHint": { + "message": "Заявка за подсказка" + }, + "requestPasswordHint": { + "message": "Заявка за подсказка за паролата" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Въведете е-пощата на регистрацията си и подсказката за паролата ще Ви бъде изпратена" + }, "passwordHint": { "message": "Подсказка за паролата" }, @@ -462,6 +489,10 @@ "message": "Без нееднозначни знаци", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Търсене в трезора" }, @@ -504,6 +535,9 @@ "notes": { "message": "Бележки" }, + "privateNote": { + "message": "Лична бележка" + }, "note": { "message": "Бележка" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Изтичане на времето за сесията" }, + "vaultTimeoutHeader": { + "message": "Време за достъп до трезора" + }, "otherOptions": { "message": "Други настройки" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Време за достъп" }, + "vaultTimeout1": { + "message": "Време за достъп" + }, "lockNow": { "message": "Заключване сега" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Двустепенното вписване защитава регистрацията ви, като ви кара да потвърдите влизането си чрез устройство-ключ, приложение за удостоверение, мобилно съобщение, телефонно обаждане или електронна поща. Двустепенното вписване може да се включи чрез сайта bitwarden.com. Искате ли да го посетите?" }, + "twoStepLoginConfirmationContent": { + "message": "Подобрете защитата на регистрацията си, като настроите двустепенното удостоверяване в уеб приложението на Битуорден." + }, + "twoStepLoginConfirmationTitle": { + "message": "Продължаване към уеб приложението?" + }, "editedFolder": { "message": "Редактирана папка" }, @@ -892,7 +938,7 @@ "message": "Показване на картите в страницата с разделите, за лесно автоматично попълване." }, "showIdentitiesInVaultView": { - "message": "Показване на самоличности като предложения за самопопълване в изгледа на трезора" + "message": "Показване на самоличности като предложения за автоматично попълване в изгледа на трезора" }, "showIdentitiesCurrentTab": { "message": "Показване на самоличности в страницата с разделите" @@ -1097,6 +1143,9 @@ "file": { "message": "Файл" }, + "fileToShare": { + "message": "Файл за споделяне" + }, "selectFile": { "message": "Изберете файл." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Отключване с ПИН" }, + "setYourPinTitle": { + "message": "Задаване на ПИН" + }, + "setYourPinButton": { + "message": "Задаване на ПИН" + }, "setYourPinCode": { "message": "Задайте ПИН за отключване на Bitwarden. Настройките за ПИН се изчистват при всяко пълно излизане от програмата." }, + "setYourPinCode1": { + "message": "Вашият ПИН ще бъде ползван за отключване на Битуорден, вместо главната парола. Той ще бъде нулиран, ако някога се отпишете напълно от Битуорден." + }, "pinRequired": { "message": "Необходим е ПИН." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Заключване с главната парола при повторно пускане на браузъра" }, + "lockWithMasterPassOnRestart1": { + "message": "Изискване на главната парола при повторно пускане на браузъра" + }, "selectOneCollection": { "message": "Изберете поне една колекция." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Действие при изтичане на времето" }, + "vaultTimeoutAction1": { + "message": "Действие при изтичането на времето за достъп" + }, "lock": { "message": "Заключване", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Кошче", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Регистрациите са различни" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Отключването чрез биометрични данни не беше успешно. Биометричният таен ключ не успя да отключи трезора. Опитайте да направите настройката на биометричните данни отново." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Несъответстващ биометричен ключ" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Отключването чрез биометрични данни не беше успешно. Биометричният таен ключ не успя да отключи трезора. Опитайте да направите настройката на биометричните данни отново." + }, "biometricsNotEnabledTitle": { "message": "Потвърждаването с биометрични данни не е включено" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Промените на изключените домейни са запазени" }, + "limitSendViews": { + "message": "Ограничаване на преглежданията" + }, + "limitSendViewsHint": { + "message": "Никой няма да може да преглежда това Изпращане след достигане на ограничението.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Остават $ACCESSCOUNT$ преглеждания", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Изпращане", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Подробности за Изпращането", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Търсене в изпратените", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Текст" }, + "sendTypeTextToShare": { + "message": "Текст за споделяне" + }, "sendTypeFile": { "message": "Файл" }, @@ -2232,6 +2320,9 @@ "message": "Всички изпращания", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Скриване на текста по подразбиране" + }, "maxAccessCountReached": { "message": "Достигнат е максималният брой достъпвания", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Изпращането ще бъде окончателно изтрито на зададената дата и време.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Изпращането ще бъде окончателно изтрито на тази дата.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Срок на валидност" }, @@ -2338,6 +2433,10 @@ "message": "Изискване на парола за достъп до това изпращане.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Изискване на тази парола за преглеждане на Изпращането.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Скрити бележки за това изпращане.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Скриване на е-пощата ми от получателите." }, + "hideYourEmail": { + "message": "Скриване на Вашата е-поща от получателите." + }, "sendOptionsPolicyInEffect": { "message": "Поне една политика на организация влияе на настройките за изпращане." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Минути" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Изискванията на политиката за големи компании бяха приложени към настройките на времето за достъп" + }, "vaultTimeoutPolicyInEffect": { "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минути", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Максимум $HOURS$ час(а) и $MINUTES$ минута/и.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Времето за достъп превишава ограничението, зададено от Вашата организация: максимум $HOURS$ час(а) и $MINUTES$ минута/и", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минута/и. Зададеното действие при изтичане на това време е $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Изискванията на политиката за големи компании бяха приложени към тази настройка" }, + "retry": { + "message": "Повторен опит" + }, + "vaultCustomTimeoutMinimum": { + "message": "Минималното персонализирано време за достъп е 1 минута." + }, + "additionalContentAvailable": { + "message": "Има налично допълнително съдържание" + }, "fileSavedToDevice": { "message": "Файлът е запазен на устройството. Можете да го намерите в мястото за сваляния на устройството." }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 53a3ceb1a65..5d8ea4ee404 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "স্বতঃপূরণ" }, @@ -179,6 +194,18 @@ "addItem": { "message": "বস্তু জুড়ুন" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "পাসওয়ার্ড ইঙ্গিত" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "ভল্ট খুঁজুন" }, @@ -504,6 +535,9 @@ "notes": { "message": "নোট" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "নোট" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "ভল্টের সময়সীমা" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "এখনই লক করুন" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "দ্বি-পদক্ষেপ লগইন অন্য ডিভাইসে আপনার লগইনটি যাচাই করার জন্য সিকিউরিটি কী, প্রমাণীকরণকারী অ্যাপ্লিকেশন, এসএমএস, ফোন কল বা ই-মেইল ব্যাবহারের মাধ্যমে আপনার অ্যাকাউন্টকে আরও সুরক্ষিত করে। bitwarden.com ওয়েব ভল্টে দ্বি-পদক্ষেপের লগইন সক্ষম করা যাবে। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "ফোল্ডার সম্পাদিত" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "ফাইল" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "একটি ফাইল নির্বাচন করুন।" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "পিন দিয়ে আনলক" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Bitwarden আনলক করার জন্য আপনার পিন কোডটি সেট করুন। আপনি যদি অ্যাপ্লিকেশনটি থেকে পুরোপুরি লগ আউট করেন তবে আপনার পিন সেটিংস রিসেট করা হবে।" }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "পিন কোড প্রয়োজন।" }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "ব্রাউজার পুনরারম্ভতে মূল পাসওয়ার্ড দিয়ে লক করুন" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "কমপক্ষে একটি সংগ্রহ নির্বাচন করুন।" }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "ভল্টের সময়সীমা কর্ম" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "লক", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "আবর্জনা", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "অ্যাকাউন্ট মেলেনি" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "বায়োমেট্রিকস সক্ষম নেই" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ফাইল" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 13cd7e7f54a..6f2a9be6185 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Nagovještaj lozinke" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Otključaj PIN-om" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Zaključaj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smeće", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fajl" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 160b625c4e3..7c1cc4b3367 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copia el número de llicència" }, + "copyCustomField": { + "message": "Copia $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copia lloc web" + }, + "copyNotes": { + "message": "Copia notes" + }, "autoFill": { "message": "Emplenament automàtic" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Afegeix element" }, + "accountEmail": { + "message": "Correu electrònic del compte" + }, + "requestHint": { + "message": "Sol·licita pista" + }, + "requestPasswordHint": { + "message": "Sol·licita pista de la contrasenya" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduïu l'adreça de correu electrònic del compte i se us enviarà la pista de contrasenya" + }, "passwordHint": { "message": "Pista de la contrasenya" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Cerca en la caixa forta" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Temps de sessió" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Altres opcions" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Temps d'espera de la caixa forta" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Bloqueja ara" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "L'inici de sessió en dues passes fa que el vostre compte siga més segur, ja que obliga a verificar el vostre inici de sessió amb un altre dispositiu, com ara una clau de seguretat, una aplicació autenticadora, un SMS, una trucada telefònica o un correu electrònic. Es pot habilitar l'inici de sessió en dues passes a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Carpeta guardada" }, @@ -892,7 +938,7 @@ "message": "Llista els elements de la targeta a la pàgina de pestanya per facilitar l'autoemplenat." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Mostra les identitats a la pàgina de pestanya" @@ -1097,6 +1143,9 @@ "file": { "message": "Fitxer" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Seleccioneu un fitxer" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Desbloqueja amb codi PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Configureu el vostre codi PIN per desbloquejar Bitwarden. La configuració del PIN es restablirà si tanqueu la sessió definitivament." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Es necessita el codi PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloqueja amb la contrasenya mestra en reiniciar el navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Heu d'escollir com a mínim una col·lecció." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Acció quan acabe el temps d'espera de la caixa forta" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Bloqueja", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Paperera", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "El compte no coincideix" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "La biomètrica no està habilitada" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Detalls de l'enviament", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Cerca Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text a compartir" + }, "sendTypeFile": { "message": "Fitxer" }, @@ -2232,6 +2320,9 @@ "message": "Tots els Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ocultar el text per defecte" + }, "maxAccessCountReached": { "message": "S'ha assolit el recompte màxim d'accesos", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "L'enviament se suprimirà permanentment a la data i hora especificades.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "L'enviament s'esborrarà permanentment en aquesta data.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data de caducitat" }, @@ -2338,6 +2433,10 @@ "message": "Opcionalment, necessiteu una contrasenya perquè els usuaris accedisquen a aquest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notes privades sobre aquest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Amagueu la meua adreça de correu electrònic als destinataris." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una o més polítiques d'organització afecten les vostres opcions del Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuts" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès d'aquesta és de $HOURS$ hores i $MINUTES$ minuts", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès de la caixa forta és de $HOURS$ hores i $MINUTES$ minuts. L'acció de temps d'espera de la caixa forta està definida en $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index bb3c81e0785..cee00a55ffe 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kopírovat číslo dokladu totožnosti" }, + "copyCustomField": { + "message": "Kopírovat $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopírovat webovou stránku" + }, + "copyNotes": { + "message": "Kopírovat poznámky" + }, "autoFill": { "message": "Automatické vyplňování" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Přidat položku" }, + "accountEmail": { + "message": "E-mail účtu" + }, + "requestHint": { + "message": "Vyžádat nápovědu" + }, + "requestPasswordHint": { + "message": "Vyžádat nápovědu k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadejte svou e-mailovou adresu, na kterou Vám zašleme nápovědu k heslu" + }, "passwordHint": { "message": "Nápověda pro heslo" }, @@ -462,6 +489,10 @@ "message": "Nepoužívat zaměnitelné znaky", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Vyhledat v trezoru" }, @@ -504,6 +535,9 @@ "notes": { "message": "Poznámky" }, + "privateNote": { + "message": "Soukromá poznámka" + }, "note": { "message": "Poznámka" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Časový limit relace" }, + "vaultTimeoutHeader": { + "message": "Časový limit trezoru" + }, "otherOptions": { "message": "Další volby" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Časový limit trezoru" }, + "vaultTimeout1": { + "message": "Časový limit" + }, "lockNow": { "message": "Zamknout nyní" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Dvoufázové přihlášení činí Váš účet mnohem bezpečnějším díky nutnosti po každém úspěšném přihlášení zadat ověřovací kód získaný z bezpečnostního klíče, aplikace, SMS, telefonního hovoru nebo e-mailu. Dvoufázové přihlášení lze aktivovat na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?" }, + "twoStepLoginConfirmationContent": { + "message": "Vytvořte svůj účet bezpečnějším nastavením dvoufázového přihlášení ve webové aplikaci Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Pokračovat do webové aplikace?" + }, "editedFolder": { "message": "Složka byla uložena" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Soubor" }, + "fileToShare": { + "message": "Soubor ke sdílení" + }, "selectFile": { "message": "Zvolte soubor" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Odemknout pomocí PIN" }, + "setYourPinTitle": { + "message": "Nastavit PIN" + }, + "setYourPinButton": { + "message": "Nastavit PIN" + }, "setYourPinCode": { "message": "Nastavte svůj PIN kód pro odemknutí trezoru. Pokud se zcela odhlásíte z aplikace bude Váš aktuální PIN resetován." }, + "setYourPinCode1": { + "message": "Váš PIN bude použit k odemknutí Bitwardenu namísto hlavního hesla. Pokud se někdy plně odhlásíte z Bitwarden, Váš PIN kód se obnoví." + }, "pinRequired": { "message": "Je vyžadován PIN kód." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Zamknout trezor při restartu prohlížeče pomocí hlavního hesla" }, + "lockWithMasterPassOnRestart1": { + "message": "Vyžadovat hlavní heslo při restartu prohlížeče" + }, "selectOneCollection": { "message": "Musíte vybrat alespoň jednu kolekci." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Akce při vypršení časového limitu" }, + "vaultTimeoutAction1": { + "message": "Akce vypršení časového limitu" + }, "lock": { "message": "Zamknout", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Koš", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Neshoda účtů" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrické odemknutí se nezdařilo. Zkuste znovu nastavit biometrické prvky." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Neshoda biometrického klíče" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrické odemknutí se nezdařilo. Zkuste znovu nastavit biometrické prvky." + }, "biometricsNotEnabledTitle": { "message": "Biometrie není nastavena" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Vyloučené změny domény byly uloženy" }, + "limitSendViews": { + "message": "Omezit zobrazení" + }, + "limitSendViewsHint": { + "message": "Po dosažení limitu nebude nikdo moci zobrazit tento Send.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Zbývá $ACCESSCOUNT$ zobrazení", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Podrobnosti Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Prohledat Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text ke sdílení" + }, "sendTypeFile": { "message": "Soubor" }, @@ -2232,6 +2320,9 @@ "message": "Všechny Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ve výchozím nastavení skrýt text" + }, "maxAccessCountReached": { "message": "Dosažen maximální počet přístupů", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "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." }, + "deletionDateDescV2": { + "message": "Tento Send bude trvale smazán v určené datum.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Datum vypršení platnosti" }, @@ -2338,6 +2433,10 @@ "message": "Volitelně vyžadovat heslo pro přístup k tomuto Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Pro zobrazení Send bude vyžadováno toto heslo.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Soukromé poznámky o tomto Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Skrýt mou e-mailovou adresu před příjemci." }, + "hideYourEmail": { + "message": "Skryje Vaši e-mailovou adresu před zobrazením." + }, "sendOptionsPolicyInEffect": { "message": "Jedna nebo více zásad organizace ovlivňuje nastavení Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "minut" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Na volby časového limitu byly uplatněny požadavky podnikových zásad" + }, "vaultTimeoutPolicyInEffect": { "message": "Pravidla Vaší organizace ovlivňují časový limit trezoru. Maximální povolený časový limit trezoru je $HOURS$ hodin a $MINUTES$ minut.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximálně $HOURS$ hodin a $MINUTES$ minut.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Časový limit překračuje omezení stanovené Vaší organizací: maximálně $HOURS$ hodin a $MINUTES$ minut", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Pravidla Vaší organizace mají vliv na časový limit trezoru. Maximální povolený časový limit trezoru je $HOURS$ hodin a $MINUTES$ minut. Akce po časovém limitu trezoru je nastavena na $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Na toto nastavení byly uplatněny požadavky podnikových zásad" }, + "retry": { + "message": "Opakovat" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimální vlastní časový limit je 1 minuta." + }, + "additionalContentAvailable": { + "message": "Je k dispozici další obsah" + }, "fileSavedToDevice": { "message": "Soubor byl uložen. Můžete jej nalézt ve stažené složce v zařízení." }, diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index e43e81e1e50..476319b3709 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Llenwi'n awtomatig" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Ychwanegu eitem" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Chwilio'r gell" }, @@ -504,6 +535,9 @@ "notes": { "message": "Nodiadau" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nodyn" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Dewisiadau eraill" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Cloi'r gell" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Cloi nawr" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Ffolder wedi'i chadw" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "Ffeil" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Dewis ffeil" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Datgloi â PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Mae angen cod PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Cloi", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Sbwriel", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Chwilio drwy Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Testun" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Ffeil" }, @@ -2232,6 +2320,9 @@ "message": "Pob Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Dyddiad dod i ben" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Cuddio fy nghyfeiriad ebost rhag derbynwyr." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 8771b323cb7..e5c2c38c078 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -128,8 +128,23 @@ "copyLicenseNumber": { "message": "Kopier licensnummer" }, + "copyCustomField": { + "message": "Kopiér $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiér websted" + }, + "copyNotes": { + "message": "Kopiér notater" + }, "autoFill": { - "message": "Auto-udfyld" + "message": "Autoudfyld" }, "autoFillLogin": { "message": "Autoudfyld login" @@ -171,7 +186,7 @@ "message": "Log ind på din boks" }, "autoFillInfo": { - "message": "Der findes ingen login til at auto-udfylde i den nuværende browserfane." + "message": "Der findes ingen logins at autoudfylde i den aktuelle webbrowserfane." }, "addLogin": { "message": "Tilføj et login" @@ -179,6 +194,18 @@ "addItem": { "message": "Tilføj element" }, + "accountEmail": { + "message": "Konto-e-mail" + }, + "requestHint": { + "message": "Anmod om tip" + }, + "requestPasswordHint": { + "message": "Anmod om adgangskodetip" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Angiv kontoens e-mailadresse og få et adgangskodetip fremsendt" + }, "passwordHint": { "message": "Adgangskodetip" }, @@ -462,6 +489,10 @@ "message": "Undgå tvetydige tegn", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Søg i boks" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notater" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notat" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Sessionstimeout" }, + "vaultTimeoutHeader": { + "message": "Boks-timeout" + }, "otherOptions": { "message": "Andre innstillinger" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Boks timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lås nu" }, @@ -718,7 +758,7 @@ } }, "autofillError": { - "message": "Ikke i stand til at auto-udfylde det valgte element på denne side. Kopiér og indsæt dataene i stedet for." + "message": "Ikke i stand til at autoudfylde det valgte emne på denne side. Kopiér og indsæt informationen i stedet." }, "totpCaptureError": { "message": "Kan ikke skanne QR-koden fra den aktuelle webside" @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "To-trins login gør din konto mere sikker ved at kræve, at du verificerer dit login med en anden enhed, såsom en sikkerhedsnøgle, autentificeringsapp, SMS, telefonopkald eller e-mail. To-trins login kan aktiveres i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" }, + "twoStepLoginConfirmationContent": { + "message": "Øg kontosikkerheden ved at oprette totrinsindlogning i Bitwarden web-appen." + }, + "twoStepLoginConfirmationTitle": { + "message": "Fortsæt til web-app?" + }, "editedFolder": { "message": "Mappe gemt" }, @@ -889,7 +935,7 @@ "message": "Vis kort på fanebladet" }, "showCardsCurrentTabDesc": { - "message": "Vis kortelementer på fanebladet for nem auto-udfyldning." + "message": "Vis kortemner på siden Fane for nem autoudfyldning." }, "showIdentitiesInVaultView": { "message": "Vis identiteter som Autoudfyldningsforslag ved Boks-visning" @@ -898,7 +944,7 @@ "message": "Vis identiteter på fanebladet" }, "showIdentitiesCurrentTabDesc": { - "message": "Vis identitetselementer på fanebladet for nem auto-udfyldning." + "message": "Vis identitetsemner på siden Fane for nem autoudfyldning." }, "clearClipboard": { "message": "Ryd udklipsholder", @@ -936,7 +982,7 @@ "message": "Opdatér" }, "notificationUnlockDesc": { - "message": "Oplås din Bitwarden boks for at færdiggøre autoudfyldanmodningen." + "message": "Oplås Bitwarden-boksen for at færdiggøre autoudfyldningsanmodningen." }, "notificationUnlock": { "message": "Oplås" @@ -958,7 +1004,7 @@ "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Vælg den standard måde, som URI matchmetode håndteres til logins, når du udfører handlinger som f.eks. Auto-udfyld." + "message": "Vælg standardmåden for håndtering af URI-matchdetektering til logins, når der udføres handlinger, såsom f.eks. Autoudfyld." }, "theme": { "message": "Tema" @@ -1097,6 +1143,9 @@ "file": { "message": "Fil" }, + "fileToShare": { + "message": "Fil, der skal deles" + }, "selectFile": { "message": "Vælg en fil" }, @@ -1191,7 +1240,7 @@ "message": "Kopiér TOTP automatisk" }, "disableAutoTotpCopyDesc": { - "message": "Hvis et login har en autentificeringsnøgle, så kopiér TOTP-bekræftelseskoden til din udklipsholder, når du auto-udfylder login." + "message": "Har et login har en autentificeringsnøgle, kopiér TOTP-bekræftelseskoden til udklipsholderen, når login autoudfyldes." }, "enableAutoBiometricsPrompt": { "message": "Bed om biometri ved start" @@ -1341,7 +1390,7 @@ "message": "Miljøets URLs er blevet gemt." }, "showAutoFillMenuOnFormFields": { - "message": "Vis autoudfyld-menu i formularfelter", + "message": "Vis autoudfyldningsmenu i formularfelter", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { @@ -1371,17 +1420,17 @@ "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "Når autoudfyld-ikon vælges", + "message": "Når autoudfyldikon vælges", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { "message": "Autoudfyld ved sideindlæsning" }, "enableAutoFillOnPageLoad": { - "message": "Auto-udfyld ved sideindlæsning" + "message": "Autoudfyld ved sideindlæsning" }, "enableAutoFillOnPageLoadDesc": { - "message": "Hvis der registreres en loginformular, så auto-udfyld, når websiden indlæses." + "message": "Registreres en loginformular, autoudfyld når websiden indlæses." }, "autofillOnPageLoadWarning": { "message": "$OPENTAG$Advarsel:$CLOSETAG$ Kompromitterede eller ikke-betroede websteder kan misbruge autofyld ved sideindlæsning.", @@ -1409,19 +1458,19 @@ "message": "Standardindstilling for autofyld for loginelementer" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Du kan deaktivere auto-udfyld ved sideindlæsning for individuelle login-elementer fra elementets redigeringsvisning." + "message": "Autoudfyldning ved sideindlæsning kan slås fra for individuelle loginemner fra emnets redigeringsvisning." }, "itemAutoFillOnPageLoad": { - "message": "Auto-udfyld ved sideindlæsning (hvis aktiveret i Indstillinger)" + "message": "Autoudfyld ved sideindlæsning (hvis opsat i Indstillinger)" }, "autoFillOnPageLoadUseDefault": { "message": "Anvend standardindstilling" }, "autoFillOnPageLoadYes": { - "message": "Auto-udfyld ved sideindlæsning" + "message": "Autoudfyld ved sideindlæsning" }, "autoFillOnPageLoadNo": { - "message": "Auto-udfyld ikke ved sideindlæsning" + "message": "Autoudfyld ikke ved sideindlæsning" }, "commandOpenPopup": { "message": "Åbn boks popup" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Lås op med pinkode" }, + "setYourPinTitle": { + "message": "Indstil PIN-kode" + }, + "setYourPinButton": { + "message": "Indstil PIN-kode" + }, "setYourPinCode": { "message": "Indstil din pinkode til at låse Bitwarden op. Dine pin-indstillinger nulstilles, hvis du nogensinde logger helt ud af programmet." }, + "setYourPinCode1": { + "message": "PIN-koden vil blive brugt til oplåsning af Bitwarden i stedet for hovedadgangskoden. PIN-koden nulstilles, hvis man logger helt ud af Bitwarden." + }, "pinRequired": { "message": "Pinkode er påkrævet." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lås med hovedadgangskode ved genstart af browseren" }, + "lockWithMasterPassOnRestart1": { + "message": "Kræver hovedadgangskode efter genstart af webbrowseren" + }, "selectOneCollection": { "message": "Du skal vælge minimum én samling." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Boks timeout-handling" }, + "vaultTimeoutAction1": { + "message": "Timeouthandling" + }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -1967,10 +2031,10 @@ "message": "Udfyld og gem" }, "autoFillSuccessAndSavedUri": { - "message": "Autoudfyldte element og URI gemt" + "message": "Emne autoudfyldt og URI gemt" }, "autoFillSuccess": { - "message": "Autoudfyldte element" + "message": "Emne autoudfyldt " }, "insecurePageWarning": { "message": "Advarsel: Dette er en ikke-sikret HTTP side, og alle indsendte oplysninger kan potentielt ses og ændres af andre. Dette login blev oprindeligt gemt på en sikker (HTTPS) side." @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konto mismatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrisk oplåsning mislykkedes. Den hemmelige biometriske nøgle kunne ikke oplåse boksen. Prøv at opsætte biometri igen." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometrisk nøgle matcher ikke" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrisk oplåsning mislykkedes. Den hemmelige biometriske nøgle kunne ikke oplåse boksen. Prøv at opsætte biometri igen." + }, "biometricsNotEnabledTitle": { "message": "Biometri ikke aktiveret" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Ekskluderet domæne-ændringer gemt" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send-detaljer", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Søg i Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Tekst, der skal deles" + }, "sendTypeFile": { "message": "Fil" }, @@ -2232,6 +2320,9 @@ "message": "Alle Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Skjul tekst som standard" + }, "maxAccessCountReached": { "message": "Maksimalt adgangsantal nået", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2246,7 +2337,7 @@ "message": "Kodeordsbeskyttet" }, "copyLink": { - "message": "Kopier link" + "message": "Kopiér link" }, "copySendLink": { "message": "Kopiér Send link", @@ -2305,6 +2396,10 @@ "message": "Send'en slettes permanent på den angivne dato og tid.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Denne Send slettes permanent på denne dato.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Udløbsdato" }, @@ -2338,6 +2433,10 @@ "message": "Valgfrit brugeradgangskodekrav for at tilgå denne Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notater om denne Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Skjul min e-mailadresse for modtagere." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Én eller flere organisationspolitikker påvirker dine Send-valgmuligheder." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutter" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Virksomhedspolitikkrav er anvendt på disse timeoutindstillinger" + }, "vaultTimeoutPolicyInEffect": { "message": "Organisationspolitikkerne har fastsat den maksimalt tilladte boks-timeout til $HOURS$ time(r) og $MINUTES$ minut(ter).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ time(r) og $MINUTES$ minut(ter) maks.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout overskrider den af organisationen angivne restriktion: $HOURS$ time(r) og $MINUTES$ minut(ter) maks.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Organisationspolitikkerne påvirker boks-timeout. Maks. tilladt boks-timeout er $HOURS$ time(r) og $MINUTES$ minut(ter). Boks-timeouthandlingen er sat til $ACTION$.", "placeholders": { @@ -2927,7 +3058,7 @@ "message": "Forstået" }, "autofillSettings": { - "message": "Autoudfyldelsesindstillinger" + "message": "Autoudfyldnigsindstillinger" }, "autofillKeyboardShortcutSectionTitle": { "message": "Autoudfyld-genvej" @@ -3688,7 +3819,7 @@ "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { - "message": "Ignoreres denne indstilling, kan det forårsage konflikter mellem Bitwardens autoudfyld-menu og webbrowsere.", + "message": "Ignoreres denne indstilling, kan det forårsage konflikter mellem Bitwardens og webbrowserens autoudfyldningsforslag.", "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { @@ -3994,10 +4125,10 @@ "message": "Godkendelsesnøgle" }, "autofillOptions": { - "message": "Autofill options" + "message": "Autoudfyldningsindstillinger" }, "websiteUri": { - "message": "Website (URI)" + "message": "Websted (URI)" }, "websiteUriCount": { "message": "Websted (URI) $COUNT$", @@ -4010,16 +4141,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Websted tilføjet" }, "addWebsite": { - "message": "Add website" + "message": "Tilføj websted" }, "deleteWebsite": { - "message": "Delete website" + "message": "Slet websted" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Standard ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -4029,7 +4160,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Vis matchdetektion $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4038,7 +4169,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Skjul matchdetektion $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Virksomhedspolitikkrav er anvendt på denne indstilling" }, + "retry": { + "message": "Forsøg igen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Tilpasset minimumstimeout udgør 1 minut." + }, + "additionalContentAvailable": { + "message": "Yderligere indhold er tilgængeligt" + }, "fileSavedToDevice": { "message": "Fil gemt på enheden. Håndtér fra enhedens downloads." }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 3af4de85e13..dc027fd44a5 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Lizenznummer kopieren" }, + "copyCustomField": { + "message": "$FIELD$ kopieren", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Website kopieren" + }, + "copyNotes": { + "message": "Notizen kopieren" + }, "autoFill": { "message": "Auto-Ausfüllen" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Eintrag hinzufügen" }, + "accountEmail": { + "message": "E-Mail-Adresse des Kontos" + }, + "requestHint": { + "message": "Hinweis anfragen" + }, + "requestPasswordHint": { + "message": "Passwort-Hinweis anfragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" + }, "passwordHint": { "message": "Passwort-Hinweis" }, @@ -462,6 +489,10 @@ "message": "Mehrdeutige Zeichen vermeiden", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Tresor durchsuchen" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notizen" }, + "privateNote": { + "message": "Private Notiz" + }, "note": { "message": "Notiz" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Sitzungs-Timeout" }, + "vaultTimeoutHeader": { + "message": "Tresor-Timeout" + }, "otherOptions": { "message": "Andere Optionen" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Tresor-Timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Jetzt sperren" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Mit der Zwei-Faktor-Authentifizierung wird dein Konto zusätzlich abgesichert, da jede Anmeldung mit einem anderen Gerät wie einem Sicherheitsschlüssel, einer Authentifizierungs-App, einer SMS, einem Anruf oder einer E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Website jetzt öffnen?" }, + "twoStepLoginConfirmationContent": { + "message": "Mache dein Konto sicherer, indem du eine Zwei-Faktor-Authentifizierung in der Bitwarden Web-App einrichtest." + }, + "twoStepLoginConfirmationTitle": { + "message": "Weiter zur Web-App?" + }, "editedFolder": { "message": "Ordner gespeichert" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Datei" }, + "fileToShare": { + "message": "Zu teilende Datei" + }, "selectFile": { "message": "Wähle eine Datei" }, @@ -1797,13 +1846,13 @@ "message": "Keine Einträge zum Anzeigen vorhanden." }, "clearHistory": { - "message": "Clear history" + "message": "Verlauf löschen" }, "noPasswordsToShow": { - "message": "No passwords to show" + "message": "Keine Passwörter zum Anzeigen" }, "noRecentlyGeneratedPassword": { - "message": "You haven't generated a password recently" + "message": "Du hast in letzter Zeit kein Passwort generiert" }, "remove": { "message": "Entfernen" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Mit PIN-Code entsperren" }, + "setYourPinTitle": { + "message": "PIN festlegen" + }, + "setYourPinButton": { + "message": "PIN festlegen" + }, "setYourPinCode": { "message": "Gebe deinen PIN-Code für das Entsperren von Bitwarden ein. Deine PIN-Einstellungen werden zurückgesetzt, wenn du dich vollständig von der Anwendung abmeldest." }, + "setYourPinCode1": { + "message": "Deine PIN wird verwendet, um Bitwarden anstatt deines Master-Passworts zu entsperren. Deine PIN wird zurückgesetzt, wenn du dich jemals vollständig von Bitwarden abgemeldet hast." + }, "pinRequired": { "message": "PIN-Code ist erforderlich." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Bei Neustart des Browsers mit Master-Passwort sperren" }, + "lockWithMasterPassOnRestart1": { + "message": "Master-Passwort beim Neustart des Browsers verlangen" + }, "selectOneCollection": { "message": "Sie müssen mindestens eine Sammlung auswählen." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Aktion bei Tresor-Timeout" }, + "vaultTimeoutAction1": { + "message": "Timeout-Aktion" + }, "lock": { "message": "Sperren", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papierkorb", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konten stimmen nicht überein" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrische Entsperrung fehlgeschlagen. Der biometrische Geheimschlüssel konnte den Tresor nicht entsperren. Bitte versuche Biometrie erneut einzurichten." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometrische Schlüssel stimmen nicht überein" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrische Entsperrung fehlgeschlagen. Der biometrische Geheimschlüssel konnte den Tresor nicht entsperren. Bitte versuche Biometrie erneut einzurichten." + }, "biometricsNotEnabledTitle": { "message": "Biometrie ist nicht eingerichtet" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Änderungen der ausgeschlossenen Domain gespeichert" }, + "limitSendViews": { + "message": "Ansichten begrenzen" + }, + "limitSendViewsHint": { + "message": "Nach Erreichen des Limits kann niemand mehr dieses Send sehen.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ Ansichten übrig", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send-Details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sends suchen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Zu teilender Text" + }, "sendTypeFile": { "message": "Datei" }, @@ -2232,6 +2320,9 @@ "message": "Alle Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Text standardmäßig ausblenden" + }, "maxAccessCountReached": { "message": "Maximale Zugriffsanzahl erreicht", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Das Send wird am angegebenen Datum zur angegebenen Uhrzeit dauerhaft gelöscht.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Das Send wird an diesem Datum dauerhaft gelöscht.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Ablaufdatum" }, @@ -2338,6 +2433,10 @@ "message": "Optional ein Passwort verlangen, damit Benutzer auf dieses Send zugreifen können.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Dieses Passwort zum Anzeigen des Sends verlangen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private Notizen zu diesem Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Meine E-Mail-Adresse vor den Empfängern ausblenden." }, + "hideYourEmail": { + "message": "Verberge deine E-Mail-Adresse vor Betrachtern." + }, "sendOptionsPolicyInEffect": { "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Send Einstellungen." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuten" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Die Unternehmens-Richtlinienanforderungen wurden auf deine Timeout-Optionen angewendet" + }, "vaultTimeoutPolicyInEffect": { "message": "Deine Unternehmensrichtlinien haben das maximal zulässige Tresor-Timeout auf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) festgelegt.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Das Timeout überschreitet die von deiner Organisation festgelegte Beschränkung: Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Deine Organisationsrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt $HOURS$ Stunde(n) und $MINUTES$ Minute(n). Deine Tresor-Timeout-Aktion ist auf $ACTION$ gesetzt.", "placeholders": { @@ -4309,8 +4440,17 @@ "enterprisePolicyRequirementsApplied": { "message": "Unternehmens-Richtlinienanforderungen wurden auf diese Einstellung angewandt" }, + "retry": { + "message": "Erneut versuchen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Das minimal benutzerdefinierte Timeout beträgt 1 Minute." + }, + "additionalContentAvailable": { + "message": "Zusätzlicher Inhalt ist verfügbar" + }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Datei auf Gerät gespeichert. Greife darauf über die Downloads deines Geräts zu." }, "showCharacterCount": { "message": "Zeichenanzahl anzeigen" diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index cc008a4949b..7d0054267b6 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Αντιγραφή αριθμού άδειας" }, + "copyCustomField": { + "message": "Αντιγραφή του «$FIELD$»", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Αντιγραφή ιστοτόπου" + }, + "copyNotes": { + "message": "Αντιγραφή σημειώσεων" + }, "autoFill": { "message": "Αυτόματη συμπλήρωση" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Προσθήκη αντικειμένου" }, + "accountEmail": { + "message": "Email λογαριασμού" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Υπόδειξη κωδικού πρόσβασης" }, @@ -462,6 +489,10 @@ "message": "Αποφυγή αμφιλεγόμενων χαρακτήρων", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Αναζήτηση στο vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Σημειώσεις" }, + "privateNote": { + "message": "Ιδιωτική σημείωση" + }, "note": { "message": "Σημείωση" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Χρονικό όριο λήξης συνεδρίας" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Άλλες επιλογές" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Χρόνος Λήξης Vault" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Κλείδωμα Τώρα" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Η σύνδεση δύο βημάτων καθιστά πιο ασφαλή τον λογαριασμό σας, απαιτώντας να επαληθεύσετε τη συνδεσή σας με μια άλλη συσκευή, όπως ένα κλειδί ασφαλείας, μία εφαρμογή επαλήθευσης, ένα μήνυμα SMS, μία τηλεφωνική κλήση ή ένα μήνυμα ηλ. ταχυδρομείου. Μπορείτε να ενεργοποιήσετε τη σύνδεση δύο βημάτων στο διαδικτυακό θυσαυ/κιο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Συνέχεια στη διαδικτυακή εφαρμογή;" + }, "editedFolder": { "message": "Ο φάκελος αποθηκεύτηκε" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Αρχείο" }, + "fileToShare": { + "message": "Αρχείο προς κοινοποίηση" + }, "selectFile": { "message": "Επιλέξτε αρχείο" }, @@ -1797,7 +1846,7 @@ "message": "Δεν υπάρχουν κωδικοί στη λίστα." }, "clearHistory": { - "message": "Clear history" + "message": "Διαγραφή ιστορικού" }, "noPasswordsToShow": { "message": "No passwords to show" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Ξεκλείδωμα με PIN" }, + "setYourPinTitle": { + "message": "Ορισμός PIN" + }, + "setYourPinButton": { + "message": "Ορισμός PIN" + }, "setYourPinCode": { "message": "Ορίστε τον κωδικό PIN για να ξεκλειδώσετε το Bitwarden. Οι ρυθμίσεις PIN θα επαναρυθμιστούν αν αποσυνδεθείτε πλήρως από την εφαρμογή." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Απαιτείται κωδικός PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Κλείδωμα με κύριο κωδικό πρόσβασης στην επανεκκίνηση του προγράμματος περιήγησης" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Πρέπει να επιλέξετε τουλάχιστον μία συλλογή." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Ενέργεια Χρόνου Λήξης Vault" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Κλείδωμα", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Κάδος Απορριμάτων", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Απόρριψη λογαριασμού" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Το βιομετρικό ξεκλείδωμα απέτυχε. Το βιομετρικό μυστικό κλειδί απέτυχε να ξεκλειδώσει το θησαυ/κιο. Προσπαθήστε να ρυθμίσετε ξανά τα βιομετρικά." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Αναντιστοιχία βιομετρικού κλειδιού" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Το βιομετρικό ξεκλείδωμα απέτυχε. Το βιομετρικό μυστικό κλειδί απέτυχε να ξεκλειδώσει το θησαυ/κιο. Προσπαθήστε να ρυθμίσετε ξανά τα βιομετρικά." + }, "biometricsNotEnabledTitle": { "message": "Δεν έχουν οριστεί βιομετρικά" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Οι αλλαγές αποκλεισμένων τομέων αποθηκεύτηκαν" }, + "limitSendViews": { + "message": "Περιορισμός προβολών" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Απομένουν $ACCESSCOUNT$ προβολές", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Αναζήτηση Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Κείμενο" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Αρχείο" }, @@ -2232,6 +2320,9 @@ "message": "Όλα τα Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Φτάσατε στον μέγιστο αριθμό πρόσβασης", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Το Send θα διαγραφεί οριστικά την καθορισμένη ημερομηνία και ώρα.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Ημερομηνία λήξης" }, @@ -2338,6 +2433,10 @@ "message": "Προαιρετικά απαιτείται κωδικός πρόσβασης για τους χρήστες για να έχουν πρόσβαση σε αυτό το Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Ιδιωτικές σημειώσεις σχετικά με αυτό το Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Απόκρυψη της διεύθυνσης email μου από τους παραλήπτες." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Μία ή περισσότερες οργανωτικές πολιτικές επηρεάζουν τις επιλογές send σας." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Λεπτά" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο vault σας. Το μέγιστο επιτρεπόμενο Χρονικό όριο Vault είναι $HOURS$ ώρα(ες) και $MINUTES$ λεπτό(ά)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο λήξης του vault σας. Το μέγιστο επιτρεπόμενο χρονικό όριο λήξης vault είναι $HOURS$ ώρα(ες) και $MINUTES$ λεπτό(ά). H ενέργεια χρονικού ορίου λήξης είναι ορισμένη ως $ACTION$.", "placeholders": { @@ -3487,7 +3618,7 @@ "message": "Απαιτείται επαλήθευση από τον ιστότοπο εκκίνησης. Αυτή η λειτουργία δεν έχει ακόμα υλοποιηθεί για λογαριασμούς χωρίς τον κύριο κωδικό πρόσβασης." }, "logInWithPasskeyQuestion": { - "message": "Log in with passkey?" + "message": "Σύνδεση με κλειδί πρόσβασης;" }, "passkeyAlreadyExists": { "message": "Υπάρχει ήδη ένα κλειδί πρόσβασης για αυτήν την εφαρμογή." @@ -4309,14 +4440,23 @@ "enterprisePolicyRequirementsApplied": { "message": "Οι απαιτήσεις της πολιτικής για επιχειρήσεις έχουν εφαρμοστεί σε αυτήν τη ρύθμιση" }, + "retry": { + "message": "Επανάληψη" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Διατίθεται πρόσθετο περιεχόμενο" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, "showCharacterCount": { - "message": "Show character count" + "message": "Εμφάνιση αριθμού χαρακτήρων" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Απόκρυψη αριθμού χαρακτήρων" }, "itemsInTrash": { "message": "Αντικείμενα στον κάδο" diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index a8efa278e58..e8fcd3de2c9 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-fill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account mismatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key mismatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organisation policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organisation policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organisation: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organisation 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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index c90115ee537..c4d7128eafa 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy licence number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-fill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Edited folder" }, @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Bin", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key mismatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not enabled" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration Date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organisation policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organisation: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organisation 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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 572372bafc2..800f7baab0d 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copiar número de licencia" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autorrellenar" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Añadir elemento" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista de contraseña" }, @@ -462,6 +489,10 @@ "message": "Evitar caracteres ambiguos", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Buscar en caja fuerte" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Tiempo de sesión agotado" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Otras opciones" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Tiempo de espera de la caja fuerte" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Bloquear" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "La autenticación en dos pasos hace que tu cuenta sea mucho más segura, requiriendo que introduzcas un código de seguridad de una aplicación de autenticación cada vez que accedes. La autenticación en dos pasos puede ser habilitada en la caja fuerte web de bitwarden.com. ¿Quieres visitar ahora el sitio web?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Carpeta editada" }, @@ -892,7 +938,7 @@ "message": "Listar los elementos de tarjetas en la página para facilitar el auto-rellenado." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Mostrar las identidades en la página" @@ -1097,6 +1143,9 @@ "file": { "message": "Archivo" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Selecciona un archivo." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Desbloquear con PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Establece tu código PIN para desbloquear Bitwarden. Tus ajustes de PIN se reiniciarán si alguna vez cierras tu sesión completamente de la aplicación." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Código PIN requerido." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloquear con contraseña maestra al reiniciar el navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Debes seleccionar al menos una colección." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Acción de tiempo de espera de la caja fuerte" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papelera", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Las cuentas son distintas" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometría deshabilitada" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Buscar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Archivo" }, @@ -2232,6 +2320,9 @@ "message": "Todos los Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Número máximo de accesos alcanzado", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "El Send se eliminará permanentemente en la fecha y hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Fecha de caducidad" }, @@ -2338,6 +2433,10 @@ "message": "Opcionalmente se requiere una contraseña para que los usuarios accedan a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notas privadas sobre este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ocultar mi dirección de correo electrónico a los destinatarios." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una o más políticas de organización están afectando sus opciones del Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Las políticas de tu organización están afectando al tiempo de espera de tu caja fuerte. El tiempo máximo de espera de la caja fuerte es de $HOURS$ hora(s) y $MINUTES$ minuto(s)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Las políticas de su organización están afectando al tiempo de espera de tu caja fuerte. El tiempo de espera de tu caja fuerte máximo permitido es de $HOURS$ hora(s) y $MINUTES$ minuto(s). La acción de tiempo de espera de tu caja fuerte está establecida en $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 947b9b0966c..d9f64ecc041 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kopeeri litsentsi number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Automaatne täitmine" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Lisa ese" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Parooli vihje" }, @@ -462,6 +489,10 @@ "message": "Väldi raskesti eristatavaid tähti ja sümboleid", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Otsi hoidlast" }, @@ -504,6 +535,9 @@ "notes": { "message": "Märkmed" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Märkus" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Sessiooni ajalõpp" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Muud valikud" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Hoidla ajalõpp" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lukusta paroolihoidla" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Kaheastmeline kinnitamine aitab konto turvalisust tõsta. Lisaks paroolile pead kontole ligipääsemiseks kinnitama sisselogimise päringu SMS-ga, telefonikõnega, autentimise rakendusega või e-postiga. Kaheastmelist kinnitust saab sisse lülitada bitwarden.com veebihoidlas. Soovid seda kohe avada?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Kaust on muudetud" }, @@ -892,7 +938,7 @@ "message": "Kuvab \"Kaart\" vaates kaardiandmeid, et neid saaks kiiresti sisestada" }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Kuva \"Kaart\" vaates identiteete" @@ -1097,6 +1143,9 @@ "file": { "message": "Fail" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Vali fail." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Ava PIN-iga" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Määra Bitwardeni lahtilukustamiseks PIN kood. Rakendusest täielikult välja logides nullitakse ka PIN koodi seaded." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Nõutakse PIN koodi." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Nõua ülemparooli, kui brauser taaskäivitatakse" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Pead valima vähemalt ühe kogumiku." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Hoidla ajalõpu tegevus" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lukusta", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prügikast", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontod ei ühti" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biomeetria ei ole sisse lülitatud" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Otsi Sende", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fail" }, @@ -2232,6 +2320,9 @@ "message": "Kõik Sendid", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Maksimaalne ligipääsude arv on saavutatud", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send kustutatakse määratud kuupäeval ja kellaajal jäädavalt.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Aegumiskuupäev" }, @@ -2338,6 +2433,10 @@ "message": "Soovi korral nõua parooli, millega Sendile ligi pääseb.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privaatne märkus selle Sendi kohta.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ära näita saajatele minu e-posti aadressi." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Organisatsiooni seaded mõjutavad sinu Sendi sätteid." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutit" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Organisatsiooni poliitikad mõjutavad sinu hoidla ajalõppu. Maksimaalne lubatud hoidla ajalõpp on $HOURS$ tund(i) ja $MINUTES$ minut(it)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Organisatsiooni poliitikad mõjutavad sinu hoidla ajalõppu. Maksimaalne lubatud hoidla ajalõpp on $HOURS$ tund(i) ja $MINUTES$ minut(it). Sinu hoidla ajalõpu tegevus on $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 1cbb17bcf61..88f2348d5ff 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-betetzea" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Gehitu elementua" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pasahitza gogoratzeko pista" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Bilatu kutxa gotorrean" }, @@ -504,6 +535,9 @@ "notes": { "message": "Oharrak" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Oharra" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Kutxa gotorraren itxaronaldia" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Blokeatu orain" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Bi urratseko saio hasiera dela eta, zure kontua seguruagoa da, beste aplikazio/gailu batekin saioa hastea eskatzen baitizu; adibidez, segurtasun-gako, autentifikazio-aplikazio, SMS, telefono dei edo email bidez. Bi urratseko saio hasiera bitwarden.com webgunean aktibatu daiteke. Orain joan nahi duzu webgunera?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Karpeta editatuta" }, @@ -892,7 +938,7 @@ "message": "Erakutsi elementuen txartelak fitxa orrian, erraz auto-betetzeko." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Erakutsi identitateak fitxa orrian" @@ -1097,6 +1143,9 @@ "file": { "message": "Fitxategia" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Hautatu fitxategia." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "PIN-arekin desblokeatu" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Ezarri zure PIN kodea Bitwarden desblokeatzeko. Zure PIN-aren konfigurazioa berrezarriko da, noizbait aplikaziotik erabat saioa ixten baduzu." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN-a beharrezkoa da." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Nabigatzailea berrabiaraztean pasahitz nagusiarekin blokeatu" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Gutxienez bilduma bat aukeratu behar duzu." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Kutxa gotorraren itxaronaldiaren ekintza" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Blokeatu", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Zakarrontzia", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontu ezberdinak dira" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometria desgaitua" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send-ak bilatu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Testua" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fitxategia" }, @@ -2232,6 +2320,9 @@ "message": "Send guztiak", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Sarbide kopuru maximoa gaindituta", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send-a betiko ezabatuko da zehaztutako datan eta orduan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Iraungitze data" }, @@ -2338,6 +2433,10 @@ "message": "Nahi izanez gero, pasahitza eskatu erabiltzaileak Send honetara sar daitezen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Send honi buruzko ohar pribatuak.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ezkutatu nire emaila hartzaileei." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Erakundeko politika batek edo gehiagok Send-eko aukerei eragiten diote." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutu" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Zure erakundearen politikek zure itxaronaldiari eragiten diote. Itxaronaldiak gehienez ere $HOURS$ ordu eta $MINUTES$ minutu izango ditu", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 224fa273005..a152c8edd53 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "پر کردن خودکار" }, @@ -179,6 +194,18 @@ "addItem": { "message": "افزودن مورد" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "یادآور کلمه عبور" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "جستجوی گاوصندوق" }, @@ -504,6 +535,9 @@ "notes": { "message": "یادداشت‌ها" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "یادداشت" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "سایر گزینه‌ها" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "متوقف شدن گاو‌صندوق" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "الان قفل شود" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "ورود دو مرحله ای باعث می‌شود که حساب کاربری شما با استفاده از یک دستگاه دیگر مانند کلید امنیتی، برنامه احراز هویت، پیامک، تماس تلفنی و یا ایمیل، اعتبار خود را با ایمنی بیشتر اثبات کند. ورود دو مرحله ای می تواند در bitwarden.com فعال شود. آیا می‌خواهید از سایت بازدید کنید؟" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "پوشه ذخیره شد" }, @@ -892,7 +938,7 @@ "message": "برای پر کردن خودکار آسان، موارد کارت را در صفحه برگه فهرست کن." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "نشان دادن هویت در صفحه برگه" @@ -1097,6 +1143,9 @@ "file": { "message": "پرونده" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ﺍﻧﺘﺨﺎﺏ یک ﭘﺮﻭﻧﺪﻩ" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "باز کردن با پین" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "کد پین خود را برای باز کردن Bitwarden تنظیم کنید. اگر به طور کامل از برنامه خارج شوید، تنظیمات پین شما از بین می‌رود." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "کد پین الزامیست." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "در زمان شروع مجدد، با کلمه عبور اصلی قفل کن" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "شما باید حداقل یک مجموعه را انتخاب کنید." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "عمل متوقف شدن گاو‌صندوق" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "قفل", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "زباله‌ها", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "عدم مطابقت حساب کاربری" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "بیومتریک برپا نشده" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "ارسال", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "جستجوی ارسال‌ها", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "متن" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "پرونده" }, @@ -2232,6 +2320,9 @@ "message": "همه ارسال ها", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "به حداکثر تعداد دسترسی رسیده است", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "ارسال در تاریخ و ساعت مشخص شده برای همیشه حذف خواهد شد.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "تاريخ انقضاء" }, @@ -2338,6 +2433,10 @@ "message": "به صورت اختیاری برای دسترسی کاربران به این ارسال به یک کلمه عبور نیاز دارید.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "یادداشت های خصوصی در مورد این ارسال.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "نشانی ایمیلم را از گیرندگان مخفی کن." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "یک یا چند سیاست سازمان بر گزینه های ارسال شما تأثیر می‌گذارد." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "دقیقه" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 927225fce52..9d152bc53a3 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kopioi ajokortin numero" }, + "copyCustomField": { + "message": "Kopioi $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopioi verkkosivusto" + }, + "copyNotes": { + "message": "Kopioi merkinnät" + }, "autoFill": { "message": "Automaattitäyttö" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Lisää kohde" }, + "accountEmail": { + "message": "Tilin sähköpostiosoite" + }, + "requestHint": { + "message": "Pyydä vihje" + }, + "requestPasswordHint": { + "message": "Pyydä pääsalasanan vihje" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" + }, "passwordHint": { "message": "Salasanavihje" }, @@ -462,6 +489,10 @@ "message": "Vältä epäselviä merkkejä", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Etsi holvista" }, @@ -504,6 +535,9 @@ "notes": { "message": "Merkinnät" }, + "privateNote": { + "message": "Yksityinen muistiinpano" + }, "note": { "message": "Merkintä" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Istunnon aikakatkaisu" }, + "vaultTimeoutHeader": { + "message": "Holvin aikakatkaisu" + }, "otherOptions": { "message": "Muut asetukset" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Holvin aikakatkaisu" }, + "vaultTimeout1": { + "message": "Aikakatkaisu" + }, "lockNow": { "message": "Lukitse nyt" }, @@ -647,7 +687,7 @@ "message": "Pääsalasana" }, "masterPassImportant": { - "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" }, "masterPassHintLabel": { "message": "Pääsalasanan vihje" @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi suojausavaimen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" }, + "twoStepLoginConfirmationContent": { + "message": "Paranna tilisi suojausta määrittämällä kaksivaiheinen kirjautuminen Bitwardenin verkkosovelluksessa." + }, + "twoStepLoginConfirmationTitle": { + "message": "Avataanko verkkosovellus?" + }, "editedFolder": { "message": "Kansio tallennettiin" }, @@ -889,16 +935,16 @@ "message": "Näytä kortit välilehtiosiossa" }, "showCardsCurrentTabDesc": { - "message": "Kortit näytetään laajennuksen välilehtisivulla niiden automaattisen täytön helpottamiseksi." + "message": "Näytä kortit Välilehti-sivulla automaattitäytön helpottamiseksi." }, "showIdentitiesInVaultView": { - "message": "Näytä henkilöllisyydet automaattitäytön ehdotuksina Holvi-näkymässä" + "message": "Näytä henkilöllisyydet automaattitäytön ehdotuksina Holvi-sivulla." }, "showIdentitiesCurrentTab": { "message": "Näytä henkilöllisyydet välilehtiosiossa" }, "showIdentitiesCurrentTabDesc": { - "message": "Henkilöllisyydet näytetään laajennuksen Välilehti-sivulla niiden automaattisen täytön helpottamiseksi." + "message": "Näytä henkilöllisyydet Välilehti-sivulla automaattitäytön helpottamiseksi." }, "clearClipboard": { "message": "Tyhjennä leikepöytä", @@ -936,7 +982,7 @@ "message": "Päivitä" }, "notificationUnlockDesc": { - "message": "Viimeistele automaattisen täytön pyyntö avaamalla Bitwarden-holvisi lukitus." + "message": "Viimeistele automaattitäyttö avaamalla Bitwarden-holvisi lukitus." }, "notificationUnlock": { "message": "Avaa" @@ -1097,6 +1143,9 @@ "file": { "message": "Tiedosto" }, + "fileToShare": { + "message": "Jaettava tiedosto" + }, "selectFile": { "message": "Valitse tiedosto." }, @@ -1164,7 +1213,7 @@ "message": "Kiitos kun tuet Bitwardenia." }, "premiumFeatures": { - "message": "Päivitä premium-tilaukseen ja saat:" + "message": "Päivitä Premiumiin niin saat:" }, "premiumPrice": { "message": "Kaikki tämä vain $PRICE$/vuosi!", @@ -1371,7 +1420,7 @@ "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "Kun automaattitäytön kuvaketta painetaan", + "message": "Kun automaattitäytön kuvake valitaan", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { @@ -1430,13 +1479,13 @@ "message": "Avaa holvi sivupalkissa" }, "commandAutofillLoginDesc": { - "message": "Automaattitäytä tällä sivustolla viimeksi käytetty kirjautumistieto." + "message": "Automaattitäytä edellinen tälle sivustolle täytetty kirjautumistieto" }, "commandAutofillCardDesc": { - "message": "Automaattitäytä tällä sivustolla viimeksi käytetty kortti." + "message": "Automaattitäytä edellinen tälle sivustolle täytetty kortti" }, "commandAutofillIdentityDesc": { - "message": "Automaattitäytä tällä sivustolla viimeksi käytetty henkilöllisyys." + "message": "Automaattitäytä edellinen tälle sivustolle täytetty henkilöllisyys" }, "commandGeneratePasswordDesc": { "message": "Luo uusi satunnainen salasana ja kopioi se leikepöydälle." @@ -1663,7 +1712,7 @@ } }, "editItemHeader": { - "message": "Muokkaa: $TYPE$", + "message": "Muokkaa tyyppiä $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1797,13 +1846,13 @@ "message": "Ei näytettäviä salasanoja." }, "clearHistory": { - "message": "Clear history" + "message": "Tyhjennä historia" }, "noPasswordsToShow": { - "message": "No passwords to show" + "message": "Näytettäviä salasanoja ei ole" }, "noRecentlyGeneratedPassword": { - "message": "You haven't generated a password recently" + "message": "Et ole luonut salasanoja hiljattain" }, "remove": { "message": "Poista" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Avaa PIN-koodilla" }, + "setYourPinTitle": { + "message": "Aseta PIN-koodi" + }, + "setYourPinButton": { + "message": "Aseta PIN" + }, "setYourPinCode": { "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut laajennuksesta kokonaan ulos." }, + "setYourPinCode1": { + "message": "PIN-koodia käytetään pääsalasanasi sijasta Bitwarenin avaukseen. Määritetty PIN-koodi tyhjennetään, jos kirjaudut kokonaan ulos Bitwardenista." + }, "pinRequired": { "message": "PIN-koodi vaaditaan." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lukitse pääsalasanalla kun selain käynnistetään uudelleen" }, + "lockWithMasterPassOnRestart1": { + "message": "Vaadi pääsalasana selaimen uudelleenkäynnistyksen yhteydessä" + }, "selectOneCollection": { "message": "Valitse ainakin yksi kokoelma." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Holvin aikakatkaisutoiminto" }, + "vaultTimeoutAction1": { + "message": "Aikakatkaisutoiminto" + }, "lock": { "message": "Lukitse", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Roskakori", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Tili ei täsmää" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrinen avaus epäonnistui. Biometrinen salainen avain ei voinut avata holvia. Yritä määrittää biometria uudelleen." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometrinen avain ei täsmää" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrinen avaus epäonnistui. Biometrinen salainen avain ei voinut avata holvia. Yritä määrittää biometria uudelleen." + }, "biometricsNotEnabledTitle": { "message": "Biometriaa ei ole määritetty" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Rajoitettujen verkkotunnusten muutokset tallennettiin" }, + "limitSendViews": { + "message": "Rajoita avauksia" + }, + "limitSendViewsHint": { + "message": "Kukaan ei voi avata Sendiä rajoituksen täytyttyä.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ avausta jäljellä", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Sendin tiedot", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Etsi Sendeistä", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Teksti" }, + "sendTypeTextToShare": { + "message": "Jaettava teksti" + }, "sendTypeFile": { "message": "Tiedosto" }, @@ -2232,6 +2320,9 @@ "message": "Kaikki Sendit", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Piilota teksti oletuksena" + }, "maxAccessCountReached": { "message": "Käyttökertojen enimmäismäärä saavutettu", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send poistuu pysyvästi määritettynä ajankohtana.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send poistuu pysyvästi tänä päivänä.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Erääntymisajankohta" }, @@ -2338,6 +2433,10 @@ "message": "Halutessasi, vaadi käyttäjiä syöttämään salasana Sendin avaamiseksi.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Vaadi tämä salasana Sendin avaukseen.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Yksityisiä merkintöjä tästä Sendistä.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Piilota sähköpostiosoitteeni vastaanottajilta." }, + "hideYourEmail": { + "message": "Piilota sähköpostiosoitteeni avaajilta." + }, "sendOptionsPolicyInEffect": { "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa Send-asetuksiisi." }, @@ -2510,8 +2612,37 @@ "minutes": { "message": "Minuuttia" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Yrityskäytännön säännöt vaikuttavat aikakatkaisuasetuksiisi" + }, "vaultTimeoutPolicyInEffect": { - "message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tunti(a) $MINUTES$ minuutti(a).", + "message": "Organisaatiokäytännöt ovat määrittäneet holvisi aikakatkaisun enimmäisajaksi $HOURS$ tuntia $MINUTES$ minuuttia.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "Enintään $HOURS$ tuntia $MINUTES$ minuuttia.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Aikakatkaisu ylittää organisaatiosi määrittämän rajoituksen: Enintään $HOURS$ tuntia $MINUTES$ minuuttia.", "placeholders": { "hours": { "content": "$1", @@ -2524,7 +2655,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tunti(a) $MINUTES$ minuutti(a). Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", + "message": "Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on $HOURS$ tuntia $MINUTES$ minuuttia. Holvillesi määritetty aikakatkaisutoiminto on $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2894,7 +3025,7 @@ "message": "Tärkeää:" }, "masterPasswordHint": { - "message": "Pääsalasanasi palauttaminen ei ole mahdollista, jos unohdat sen!" + "message": "Pääsalasanaasi ei ole mahdollista palauttaa, jos unohdat sen!" }, "characterMinimum": { "message": "Vähintään $LENGTH$ merkkiä", @@ -3207,7 +3338,7 @@ "message": "Aliaksen verkkotunnus" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Kohteille, joille on määritetty pääsalasanan uudelleenkysely, ei voida suorittaa automaattista täyttöä sivun avautuessa. Automaattitäyttö sivun avautuessa poistettiin käytöstä. avautuessa suoritettavan", + "message": "Pääsalasanan vahvistuksen vaativia kohteita ei voida automaattitäyttää sivun avautuessa. Automaattitäyttö sivun avautuessa poistettiin käytöstä.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { @@ -3297,7 +3428,7 @@ "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Bitwardenin automaattisen täytön valikko on käytettävissä. Valitse painamalla alas-nuolinäppäintä.", + "message": "Bitwardenin automaattitäytön valikko on käytettävissä. Avaa se painamalla alas-nuolinäppäintä.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -3499,7 +3630,7 @@ "message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa." }, "noMatchingLoginsForSite": { - "message": "Ei tälle sivustolle sopivia kirjautumistietoja" + "message": "Tälle sivustolle sopivia kirjautumistietoja ei ole" }, "confirm": { "message": "Vahvista" @@ -3668,19 +3799,19 @@ "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Muuta selaimesi automaattisen täytön ja salasanojen hallinnan asetuksia.", + "message": "Muuta selaimesi automaattitäytön ja salasanahallinnan asetuksia.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { - "message": "Voit tarkastella ja asettaa laajennusten pikavalintoja selaimesi asetuksissa.", + "message": "Voit tarkastella ja määrittää laajennuksen pikanäppäimiä selaimesi asetuksista.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Muuta selaimesi automaattisen täytön ja salasanojen hallinnan asetuksia.", + "message": "Muuta selaimesi automaattitäytön ja salasanahallinnan asetuksia.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "Voit tarkastella ja asettaa laajennusten pikavalintoja selaimesi asetuksissa.", + "message": "Voit tarkastella ja määrittää laajennuksen pikanäppäimiä selaimesi asetuksista.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { @@ -3688,7 +3819,7 @@ "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { - "message": "Tämän huomiotta jättäminen voi aiheuttaa ongelmia Bitwardenin automaattitäytön valikon ja selaimen välisessä toiminnassa.", + "message": "Tämän asetuksen ohituksesta voi seurata ongelmia Bitwardenin ja selaimen automaattitäytön välillä.", "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { @@ -3887,7 +4018,7 @@ "message": "Kohteen nimi" }, "cannotRemoveViewOnlyCollections": { - "message": "Et voi poistaa kokoelmia Vain katselu -oikeuksilla: $COLLECTIONS$", + "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -4053,7 +4184,7 @@ "message": "Kortti on vanhentunut" }, "cardExpiredMessage": { - "message": "Jos olet uusinut sen, päivitä kortin tiedot" + "message": "Jos olet uudistanut kortin, päivitä sen tiedot" }, "cardDetails": { "message": "Kortin tiedot" @@ -4295,28 +4426,37 @@ "message": "Bitwardenilla on uusi ulkoasu!" }, "bitwardenNewLookDesc": { - "message": "Automaattitäyttäminen ja hakujen tekeminen Holvi-välilehdeltä on entistä helpompaa ja intuitiivisempaa. Kokeile nyt!" + "message": "Automaattitäyttäminen ja hakujen tekeminen Holvi-välilehdeltä on entistä helpompaa ja luontevampaa. Kokeile nyt!" }, "accountActions": { "message": "Tilitoiminnot" }, "showNumberOfAutofillSuggestions": { - "message": "Näytä automaattitäytön kirjautumistietoehdotusten määrä laajennuksen kuvakkeessa" + "message": "Näytä automaattitäytön ehdotusten määrä laajennuksen kuvakkeessa" }, "systemDefault": { "message": "Järjestelmän oletus" }, "enterprisePolicyRequirementsApplied": { - "message": "Yrityskäytännön vaatimuksia on sovellettu tähän asetukseen" + "message": "Yrityskäytännön vaatimukset vaikuttavat tähän asetukseen" + }, + "retry": { + "message": "Yritä uudelleen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Mukautetun aikakatkaisun vähimmäisaika on yksi minuutti." + }, + "additionalContentAvailable": { + "message": "Lisäsisältöä on käytettävissä" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Tiedosto tallennettiin laitteelle. Hallitse sitä laitteesi latauksista." }, "showCharacterCount": { - "message": "Show character count" + "message": "Näytä merkkimäärä" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Piilota merkkimäärä" }, "itemsInTrash": { "message": "Roskakorin kohteet" diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 6a8288365e0..f69cbf71977 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-fill sa Filipino ay Awtomatikong Pagpuno" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Magdagdag ng Item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Mungkahi sa Password" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Hanapin ang vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Mga nota" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Ang paalala" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Mag-kandado Na" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Ang two-step login ay nagpapagaan sa iyong account sa pamamagitan ng pag-verify sa iyong login sa isa pang device tulad ng security key, authenticator app, SMS, tawag sa telepono o email. Ang two-step login ay maaaring magawa sa bitwarden.com web vault. Gusto mo bang bisitahin ang website ngayon?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Nai-save na folder" }, @@ -892,7 +938,7 @@ "message": "Itala ang mga item ng card sa Tab page para sa madaling auto-fill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Ipakita ang mga pagkatao sa Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "Mag-file" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Pumili ng File" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock sa pamamagitan ng PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Itakda ang iyong PIN code para sa pag-unlock ng Bitwarden. Ang iyong mga setting ng PIN ay ma-reset kung kailanman ay lubusang lumabas ka mula sa application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Kinakailangan ang PIN code." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "I-lock sa master password sa restart ng browser" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Kailangan mong piliin ang hindi bababa sa isang koleksyon." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Aksyon sa Vault timeout" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "I-lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Basurahan", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Mismatch sa Account" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Hindi naka-setup ang biometrics" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Ipadala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Maghanap ng Mga Padala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Teksto" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Mag-file" }, @@ -2232,6 +2320,9 @@ "message": "Lahat ng Mga Padala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Ang pinaka-access count ay nakaabot na", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Ang Ipadala ay tatanggalin nang permanente sa tinukoy na petsa at oras.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Petsa ng pag-expire" }, @@ -2338,6 +2433,10 @@ "message": "Maipapayo na mag-require ng password para sa mga user na ma-access ang Send na ito.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Pribadong mga tala tungkol sa Send na ito.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Itago ang aking email address mula sa mga tatanggap." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Isang o higit pang mga patakaran ng organisasyon ay nakaapekto sa iyong mga pagpipilian sa Pagpadala." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuto" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Nakakaapekto ang mga patakaran ng iyong organisasyon sa iyong vault timeout. Ang pinakamataas na pinapayagang Vault Timeout ay $HOURS$ oras at $MINUTES$ minuto", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index f80a5959ef3..42b60a5f43a 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copier la plaque d'immatriculation" }, + "copyCustomField": { + "message": "Copier $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copier le site web" + }, + "copyNotes": { + "message": "Copier les notes" + }, "autoFill": { "message": "Saisie automatique" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Ajouter un élément" }, + "accountEmail": { + "message": "Courriel du compte" + }, + "requestHint": { + "message": "Demander l'indice" + }, + "requestPasswordHint": { + "message": "Obtenir l'indice du mot de passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Saisissez l'adresse courriel de votre compte et votre indice de mot de passe vous sera envoyé" + }, "passwordHint": { "message": "Indice de mot de passe" }, @@ -462,6 +489,10 @@ "message": "Éviter les caractères ambigus", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Rechercher dans le coffre" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Expiration de la session" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Autres options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Délai d'expiration du coffre" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Verrouiller maintenant" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "L'authentification à deux facteurs rend votre compte plus sûr en vous demandant de vérifier votre connexion avec un autre dispositif tel qu'une clé de sécurité, une application d'authentification, un SMS, un appel téléphonique ou un courriel. L'authentification à deux facteurs peut être configurée dans le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Poursuivre vers l'application web ?" + }, "editedFolder": { "message": "Dossier sauvegardé" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Fichier" }, + "fileToShare": { + "message": "Fichier à partager" + }, "selectFile": { "message": "Sélectionnez un fichier." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Déverrouiller avec un code PIN" }, + "setYourPinTitle": { + "message": "Définir PIN" + }, + "setYourPinButton": { + "message": "Définir PIN" + }, "setYourPinCode": { "message": "Définissez votre code PIN pour déverrouiller Bitwarden. Les paramètres relatifs à votre code PIN seront réinitialisés si vous vous déconnectez complètement de l'application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Le code PIN est requis." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Verrouiller avec le mot de passe principal au redémarrage du navigateur" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Vous devez sélectionner au moins une collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Action après délai d'expiration du coffre" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Verrouiller", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Corbeille", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Erreur de correspondance entre les comptes" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Le déverrouillage biométrique a échoué. La clé secrète biométrique n'a pas réussi à déverrouiller le coffre. Veuillez essayer de configurer à nouveau la biométrie." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Non-concordance des clés biométriques" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Le déverrouillage biométrique a échoué. La clé secrète biométrique n'a pas réussi à déverrouiller le coffre. Veuillez essayer de configurer à nouveau la biométrie." + }, "biometricsNotEnabledTitle": { "message": "Le déverrouillage biométrique n'est pas activé" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Changements de domaines exclus enregistrés" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Détails du Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Rechercher dans les Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Texte" }, + "sendTypeTextToShare": { + "message": "Texte à partager" + }, "sendTypeFile": { "message": "Fichier" }, @@ -2232,6 +2320,9 @@ "message": "Tous les Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Masquer le texte par défaut" + }, "maxAccessCountReached": { "message": "Nombre maximum d'accès atteint", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Le Send sera définitivement supprimé à la date et heure spécifiées.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Le Send sera définitivement supprimé à la date spécifiée.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Date d'expiration" }, @@ -2338,6 +2433,10 @@ "message": "Vous pouvez, si vous le souhaitez, exiger un mot de passe pour accéder à ce Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notes privées à propos de ce Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Masquer mon adresse électronique aux destinataires." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent vos options Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Les politiques de sécurité de votre organisation ont défini le délai d'expiration de votre coffre à $HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Les politiques de sécurité de votre organisation affectent le délai d'expiration de votre coffre. Le délai autorisé d'expiration du coffre est de $HOURS$ heure(s) et $MINUTES$ minute(s) maximum. L'action après délai d'expiration de votre coffre est fixée à $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Les exigences de la politique d'entreprise ont été appliquées à ce paramètre" }, + "retry": { + "message": "Réessayer" + }, + "vaultCustomTimeoutMinimum": { + "message": "Le délai d'expiration personnalisé minimum est de 1 minute." + }, + "additionalContentAvailable": { + "message": "Du contenu supplémentaire est disponible" + }, "fileSavedToDevice": { "message": "Fichier enregistré sur l'appareil. Gérez à partir des téléchargements de votre appareil." }, diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 247542ec192..93b63919311 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-encher" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Engadir elemento" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Pista do contrasinal" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Buscar na caixa forte" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Tempo de sesión esgotado" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Outras opcións" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Tempo de espera da caixa forte" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Bloquear agora" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Cartafol gardado" }, @@ -892,7 +938,7 @@ "message": "Lista os elementos de tarxeta no separador para fácil auto-completado." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Mostrar identidades no separador" @@ -1097,6 +1143,9 @@ "file": { "message": "Ficheiro" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Selecciona un ficheiro" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixo", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Buscar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Ficheiro" }, @@ -2232,6 +2320,9 @@ "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 02a6842efa2..9b5ce585e41 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "השלמה אוטומטית" }, @@ -179,6 +194,18 @@ "addItem": { "message": "הוסף פריט" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "רמז לסיסמה" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "חיפוש בכספת" }, @@ -504,6 +535,9 @@ "notes": { "message": "הערות" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "הערה" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "משך זמן מירבי עבור חיבור לכספת" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "נעל עכשיו" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "התחברות בשני-שלבים הופכת את החשבון שלך למאובטח יותר בכך שאתה נדרש לוודא בכל כניסה בעזרת מכשיר אחר כדוגמת מפתח אבטחה, תוכנת אימות, SMS, שיחת טלפון, או אימייל. ניתן להפעיל את \"התחברות בשני-שלבים\" בכספת שבאתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "תיקייה שנערכה" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "קובץ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "בחר קובץ." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "בטל נעילה עם קוד PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "קבע קוד PIN לביטול נעילת Bitwarden. הגדרות הPIN יאופסו אם תבצע יציאה מהתוכנה." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "נדרש קוד PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "נעל בעזרת הסיסמה הראשית בהפעלת הדפדפן מחדש" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "עליך לבחור לפחות אוסף אחד." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "פעולה לביצוע בכספת בתום זמן החיבור" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "נעילה", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "סל המחזור", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "חוסר התאמה בין חשבונות" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "אמצעי זיהוי ביומטרים לא מאופשרים" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "תאריך תפוגה" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 6b4d3922ff2..3e00e16273e 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "स्वत:भरण" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add Item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password Hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "वॉल्ट खोजे" }, @@ -504,6 +535,9 @@ "notes": { "message": "नोट्स" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "नोट:" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "तिजोरी टाइमआउट" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "वॉल्ट मध्यांतर" }, + "vaultTimeout1": { + "message": "टाइमआउट" + }, "lockNow": { "message": "Lock Now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to enter a security code from an authenticator app whenever you log in. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "बिटवर्डन वेब ऐप में दो-चरणीय लॉगिन सेट करके अपने खाते को अधिक सुरक्षित बनाएं।" + }, + "twoStepLoginConfirmationTitle": { + "message": "वेब ऐप पर जाएं?" + }, "editedFolder": { "message": "Edited Folder" }, @@ -892,7 +938,7 @@ "message": "आसान ऑटो-फिल के लिए टैब पेज पर कार्ड आइटम सूचीबद्ध करें।" }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "टैब पेज पर पहचान दिखाएं" @@ -1097,6 +1143,9 @@ "file": { "message": "फ़ाइल" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "फ़ाइल का चयन करें।" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "पिन से अनलॉक करें " }, + "setYourPinTitle": { + "message": "पिन सेट करें" + }, + "setYourPinButton": { + "message": "पिन सेट करें" + }, "setYourPinCode": { "message": "बिटवर्डन को अनलॉक करने के लिए अपना पिन कोड सेट करें यदि आप कभी भी आवेदन से पूरी तरह लॉग आउट करते हैं तो आपकी पिन सेटिंग्स रीसेट हो जाएंगी।" }, + "setYourPinCode1": { + "message": "बिटवर्डन को अनलॉक करने के लिए आपके मास्टर पासवर्ड के बजाय आपके पिन का उपयोग किया जाएगा। यदि आप कभी भी बिटवर्डन से पूरी तरह लॉग आउट हो जाते हैं तो आपका पिन रीसेट हो जाएगा।" + }, "pinRequired": { "message": "पिन-कोड आवश्यक है |" }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "ब्राउज़र पुनः आरंभ करने पर मास्टर पासवर्ड के साथ लॉक करें" }, + "lockWithMasterPassOnRestart1": { + "message": "ब्राउज़र पुनरारंभ पर मास्टर पासवर्ड की आवश्यकता है" + }, "selectOneCollection": { "message": "आपको कम से कम एक संग्रह का चयन करना होगा।" }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "वॉल्ट मध्यांतर कार्रवाई" }, + "vaultTimeoutAction1": { + "message": "टाइमआउट कार्रवाई" + }, "lock": { "message": "लॉक", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "थ्रैश", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "खाता गलत मैच" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "बायोमेट्रिक अनलॉक विफल रहा. बायोमेट्रिक गुप्त कुंजी वॉल्ट को अनलॉक करने में विफल रही. कृपया बायोमेट्रिक्स को फिर से सेट करने का प्रयास करें." - }, "nativeMessagingWrongUserKeyTitle": { "message": "बेमेल बायोमेट्रिक कुंजी" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "बायोमेट्रिक अनलॉक विफल रहा. बायोमेट्रिक गुप्त कुंजी वॉल्ट को अनलॉक करने में विफल रही. कृपया बायोमेट्रिक्स को फिर से सेट करने का प्रयास करें." + }, "biometricsNotEnabledTitle": { "message": "बॉयोमीट्रिक्स सक्षम नहीं है" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "भेजें", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sends मे खोजे", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "शब्द" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "फ़ाइल" }, @@ -2232,6 +2320,9 @@ "message": "सभी Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "मैक्स एक्सेस काउंट पहुंच गया है", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": " यह सेंड निर्धारित तिथि और समय पर स्थायी रूप से हटा दिया जाएगा।", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "समाप्ति तिथि" }, @@ -2338,6 +2433,10 @@ "message": "वैकल्पिक रूप से उपयोगकर्ताओं को इस सेंड तक पहुंचने के लिए पासवर्ड की आवश्यकता होगी।", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "इस सेंड के बारे में निजी नोट्स।", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "प्राप्तकर्ताओं से मेरा ईमेल पता छिपाएं।" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "एक या एक से अधिक संगठन नीतियां आपके सेंड विकल्पों को प्रभावित कर रही हैं।" }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "मिनट" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "एंटरप्राइज़ नीति आवश्यकताएँ आपके टाइमआउट विकल्पों पर लागू की गई हैं" + }, "vaultTimeoutPolicyInEffect": { "message": "आपकी संगठन नीतियां आपके तिजोरी टाइमआउट को प्रभावित कर रही हैं। अधिकतम अनुमत तिजोरी टाइमआउट $HOURS$ घंटे और $MINUTES$ मिनट है", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "अधिकतम $HOURS$ घंटे और $MINUTES$ मिनट)।", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "टाइमआउट आपके संगठन द्वारा निर्धारित प्रतिबंध से अधिक है: अधिकतम $HOURS$ घंटे और $MINUTES$ मिनट", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "इस सेटिंग पर एंटरप्राइज़ नीति आवश्यकताएँ लागू की गई हैं" }, + "retry": { + "message": "पुन: प्रयास करें" + }, + "vaultCustomTimeoutMinimum": { + "message": "न्यूनतम कस्टम टाइमआउट 1 मिनट है." + }, + "additionalContentAvailable": { + "message": "अतिरिक्त सामग्री उपलब्ध है" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 88a1f158b3a..1d999a0f9b2 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kopiraj OIB" }, + "copyCustomField": { + "message": "Kopiraj $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiraj web stranicu" + }, + "copyNotes": { + "message": "Kopiraj bilješke" + }, "autoFill": { "message": "Auto-ispuna" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Dodaj stavku" }, + "accountEmail": { + "message": "e-pošta računa" + }, + "requestHint": { + "message": "Zatraži podsjetnik" + }, + "requestPasswordHint": { + "message": "Zatraži podsjetnik lozinke" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Unesi svoju adresu e-pošte računa i poslat ćemo ti tvoj podsjetnik" + }, "passwordHint": { "message": "Podsjetnik za lozinku" }, @@ -462,6 +489,10 @@ "message": "Izbjegavaj dvosmislene znakove", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Pretraži trezor" }, @@ -504,6 +535,9 @@ "notes": { "message": "Bilješke" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Bilješka" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Istek sesije" }, + "vaultTimeoutHeader": { + "message": "Istek trezora" + }, "otherOptions": { "message": "Ostale postavke" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Istek trezora" }, + "vaultTimeout1": { + "message": "Vrijeme isteka" + }, "lockNow": { "message": "Zaključaj sada" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Prijava dvostrukom autentifikacijom čini tvoj račun još sigurnijim tako što će zahtijevati da potvrdiš prijavu putem drugog uređaja pomoću sigurnosnog koda, autentifikatorske aplikacije, SMS-om, pozivom ili e-poštom. Prijavu dvostrukom autentifikacijom možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?" }, + "twoStepLoginConfirmationContent": { + "message": "Učini svoj račun sigurnijim uključivanjem prijave dvofaktorskom autentifikacijom u Bitwarden web aplikaciji." + }, + "twoStepLoginConfirmationTitle": { + "message": "Nastavi na web aplikaciju?" + }, "editedFolder": { "message": "Mapa spremljena" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Datoteka" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Odaberi datoteku." }, @@ -1797,13 +1846,13 @@ "message": "Nema lozinki na popisu." }, "clearHistory": { - "message": "Clear history" + "message": "Očisti povijest" }, "noPasswordsToShow": { - "message": "No passwords to show" + "message": "Nema lozinki za prikaz" }, "noRecentlyGeneratedPassword": { - "message": "You haven't generated a password recently" + "message": "Nema nedavno generiranih lozinki" }, "remove": { "message": "Ukloni" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Otključaj PIN-om" }, + "setYourPinTitle": { + "message": "Postavi PIN" + }, + "setYourPinButton": { + "message": "Postavi PIN" + }, "setYourPinCode": { "message": "Postavi svoj PIN kôd za otključavanje Bitwardena. Postavke PIN-a se resetiraju ako se potpuno odjaviš iz aplikacije." }, + "setYourPinCode1": { + "message": "Tvoj PIN će se koristiti za otključavanje Bitwardena umjesto glavne lozinke. PIN će se restirati ukoliko se odjaviš iz Bitwardena. " + }, "pinRequired": { "message": "Potreban je PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Zaključaj glavnom lozinkom kod svakog pokretanja preglednika" }, + "lockWithMasterPassOnRestart1": { + "message": "Zaključaj glavnom lozinkom kod svakog pokretanja preglednika" + }, "selectOneCollection": { "message": "Moraš odabrati barem jednu zbirku." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Nakon isteka trezora" }, + "vaultTimeoutAction1": { + "message": "Radnja nakon isteka " + }, "lock": { "message": "Zaključaj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Smeće", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Pogrešan korisnički račun" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrijsko otključavanje nije uspjelo. Biometrijski tajni ključ nije uspio otključati trezor. Pokušaj ponovo postaviti biometriju." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Neusklađenost biometrijskog ključa" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrijsko otključavanje nije uspjelo. Biometrijski tajni ključ nije uspio otključati trezor. Pokušaj ponovo postaviti biometriju." + }, "biometricsNotEnabledTitle": { "message": "Biometrija nije omogućena" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Spremljene promjene izuzete domene" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Detalji Senda", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Pretraži Sendove", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Dijeljeni tekst" + }, "sendTypeFile": { "message": "Datoteka" }, @@ -2232,6 +2320,9 @@ "message": "Svi Sendovi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Zadano sakrij tekst" + }, "maxAccessCountReached": { "message": "Dostignut najveći broj pristupanja", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send će nakon navedenog vremena biti trajno izbrisan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send će na ovaj datum biti trajno izbrisan.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Vremenski ograničeni pristup" }, @@ -2338,6 +2433,10 @@ "message": "Neobavezno zahtijevaj korisnika lozinku za pristup ovom Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privatne bilješke o Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Sakrij moju adresu e-pošte od primatelja." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Jedno ili više pravila organizacije utječe na postavke Senda." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "minuta" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Pravila tvrtke primijenjena su na vrijeme isteka" + }, "vaultTimeoutPolicyInEffect": { "message": "Pravilo tvoje organizacije podesilo je najveće dozvoljeno vrijeme isteka trezora na $HOURS$:$MINUTES$ h.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Pravila tvrtke primijenjena su na vrijeme isteka", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Tvoja organizacija je zadano postavila kraće vrijeme isteka. Najviše: $HOURS$:$MINUTES$", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je $HOURS$:$MINUTES$ h. Tvoja radnja nakon isteka trezora je: $ACTION$.", "placeholders": { @@ -4309,14 +4440,23 @@ "enterprisePolicyRequirementsApplied": { "message": "Pravila tvrtke primijenjena su na ovu postavku" }, + "retry": { + "message": "Pokušaj ponovo" + }, + "vaultCustomTimeoutMinimum": { + "message": "Najmanje prilagođeno vrijeme je 1 minuta." + }, + "additionalContentAvailable": { + "message": "Dostupan je dodatni sadržaj" + }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Datoteka spremljena na uređaj. Upravljaj u preuzimanjima svog uređaja." }, "showCharacterCount": { - "message": "Show character count" + "message": "Prikaži broj znakova" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Sakrij broj znakova" }, "itemsInTrash": { "message": "Stavke u smeću" diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index ba551e0fa3b..41da93a06cf 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Licensz szám másolása" }, + "copyCustomField": { + "message": "$FIELD$ másolása", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Webhely másolása" + }, + "copyNotes": { + "message": "Jegyzet másolása" + }, "autoFill": { "message": "Automatikus kitöltés" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Elem hozzáadása" }, + "accountEmail": { + "message": "Fiók email cím" + }, + "requestHint": { + "message": "Tipp kérése" + }, + "requestPasswordHint": { + "message": "Jelszó emlékeztető kérése" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Adjuk meg fiók email címét és elküldésre kerül a jelszóra vonatkozó tipp." + }, "passwordHint": { "message": "Jelszó emlékeztető" }, @@ -462,6 +489,10 @@ "message": "Félreérthető karakterek mellőzése", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Keresés a széfben" }, @@ -504,6 +535,9 @@ "notes": { "message": "Jegyzetek" }, + "privateNote": { + "message": "Személyes jegyzet" + }, "note": { "message": "Jegyzet" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Munkamenet időkifutás" }, + "vaultTimeoutHeader": { + "message": "Széf időkifutás" + }, "otherOptions": { "message": "Egyéb opciók" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Széf időkifutás" }, + "vaultTimeout1": { + "message": "Időkifutás" + }, "lockNow": { "message": "Zárolás most" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "A kétlépcsős bejelentkezés biztonságosabbá teszi a fiókot azáltal, hogy ellenőrizni kell a bejelentkezést egy másik olyan eszközzel mint például biztonsági kulcs, hitelesítő alkalmazás, SMS, telefon hívás vagy email. A kétlépcsős bejelentkezést a bitwarden.com webes széfben lehet engedélyezni. Felkeressük a webhelyet most?" }, + "twoStepLoginConfirmationContent": { + "message": "Tegyük biztonságosabbá a fiókot a kétlépcsős bejelentkezés beállításával a Bitwarden webalkalmazásban." + }, + "twoStepLoginConfirmationTitle": { + "message": "Tovább a webes alkalmazáshoz?" + }, "editedFolder": { "message": "A mappa mentésre került." }, @@ -892,7 +938,7 @@ "message": "Kártyaelemek listázása a Fül oldalon a könnyű automatikus kitöltéshez." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Azonosítások megjelenítése a Fül oldalon" @@ -1097,6 +1143,9 @@ "file": { "message": "Fájl" }, + "fileToShare": { + "message": "Megosztandó fájl" + }, "selectFile": { "message": "Válasszunk egy fájlt." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Felnyitás pinkóddal" }, + "setYourPinTitle": { + "message": "PIN kód beállítása" + }, + "setYourPinButton": { + "message": "PIN kód beállítása" + }, "setYourPinCode": { "message": "A pinkód beállítása a Bitwarden feloldásához. A pinkód beállítás alaphelyzetbe kerül, ha teljesen kijelentkezünk az alkalmazásból." }, + "setYourPinCode1": { + "message": "A Bitwarden feloldásához a PIN kódot használjuk a mesterjelszó helyett. A PIN kód alaphelyzetbe kerül, ha teljesen kijelentkezünk a Bitwardenből." + }, "pinRequired": { "message": "A pinkód szükséges." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lezárás mesterjelszóval a böngésző újraindításakor" }, + "lockWithMasterPassOnRestart1": { + "message": "Lezárás mesterjelszóval a böngésző újraindításakor" + }, "selectOneCollection": { "message": "Legalább egy gyűjteményt ki kell választani." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Széf időkifutás művelet" }, + "vaultTimeoutAction1": { + "message": "Időkifutási művelet" + }, "lock": { "message": "Lezárás", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lomtár", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "A fiók nem egyezik." }, - "nativeMessagingWrongUserKeyDesc": { - "message": "A biometrikus feloldás nem sikerült. A biometrikus titkos kulcs nem tudta feloldani a széfet. Próbáljuk újra beállítani a biometrikus adatokat." - }, "nativeMessagingWrongUserKeyTitle": { "message": "A biometrikus kulcs nem egyezik." }, + "nativeMessagingWrongUserKeyDesc": { + "message": "A biometrikus feloldás nem sikerült. A biometrikus titkos kulcs nem tudta feloldani a széfet. Próbáljuk újra beállítani a biometrikus adatokat." + }, "biometricsNotEnabledTitle": { "message": "A biometrikus adatok nincsenek beüzemelve." }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "A kizárt tartomány módosítások mentésre kerültek." }, + "limitSendViews": { + "message": "Megtekintések korlátozása" + }, + "limitSendViewsHint": { + "message": "Senki sem tudja megtekinteni ezt a Send elemet a korlát elérése után.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ megtekintés maradt", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send részletek", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send keresése", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Szöveg" }, + "sendTypeTextToShare": { + "message": "Megosztandó szöveg" + }, "sendTypeFile": { "message": "Fájl" }, @@ -2232,6 +2320,9 @@ "message": "Összes Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Szöveg elrejtése alapértelmezetten" + }, "maxAccessCountReached": { "message": "A maximális hozzáférések száma elérésre került.", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "A Send véglegesen törölve lesz a meghatározott időpontban.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "A Send véglegesen törölve lesz ebben az időpontban.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Lejárati dátum" }, @@ -2338,6 +2433,10 @@ "message": "Opcionálisan megadhatunk egy jelszót a felhasználók számára a Küldés eléréséhez. ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Jelszó szükséges a Send elem megtekintéséhez.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Személyes megjegyzések erről a Küldésről.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Saját email cím elrejtése a címzettek elől." }, + "hideYourEmail": { + "message": "Saját email cím elrejtése a megtekintések elől." + }, "sendOptionsPolicyInEffect": { "message": "Egy vagy több szervezeti szabály érinti a Send opciókat." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Perc" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Erre a beállításra a vállalkozás rendszabály követelmények lettek alkalmazva." + }, "vaultTimeoutPolicyInEffect": { "message": "A szervezeti szabályzata $HOURS$ órára és $MINUTES$ percre állította be a maximálisan megengedett széf időtúllépést.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ óra és $MINUTES$ perc maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Az időkifutás meghaladja a szervezet által beállított korlátozást: $HOURS$ óra és $MINUTES$ perc maxximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "A szervezeti házirendek hatással vannak a széf időkorlátjára. A széf időkorlátja legfeljebb $HOURS$ óra és $MINUTES$ perc lehet. A széf időkifutási művelete $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Erre a beállításra a vállalkozás rendszabály követelmények lettek alkalmazva." }, + "retry": { + "message": "Újra" + }, + "vaultCustomTimeoutMinimum": { + "message": "A minimális egyedi időkifutás 1 perc." + }, + "additionalContentAvailable": { + "message": "Kiegészítő tartalom érhető el." + }, "fileSavedToDevice": { "message": "A fájl mentésre került az eszközre. Kezeljük az eszközről a letöltéseket." }, diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index b43eddb3fdc..a5aa720c0b5 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Isi otomatis" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Tambah Item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Petunjuk Kata Sandi" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Cari brankas" }, @@ -504,6 +535,9 @@ "notes": { "message": "Catatan" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Catatan" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Batas waktu sesi" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Opsi lainnya" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Batas Waktu Brankas" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Kunci Sekarang" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Info masuk dua langkah membuat akun Anda lebih aman dengan mengharuskan Anda memverifikasi info masuk Anda dengan peranti lain seperti kode keamanan, aplikasi autentikasi, SMK, panggilan telepon, atau email. Info masuk dua langkah dapat diaktifkan di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder yang disunting" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "Berkas" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Pilih berkas." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Buka kunci dengan PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Setel kode PIN Anda untuk membuka kunci Bitwarden. Pengaturan PIN Anda akan diatur ulang jika Anda pernah keluar sepenuhnya dari aplikasi." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Membutuhkan kode PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Kunci dengan kata sandi utama saat peramban dimulai ulang" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Anda harus memilih setidaknya satu koleksi." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Tindakan Batas Waktu Brankas" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Kunci", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Sampah", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Akun tidak cocok" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrik tidak diaktifkan" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Pencarian Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Teks" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Berkas" }, @@ -2232,6 +2320,9 @@ "message": "Semua Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Jumlah akses maksimum tercapai", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send akan dihapus secara permanen pada tanggal dan waktu yang ditentukan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Tanggal habis tempo" }, @@ -2338,6 +2433,10 @@ "message": "Secara opsional, minta kata sandi bagi pengguna untuk mengakses Send ini.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Catatan pribadi tentang Send ini.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Sembunyikan alamat surel dari penerima." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Satu atau lebih kebijakan organisasi mempengaruhi pengaturan feature Send anda." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Menit" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Kebijakan organisasi Anda memengaruhi waktu tunggu brankas Anda. Batas maksimal Waktu Tunggu Brankas yang diizinkan adalah $HOURS$ jam dan $MINUTES$ menit", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 79c4d3cff74..46bf1fe6c9b 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copia numero licenza" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Riempimento automatico" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Aggiungi elemento" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Suggerimento password" }, @@ -462,6 +489,10 @@ "message": "Evita caratteri ambigui", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Cerca nella cassaforte" }, @@ -504,6 +535,9 @@ "notes": { "message": "Note" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Timeout della sessione" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Altre opzioni" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Timeout cassaforte" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Blocca ora" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "La verifica in due passaggi rende il tuo account più sicuro richiedendoti di verificare il tuo login usando un altro dispositivo come una chiave di sicurezza, app di autenticazione, SMS, telefonata, o email. Può essere abilitata nella cassaforte web su bitwarden.com. Vuoi visitare il sito?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Cartella salvata" }, @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Seleziona un file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Sblocca con PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'app." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Codice PIN obbligatorio." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Blocca con la password principale al riavvio del browser" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Devi selezionare almeno una raccolta." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Azione timeout cassaforte" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Blocca", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Cestino", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account non corrispondono" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Sblocco biometrico non riuscito. La chiave segreta biometrica non è riuscita a sbloccare la cassaforte. Riprova a configurare nuovamente la biometria." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Chiave biometrica non corrispondente" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Sblocco biometrico non riuscito. La chiave segreta biometrica non è riuscita a sbloccare la cassaforte. Riprova a configurare nuovamente la biometria." + }, "biometricsNotEnabledTitle": { "message": "Autenticazione biometrica non abilitata" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Modifiche del dominio escluso salvate" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Cerca Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Testo" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "Tutti i Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Numero massimo di accessi raggiunto", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Il Send sarà eliminato definitivamente alla data e ora specificate.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data di scadenza" }, @@ -2338,6 +2433,10 @@ "message": "Richiedi una password agli utenti per accedere a questo Send (facoltativo).", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Note private sul Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Nascondi il mio indirizzo email dai destinatari." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una o più politiche dell'organizzazione stanno influenzando le tue opzioni di Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuti" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Le politiche della tua organizzazione hanno impostato il timeout massimo consentito della tua cassaforte su $HOURS$ ore e $MINUTES$ minuti.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Le politiche della tua organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti. La tua azione di timeout della cassaforte è impostata su $ACTION$.", "placeholders": { @@ -3924,7 +4055,7 @@ "message": "Collegato" }, "copySuccessful": { - "message": "Copia Riuscita" + "message": "Copia riuscita" }, "upload": { "message": "Carica" @@ -4309,14 +4440,23 @@ "enterprisePolicyRequirementsApplied": { "message": "I requisiti della policy aziendale sono stati applicati a questa impostazione" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File salvato sul dispositivo. Gestisci dai download del dispositivo." }, "showCharacterCount": { - "message": "Show character count" + "message": "Mostra conteggio caratteri" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Nascondi conteggio caratteri" }, "itemsInTrash": { "message": "Elementi nel cestino" diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 393a8311779..adc9242050e 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "免許証番号をコピー" }, + "copyCustomField": { + "message": "$FIELD$ をコピー", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "ウェブサイトをコピー" + }, + "copyNotes": { + "message": "メモをコピー" + }, "autoFill": { "message": "自動入力" }, @@ -179,6 +194,18 @@ "addItem": { "message": "アイテムの追加" }, + "accountEmail": { + "message": "アカウントのメールアドレス" + }, + "requestHint": { + "message": "ヒントを要求" + }, + "requestPasswordHint": { + "message": "パスワードのヒントを要求する" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "アカウントのメールアドレスを入力すると、パスワードのヒントが送信されます" + }, "passwordHint": { "message": "パスワードのヒント" }, @@ -462,6 +489,10 @@ "message": "あいまいな文字を避ける", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "保管庫を検索" }, @@ -504,6 +535,9 @@ "notes": { "message": "メモ" }, + "privateNote": { + "message": "非公開メモ" + }, "note": { "message": "メモ" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "セッションタイムアウト" }, + "vaultTimeoutHeader": { + "message": "保管庫のタイムアウト" + }, "otherOptions": { "message": "その他のオプション" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "保管庫のタイムアウト" }, + "vaultTimeout1": { + "message": "タイムアウト" + }, "lockNow": { "message": "今すぐロック" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "2段階認証を使うと、ログイン時にセキュリティキーや認証アプリ、SMS、電話やメールでの認証を必要にすることでアカウントをさらに安全に出来ます。2段階認証は bitwarden.com ウェブ保管庫で有効化できます。ウェブサイトを開きますか?" }, + "twoStepLoginConfirmationContent": { + "message": "Bitwarden ウェブアプリで2段階認証を設定すると、アカウントがより安全になります。" + }, + "twoStepLoginConfirmationTitle": { + "message": "ウェブアプリに進みますか?" + }, "editedFolder": { "message": "フォルダーを編集しました" }, @@ -1097,6 +1143,9 @@ "file": { "message": "ファイル" }, + "fileToShare": { + "message": "共有するファイル" + }, "selectFile": { "message": "ファイルを選択してください。" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "PIN でロック解除" }, + "setYourPinTitle": { + "message": "PIN を設定" + }, + "setYourPinButton": { + "message": "PIN を設定" + }, "setYourPinCode": { "message": "Bitwarden のロックを解除するための PIN コードを設定します。アプリから完全にログアウトすると、PIN 設定はリセットされます。" }, + "setYourPinCode1": { + "message": "あなたの PIN はマスターパスワードの代わりに Bitwarden のロックを解除するために使用されます。Bitwarden から完全にログアウトすると PIN がリセットされます。" + }, "pinRequired": { "message": "PIN コードが必要です。" }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "ブラウザー再起動時にマスターパスワードでロック" }, + "lockWithMasterPassOnRestart1": { + "message": "ブラウザの再起動時にマスターパスワードを要求" + }, "selectOneCollection": { "message": "最低でも一つのコレクションを選んでください。" }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "保管庫タイムアウト時のアクション" }, + "vaultTimeoutAction1": { + "message": "タイムアウト時のアクション" + }, "lock": { "message": "ロック", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ごみ箱", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "アカウントが一致しません" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "生体認証のロック解除に失敗しました。生体認証キーでの保管庫のロック解除に失敗しました。生体認証を再度設定してください。" - }, "nativeMessagingWrongUserKeyTitle": { "message": "生体認証キーが一致しません" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "生体認証のロック解除に失敗しました。生体認証キーでの保管庫のロック解除に失敗しました。生体認証を再度設定してください。" + }, "biometricsNotEnabledTitle": { "message": "生体認証が有効になっていません" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "除外ドメインの変更を保存しました" }, + "limitSendViews": { + "message": "表示の制限" + }, + "limitSendViewsHint": { + "message": "上限に達した後、誰もこの Send を表示できなくなります。", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "残り $ACCESSCOUNT$ 回", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send の詳細", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send を検索", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "テキスト" }, + "sendTypeTextToShare": { + "message": "共有するテキスト" + }, "sendTypeFile": { "message": "ファイル" }, @@ -2232,6 +2320,9 @@ "message": "すべての Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "デフォルトでテキストを隠す" + }, "maxAccessCountReached": { "message": "最大アクセス数に達しました", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send は指定された日時に完全に削除されます。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send はこの日付で完全に削除されます。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "有効期限" }, @@ -2338,6 +2433,10 @@ "message": "必要に応じて、ユーザーがこの Send にアクセスするためのパスワードを要求します。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Send を表示するにはこのパスワードが必要になります。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "この Send に関するプライベートメモ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "メールアドレスを受信者に表示しない" }, + "hideYourEmail": { + "message": "閲覧者にメールアドレスを見せないようにします。" + }, "sendOptionsPolicyInEffect": { "message": "一つ以上の組織ポリシーが Send の設定に影響しています。" }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "分" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "タイムアウトオプションにエンタープライズポリシー要件を適用しました" + }, "vaultTimeoutPolicyInEffect": { "message": "あなたの組織ポリシーは保管庫のタイムアウトに影響を与えています。最大保管庫のタイムアウト時間は $HOURS$ 時間 $MINUTES$ 分です。", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ 時間と $MINUTES$ 分が最大です。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "タイムアウトが組織によって設定された制限を超えています: 上限 $HOURS$ 時間と $MINUTES$ 分間", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "組織のポリシーがあなたの保管庫のタイムアウトに影響しす。保管庫の最大許容タイムアウトは$HOURS$時間$MINUTES$分です。保管庫のタイムアウト設定は$ACTION$にあります。", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "エンタープライズポリシー要件がこの設定に適用されました" }, + "retry": { + "message": "再試行" + }, + "vaultCustomTimeoutMinimum": { + "message": "カスタムタイムアウトの最小値は1分です。" + }, + "additionalContentAvailable": { + "message": "追加コンテンツが利用可能です" + }, "fileSavedToDevice": { "message": "ファイルをデバイスに保存しました。デバイスのダウンロードで管理できます。" }, diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 5e3809e00df..6525dcc9c06 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "თვითშევსება" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 338d70eaf58..8eae45e6b38 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index aa902ec5d7e..c022c77288d 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "ಸ್ವಯಂ ಭರ್ತಿ" }, @@ -179,6 +194,18 @@ "addItem": { "message": "ಐಟಂ ಸೇರಿಸಿ" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "ವಾಲ್ಟ್ ಹುಡುಕಿ" }, @@ -504,6 +535,9 @@ "notes": { "message": "ಟಿಪ್ಪಣಿಗಳು" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "ಟಿಪ್ಪಣಿ" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "ವಾಲ್ಟ್ ಕಾಲಾವಧಿ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "ಈಗ ಲಾಕ್ ಮಾಡಿ" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "ಭದ್ರತಾ ಕೀ, ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್, ಎಸ್‌ಎಂಎಸ್, ಫೋನ್ ಕರೆ ಅಥವಾ ಇಮೇಲ್‌ನಂತಹ ಮತ್ತೊಂದು ಸಾಧನದೊಂದಿಗೆ ನಿಮ್ಮ ಲಾಗಿನ್ ಅನ್ನು ಪರಿಶೀಲಿಸುವ ಅಗತ್ಯವಿರುವ ಎರಡು ಹಂತದ ಲಾಗಿನ್ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಹೆಚ್ಚು ಸುರಕ್ಷಿತಗೊಳಿಸುತ್ತದೆ. ಬಿಟ್ವಾರ್ಡೆನ್.ಕಾಮ್ ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು. ನೀವು ಈಗ ವೆಬ್‌ಸೈಟ್‌ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "ಫೋಲ್ಡರ್ ತಿದ್ದಲಾಗಿದೆ" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "ಫೈಲ್" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ಕಡತವನ್ನು ಆಯ್ಕೆಮಾಡು." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "ಪಿನ್‌ನೊಂದಿಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿ" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "ಬಿಟ್‌ವಾರ್ಡೆನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಿ. ನೀವು ಎಂದಾದರೂ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಸಂಪೂರ್ಣವಾಗಿ ಲಾಗ್ out ಟ್ ಆಗಿದ್ದರೆ ನಿಮ್ಮ ಪಿನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮರುಹೊಂದಿಸಲಾಗುತ್ತದೆ." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ಪಿನ್ ಕೋಡ್ ಅಗತ್ಯವಿದೆ." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "ಬ್ರೌಸರ್ ಮರುಪ್ರಾರಂಭದಲ್ಲಿ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್‌ನೊಂದಿಗೆ ಲಾಕ್ ಮಾಡಿ" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "ನೀವು ಕನಿಷ್ಠ ಒಂದು ಸಂಗ್ರಹವನ್ನು ಆರಿಸಬೇಕು." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "ವಾಲ್ಟ್ ಸಮಯ ಮೀರುವ ಕ್ರಿಯೆ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ಲಾಕ್‌", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ಅನುಪಯುಕ್ತ", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "ಖಾತೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "ಬಯೊಮಿಟ್ರಿಕ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "ಕಳುಹಿಸಿ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ಹುಡುಕಾಟ ಕಳುಹಿಸುತ್ತದೆ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "ಪಠ್ಯ" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ಫೈಲ್" }, @@ -2232,6 +2320,9 @@ "message": "ಎಲ್ಲಾ ಕಳುಹಿಸುತ್ತದೆ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ ತಲುಪಿದೆ", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "ಕಳುಹಿಸಿದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯದ ಮೇಲೆ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "ಮುಕ್ತಾಯ ದಿನಾಂಕ" }, @@ -2338,6 +2433,10 @@ "message": "ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಪಾಸ್‌ವರ್ಡ್ ಐಚ್ ಗತ್ಯವಿದೆ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "ಈ ಕಳುಹಿಸುವ ಬಗ್ಗೆ ಖಾಸಗಿ ಟಿಪ್ಪಣಿಗಳು.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "ಸ್ವೀಕರಿಸುವವರಿಂದ ನನ್ನ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಮರೆಮಾಡಿ." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆಯ ನೀತಿಗಳು ನಿಮ್ಮ ಕಳುಹಿಸುವ ಆಯ್ಕೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index cd2fff44a41..138a4548f88 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -14,16 +14,16 @@ "message": "안전 보관함에 접근하려면 로그인하거나 새 계정을 만드세요." }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "초대 승낙" }, "createAccount": { "message": "계정 만들기" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "비밀번호 설정" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "비밀번호를 설정하여 계정 생성을 완료합니다." }, "enterpriseSingleSignOn": { "message": "엔터프라이즈 통합 인증 (SSO)" @@ -50,7 +50,7 @@ "message": "마스터 비밀번호 힌트는 마스터 비밀번호를 잊었을 때 도움이 될 수 있습니다." }, "masterPassHintText": { - "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "message": "비밀번호를 잊어버린 경우 비밀번호 힌트가 이메일로 전송됩니다. 최대 길이: $CURRENT$/$MAXIMUM$", "placeholders": { "current": { "content": "$1", @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "운전면허 번호 복사" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "자동 완성" }, @@ -179,6 +194,18 @@ "addItem": { "message": "항목 추가" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "비밀번호 힌트" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "보관함 검색" }, @@ -504,6 +535,9 @@ "notes": { "message": "메모" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "메모" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "세션 만료" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "기타 옵션" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "보관함 시간 제한" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "지금 잠그기" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "2단계 인증은 보안 키, 인증 앱, SMS, 전화 통화 등의 다른 기기로 사용자의 로그인 시도를 검증하여 사용자의 계정을 더욱 안전하게 만듭니다. 2단계 인증은 bitwarden.com 웹 보관함에서 활성화할 수 있습니다. 지금 웹 사이트를 방문하시겠습니까?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "폴더 편집함" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "파일" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "파일을 선택하세요." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "PIN 코드를 사용하여 잠금 해제" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Bitwarden 잠금해제에 사용될 PIN 코드를 설정합니다. 이 애플리케이션에서 완전히 로그아웃할 경우 PIN 설정이 초기화됩니다." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN 코드가 필요합니다." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "브라우저 다시 시작 시 마스터 비밀번호로 잠금" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "반드시 하나 이상의 컬렉션을 선택해야 합니다." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "보관함 시간 제한 초과시 동작" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "잠금", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "휴지통", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "계정이 일치하지 않음" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "생체 인식이 활성화되지 않음" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send 검색", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "텍스트" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "파일" }, @@ -2232,6 +2320,9 @@ "message": "모든 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "최대 접근 횟수 도달", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "이 Send가 정해진 일시에 영구적으로 삭제됩니다.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "만료 날짜" }, @@ -2338,6 +2433,10 @@ "message": "이 Send에 접근하기 위해 암호를 입력하도록 선택적으로 요구합니다.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "이 Send에 대한 비공개 메모", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "받는 사람으로부터 나의 이메일 주소 숨기기" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "하나 이상의 단체 정책이 Send 설정에 영향을 미치고 있습니다." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "분" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "조직 정책이 보관함 제한 시간에 영향을 미치고 있습니다. 최대 허용 보관함 제한 시간은 $HOURS$시간 $MINUTES$분입니다", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index c60b8b7b211..6e583c88c13 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Automatinis užpildymas" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Pridėti elementą" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Slaptažodžio užuomina" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Ieškoti saugykloje" }, @@ -504,6 +535,9 @@ "notes": { "message": "Pastabos" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Pastaba" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Baigėsi seanso laikas" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Kitos parinktys" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Atsijungta nuo saugyklos" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Užrakinti dabar" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Prisijungus dviem veiksmais, jūsų paskyra tampa saugesnė, reikalaujant patvirtinti prisijungimą naudojant kitą įrenginį, pvz., saugos raktą, autentifikavimo programėlę, SMS, telefono skambutį ar el. paštą. Dviejų žingsnių prisijungimą galima įjungti „bitwarden.com“ interneto saugykloje. Ar norite dabar apsilankyti svetainėje?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Katalogas atnaujintas" }, @@ -892,7 +938,7 @@ "message": "Pateikti kortelių elementų skirtuko puslapyje sąrašą, kad būtų lengva automatiškai užpildyti." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Rodyti tapatybes skirtuko puslapyje" @@ -1097,6 +1143,9 @@ "file": { "message": "Failas" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Pasirinkite failą." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Atrakinti PIN kodu" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Nustatykite savo PIN kodą, kad atrakintumėte „Bitwarden“. Jūsų PIN nustatymai bus nustatyti iš naujo, jei kada nors visiškai atsijungsite nuo programos." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN kodas yra privalomas." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Užrakinkite pagrindiniu slaptažodžiu paleidus naršyklę iš naujo" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Turite pasirinkti bent vieną kategoriją." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault skirtojo laiko veiksmas" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Užrakinti", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Šiukšliadėžė", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Paskyros neatitikimas" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Trūksta biometrinių duomenų nustatymų" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Siųsti", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Ieškoti „Sends“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekstas" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Byla" }, @@ -2232,6 +2320,9 @@ "message": "Visi siuntimai", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Pasiektas maksimalus prisijungimų skaičius", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Nurodytos datos ir laiko metu „Send“ bus bus ištrinta visam laikui.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Galiojimo data" }, @@ -2338,6 +2433,10 @@ "message": "Pasirinktinai reikalauti slaptažodžio, kad vartotojai galėtų pasiekti šį „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Asmeninės pastabos apie šį „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Slėpti mano el. pašto adresą nuo gavėjų." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Viena ar daugiau organizacijos politikų turi įtakos Jūsų „Send“ nustatymams." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minučių" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Jūsų organizacijos politika nustatė Jūsų didžiausią leidžiamą saugyklos laiko limitą į $HOURS$ valandas(-ų) ir $MINUTES$ minutes(-čių).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Jūsų organizacijos politika apriboja Jūsų saugyklos neaktyvumo laiko nustatymus. Maksimalus leidžiamas saugyklos neaktyvumo laikas yra $HOURS$ valanda(-os) ir $MINUTES$ minutė(s). Jūsų saugyklos neaktyvumo laiko veiksmas yra nustatytas $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 2f1f123020d..8382fdcdc73 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Ievietot licences numuru starpliktuvē" }, + "copyCustomField": { + "message": "Ievietot $FIELD$ starpliktuvē", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Ievietot tīmekļvietni starpliktuvē" + }, + "copyNotes": { + "message": "Ievietot piezīmes starpliktuvē" + }, "autoFill": { "message": "Automātiskā aizpilde" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Pievienot vienumu" }, + "accountEmail": { + "message": "Konta e-pasta adrese" + }, + "requestHint": { + "message": "Pieprasīt norādi" + }, + "requestPasswordHint": { + "message": "Pieprasīt paroles norādi" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosūtīta" + }, "passwordHint": { "message": "Paroles norāde" }, @@ -462,6 +489,10 @@ "message": "Izvairīties no viegli sajaucamām rakstzīmēm", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Meklēt glabātavā" }, @@ -504,6 +535,9 @@ "notes": { "message": "Piezīmes" }, + "privateNote": { + "message": "Personiska piezīme" + }, "note": { "message": "Piezīme" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Sesijas noildze" }, + "vaultTimeoutHeader": { + "message": "Glabātavas noildze" + }, "otherOptions": { "message": "Citas iespējas" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Glabātavas noildze" }, + "vaultTimeout1": { + "message": "Noildze" + }, "lockNow": { "message": "Aizslēgt" }, @@ -730,13 +770,13 @@ "message": "Nolasīt autentificētāja kvadrātkodu pašreizējā tīmekļa lapā" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "Padarīt divpakāpju apliecināšanu plūdenu" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden var glabāt un aizpildīt divpakāpju apliecināšanas kodus. Atslēga jāievieto starpliktuvē un jāielīmē šajā laukā." }, "totpHelperWithCapture": { - "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + "message": "Bitwarden var glabāt un aizpildīt divpakāpju apliecināšanas kodus. Jāizvēlas kameras ikona, lai veiktu tīmekļvietnes autentificētāja kvadrātkoda ekrānuzņēmumu, vai jāievieto starpliktuvē atslēga un jāielīmē šajā laukā." }, "learnMoreAboutAuthenticators": { "message": "Uzzināt vairāk par autentificētājiem" @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Divpakāpju pieteikšanās padara kontu krietni drošāku, pieprasot apstiprināt pieteikšanos ar tādu citu ierīču vai pakalpojumu starpniecību kā drošības atslēga, autentificētāja lietotne, īsziņa, tālruņa zvans vai e-pasts. Divpakāpju pieteikšanos var iespējot bitwarden.com tīmekļa glabātavā. Vai tagad apmeklēt tīmekļvietni?" }, + "twoStepLoginConfirmationContent": { + "message": "Savu kontu var padarīt drošāku ar divpakāpju pieteikšanās uzstādīšanu Bitwarden tīmekļa lietotnē." + }, + "twoStepLoginConfirmationTitle": { + "message": "Pāriet uz tīmekļa lietotni?" + }, "editedFolder": { "message": "Mape labota" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Datne" }, + "fileToShare": { + "message": "Datne, ko kopīgot" + }, "selectFile": { "message": "Atlasīt datni" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Atslēgt ar PIN" }, + "setYourPinTitle": { + "message": "Iestatīt PIN" + }, + "setYourPinButton": { + "message": "Iestatīt PIN" + }, "setYourPinCode": { "message": "Iestatīt PIN kodu Bitwarden atslēgšanai. PIN iestatījumi tiks atiestatīti pēc pilnīgas izrakstīšanās no lietotnes." }, + "setYourPinCode1": { + "message": "PIN būs izmantojams galvenās paroles vietā, lai atslēgtu Bitwarden. PIN tiks atiestatīts, ja kādreiz notiks pilnīga izrakstīšanās no Bitwarden." + }, "pinRequired": { "message": "Ir nepieciešams PIN kods." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Aizslēgt ar galveno paroli pēc pārlūka atsāknēšanas" }, + "lockWithMasterPassOnRestart1": { + "message": "Pieprasīt galveno paroli pēc pārlūka pārsāknēšanas" + }, "selectOneCollection": { "message": "Ir jāizvēlas vismaz viens krājums." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Glabātavas noildzes darbība" }, + "vaultTimeoutAction1": { + "message": "Noildzes darbība" + }, "lock": { "message": "Slēgt", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Atkritne", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konta nesaderība" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometriskā atslēgšana neizdevās. Biometriskā slepenā atslēgai neizdevās atslēgt glabātavu. Lūgums vēlreiz mēģināt iestatīt biometriju." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometriskās atslēgas neatbilstība" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometriskā atslēgšana neizdevās. Biometriskā slepenā atslēgai neizdevās atslēgt glabātavu. Lūgums vēlreiz mēģināt iestatīt biometriju." + }, "biometricsNotEnabledTitle": { "message": "Biometrija nav iespējota" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Saglabātas vērā neņemto domēna vārdu izmaiņas" }, + "limitSendViews": { + "message": "Ierobežot skatījumus" + }, + "limitSendViewsHint": { + "message": "Neviens nevar apskatīt šo Send pēc tam, kad ir sasniegts ierobežojums.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Atlikuši $ACCESSCOUNT$ skatījumi", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Informācija par Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Meklēt Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Teksts" }, + "sendTypeTextToShare": { + "message": "Kopīgojamais teksts" + }, "sendTypeFile": { "message": "Datne" }, @@ -2232,6 +2320,9 @@ "message": "Visi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Pēc noklusējuma paslēpt tekstu" + }, "maxAccessCountReached": { "message": "Sasniegts lielākais pieļaujamais piekļuves reižu skaits", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send tiks neatgriezeniski izdzēsts norādītajā datumā un laikā.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send šajā datumā tiks neatgriezeniski izdzēsts.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Derīguma beigu datums" }, @@ -2338,6 +2433,10 @@ "message": "Pēc izvēles pieprasīt paroli, lai lietotāji varētu piekļūt šim Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Pieprasīt šo paroli, lai apskatītu Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Personīgas piezīmes par šo Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Slēpt e-pasta adresi no saņēmējiem." }, + "hideYourEmail": { + "message": "Paslēpt e-pasta adresi no apskatītājiem." + }, "sendOptionsPolicyInEffect": { "message": "Viens vai vairāki apvienības nosacījumi ietekmē Send iespējas." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minūtes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Noildzes iespējām tika piemērotas uzņēmējdarbības nosacījumu prasības" + }, "vaultTimeoutPolicyInEffect": { "message": "Apvienības nosacījumi ietekmē glabātavas noildzi. Lielākā atļautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minūte(s)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Ne vairāk kā $HOURS$ stunda(s) un $MINUTES$ minūte(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Noildze pārsniedz apvienības iestatīto ierobežojumu: ne vairāk kā $HOURS$ stunda(s) un $MINUTES$ minūte(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Apvienības nosacījumi ietekmē glabātavas noildzi. Lielākā atļautā glabātavas noildze ir $HOURS$ stunda(s) un $MINUTES$ minūte(s). Kā glabātavas noildzes darbība ir uzstādīta $ACTION$.", "placeholders": { @@ -3383,7 +3514,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanāš veids vai jāvēršas pie Duo pēc palīdzības." + "message": "Kļūda savienojuma izveidošanā ar Duo pakalpojumu. Jāizmanto cits divpakāpju pieteikšanās veids vai jāvēršas pie Duo pēc palīdzības." }, "launchDuoAndFollowStepsToFinishLoggingIn": { "message": "Jāpalaiž DUO un jāseko soļiem, lai pabeigtu pieteikšanos." @@ -3988,10 +4119,10 @@ "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { - "message": "Login credentials" + "message": "Pieteikšanās dati" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Autentificētāja atslēga" }, "autofillOptions": { "message": "Automātiskās aizpildes iespējas" @@ -4092,7 +4223,7 @@ "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { - "message": "Assign" + "message": "Piešķirt" }, "bulkCollectionAssignmentDialogDescriptionSingular": { "message": "Vienumu varēs redzēt tikai apvnienības dalībnieki ar piekļuvi šiem krājumiem." @@ -4101,7 +4232,7 @@ "message": "Vienumus varēs redzēt tikai apvnienības dalībnieki ar piekļuvi šiem krājumiem." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "Ir atlasīti $TOTAL_COUNT$ vienumi. Nevar atjaunināt $READONLY_COUNT$ no vienumiem, jo trūkst labošanas atļaujas.", "placeholders": { "total_count": { "content": "$1", @@ -4196,7 +4327,7 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Atlasīt krājumus, lai piešķirtu" }, "personalItemTransferWarningSingular": { "message": "1 vienums tiks neatgriezeniski nodots atlasītajai apvienībai. Šis vienums Tev vairs nepiederēs." @@ -4233,13 +4364,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Krājumi veiksmīgi piešķirti" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Nekas nav atlasīts." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "Atzīmētie vienumi pārvietoti uz $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Šim iestatījumam tika piemērotas uzņēmējdarbības nosacījumu prasības" }, + "retry": { + "message": "Mēģināt vēlreiz" + }, + "vaultCustomTimeoutMinimum": { + "message": "Mazākā pieļaujamā pielāgotā noildze ir 1 minūte." + }, + "additionalContentAvailable": { + "message": "Ir pieejams papildu saturs" + }, "fileSavedToDevice": { "message": "Datne saglabāta ierīcē. Tā ir atrodama ierīces lejupielāžu mapē." }, diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index bcec218774d..e78edf841ea 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "ഓട്ടോഫിൽ" }, @@ -179,6 +194,18 @@ "addItem": { "message": " ഇനം ചേർക്കുക" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "പാസ്സ്‌വേഡ് സൂചനാ" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "വാൾട് തിരയുക" }, @@ -504,6 +535,9 @@ "notes": { "message": "കുറിപ്പുകൾ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "കുറിപ്പ്" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "വാൾട് ടൈംഔട്ട്" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "ഇപ്പോൾ ലോക്കുചെയ്യുക" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "സുരക്ഷാ കീ, ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷൻ, SMS, ഫോൺ കോൾ അല്ലെങ്കിൽ ഇമെയിൽ പോലുള്ള മറ്റൊരു ഉപകരണം ഉപയോഗിച്ച് തങ്ങളുടെ ലോഗിൻ സ്ഥിരീകരിക്കാൻ ആവശ്യപ്പെടുന്നതിലൂടെ രണ്ട്-ഘട്ട ലോഗിൻ തങ്ങളുടെ അക്കൗണ്ടിനെ കൂടുതൽ സുരക്ഷിതമാക്കുന്നു. bitwarden.com വെബ് വാൾട്ടിൽ രണ്ട്-ഘട്ട ലോഗിൻ പ്രവർത്തനക്ഷമമാക്കാനാകും.തങ്ങള്ക്കു ഇപ്പോൾ വെബ്സൈറ്റ് സന്ദർശിക്കാൻ ആഗ്രഹമുണ്ടോ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "തിരുത്തിയ ഫോൾഡർ" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "ഫയൽ" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ഒരു ഫയൽ തിരഞ്ഞെടുക്കുക" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "പിൻ ഉപയോഗിച്ച് അൺലോക്കുചെയ്യുക" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Bitwarden അൺലോക്കുചെയ്യുന്നതിന് തങ്ങളുടെ പിൻ കോഡ് സജ്ജമാക്കുക. തങ്ങൾ എപ്പോഴെങ്കിലും അപ്ലിക്കേഷനിൽ നിന്ന് പൂർണ്ണമായി ലോഗ് ഔട്ട് ചെയ്യുകയാണെങ്കിൽ, പിൻ ക്രമീകരണങ്ങൾ പുനസജ്ജമാക്കും." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "പിൻ കോഡ് നിർബന്ധമാണ്." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "ബ്രൌസർ പുനരാരംഭത്തിൽ പ്രാഥമിക പാസ്‌വേഡ് ഉപയോഗിച്ച് ലോക്ക് ചെയ്യുക" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "നിങ്ങൾ ഒരു കളക്ഷനെങ്കിലും തിരഞ്ഞെടുക്കണം." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "വാൾട് ടൈം ഔട്ട് ആക്ഷൻ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "പൂട്ടുക", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ട്രാഷ്", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 0ecb9907504..36010477889 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "स्वयंभरण" }, @@ -179,6 +194,18 @@ "addItem": { "message": "वस्तू जोडा" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "पासवर्ड संकेत" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "तिजोरीत शोधा" }, @@ -504,6 +535,9 @@ "notes": { "message": "टिप" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 338d70eaf58..8eae45e6b38 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 37486833e94..75188875b59 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-utfylling" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Legg til en gjenstand" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Passordhint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Søk i hvelvet" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notater" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notat" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Tidsavbrudd i hvelvet" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lås nå" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "2-trinnsinnlogging gjør kontoen din mer sikker, ved å kreve at du verifiserer din innlogging med en annen enhet, f.eks. en autentiseringsapp, SMS, e-post, telefonsamtale, eller sikkerhetsnøkkel. 2-trinnsinnlogging kan aktiveres i netthvelvet ditt på bitwarden.com. Vil du besøke bitwarden.com nå?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Redigerte mappen" }, @@ -892,7 +938,7 @@ "message": "Vis kortelementer på fanesiden for lett auto-utfylling." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Vis identiteter på fanesiden" @@ -1097,6 +1143,9 @@ "file": { "message": "Fil" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Velg en fil." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Lås opp med PIN-kode" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Angi PIN-koden din for å låse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN-kode er påkrevd." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lås med hovedpassordet når du starter nettleseren på nytt" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Du må velge minst én samling." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Handling ved tidsavbrudd i hvelvet" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papirkurv", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontoen eksisterer ikke" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometri ikke aktivert" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Søk i Send-ene", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, @@ -2232,6 +2320,9 @@ "message": "Alle Send-er", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Maksimalt antall tilganger nådd", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send-en vil bli slettet permanent på den angitte dato og klokkeslett.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Utløpsdato" }, @@ -2338,6 +2433,10 @@ "message": "Eventuelt krever et passord for brukere å få tilgang til denne Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notater om denne Send-en.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Skjul min e-postadresse fra mottakere." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "En eller flere av virksomhetens regler påvirker generatorinnstillingene dine." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutter" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Din virksomhets regler påvirker tidsavbruddet for hvelvet ditt. Maksimalt tillatt tidsavbrudd for hvelv er $HOURS$ time(r) og $MINUTES$ minutt(er)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 338d70eaf58..8eae45e6b38 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 435df8ecb4e..3426fa1c62d 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kenteken kopiëren" }, + "copyCustomField": { + "message": "$FIELD$ kopiëren", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Website kopiëren" + }, + "copyNotes": { + "message": "Notities kopiëren" + }, "autoFill": { "message": "Auto-invullen" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Item toevoegen" }, + "accountEmail": { + "message": "E-mailadres van account" + }, + "requestHint": { + "message": "Hint vragen" + }, + "requestPasswordHint": { + "message": "Hoofdwachtwoordhint vragen" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" + }, "passwordHint": { "message": "Wachtwoordhint" }, @@ -462,6 +489,10 @@ "message": "Dubbelzinnige tekens vermijden", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Kluis doorzoeken" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notities" }, + "privateNote": { + "message": "Privénotitie" + }, "note": { "message": "Notitie" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Sessietime-out" }, + "vaultTimeoutHeader": { + "message": "Time-out van de kluis" + }, "otherOptions": { "message": "Andere opties" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Time-out van de kluis" }, + "vaultTimeout1": { + "message": "Time-out" + }, "lockNow": { "message": "Nu vergrendelen" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Tweestapsaanmelding beschermt je account door je inlogpoging te bevestigen met een ander apparaat zoals een beveiligingscode, authenticatie-app, SMS, spraakoproep of e-mail. Je kunt Tweestapsaanmelding inschakelen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?" }, + "twoStepLoginConfirmationContent": { + "message": "Maak je account veiliger met het instellen van tweestapsaanmelding in de Bitwarden-webapp." + }, + "twoStepLoginConfirmationTitle": { + "message": "Doorgaan naar web-app?" + }, "editedFolder": { "message": "Map is bewerkt" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Bestand" }, + "fileToShare": { + "message": "Bestand om te delen" + }, "selectFile": { "message": "Selecteer een bestand." }, @@ -1654,7 +1703,7 @@ "message": "Identiteit" }, "newItemHeader": { - "message": "Nieuw $TYPE$", + "message": "Nieuwe $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Ontgrendelen met PIN" }, + "setYourPinTitle": { + "message": "PIN-code instellen" + }, + "setYourPinButton": { + "message": "PIN-code instellen" + }, "setYourPinCode": { "message": "Stel je PIN-code in voor het ontgrendelen van Bitwarden. Je PIN-code wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie." }, + "setYourPinCode1": { + "message": "Je pincode wordt gebruikt om Bitwarden te ontgrendelen in plaats van je hoofdwachtwoord. Je pincode wordt opnieuw ingesteld als je ooit volledig uitlogt op Bitwarden." + }, "pinRequired": { "message": "PIN-code is vereist." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Vergrendelen met hoofdwachtwoord bij herstart browser" }, + "lockWithMasterPassOnRestart1": { + "message": "Hoofdwachtwoord vereisen bij herstart van browser" + }, "selectOneCollection": { "message": "Je moet tenminste één verzameling selecteren." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Actie bij time-out" }, + "vaultTimeoutAction1": { + "message": "Time-out actie" + }, "lock": { "message": "Vergrendelen", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Prullenbak", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Accounts komt niet overeen" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometrische ontgrendelen mislukt. De biometrische geheime sleutel kon de kluis niet ontgrendelen. Probeer biometrische gegevens opnieuw in te stellen." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometrische sleutel discrepantie" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometrische ontgrendelen mislukt. De biometrische geheime sleutel kon de kluis niet ontgrendelen. Probeer biometrische gegevens opnieuw in te stellen." + }, "biometricsNotEnabledTitle": { "message": "Biometrie niet ingeschakeld" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Uitgesloten domeinwijzigingen opgeslagen" }, + "limitSendViews": { + "message": "Weergaven limiteren" + }, + "limitSendViewsHint": { + "message": "Niemand kan deze Send weergeven als de limiet is bereikt.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ weergaven over", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send-details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sends zoeken", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Te delen tekst" + }, "sendTypeFile": { "message": "Bestand" }, @@ -2232,6 +2320,9 @@ "message": "Alle Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Tekst standaard verbergen" + }, "maxAccessCountReached": { "message": "Maximum aantal keren benaderd", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Deze Send wordt op de aangegeven datum en tijd definitief verwijderd.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Op deze datum wordt de Send definitief verwijderd.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Vervaldatum" }, @@ -2338,6 +2433,10 @@ "message": "Vereis optioneel een wachtwoord voor gebruikers om toegang te krijgen tot deze Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Dit wachtwoord vereisen voor het weergeven van de Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privénotities over deze Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Verberg mijn e-mailadres voor ontvangers." }, + "hideYourEmail": { + "message": "Je e-mailadres voor ontvangers verbergen." + }, "sendOptionsPolicyInEffect": { "message": "Een of meer organisatiebeleidseisen heeft invloed op de mogelijkheden van je Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuten" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Bedrijfsbeleidseisen zijn toegepast op je time-out instellingen" + }, "vaultTimeoutPolicyInEffect": { "message": "Het beleid van je organisatie heeft invloed op de time-out van je kluis. De maximaal toegestane kluis time-out is $HOURS$ uur en $MINUTES$ minuten.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ uur en $MINUTES$ minu(u)t(en) maximaal.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Time-out overschrijdt de beperking van je organisatie: $HOURS$ uur en $MINUTES$ minu(u) t(en) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "De beleidsinstellingen van je organisatie hebben invloed op de time-out van je kluis. De maximale toegestane kluis time-out is $HOURS$ uur en $MINUTES$ minuten. Jouw time-out is ingesteld op $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Bedrijfsbeleidseisen zijn op deze instelling toegepast" }, + "retry": { + "message": "Opnieuw proberen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimale aangepaste time-out is 1 minuut." + }, + "additionalContentAvailable": { + "message": "Extra inhoud beschikbaar" + }, "fileSavedToDevice": { "message": "Bestand op apparaat opgeslagen. Beheer vanaf de downloads op je apparaat." }, diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 338d70eaf58..8eae45e6b38 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 338d70eaf58..8eae45e6b38 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index a99655378e5..0452d2d5db3 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kopiuj numer licencji" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autouzupełnianie" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Dodaj element" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Podpowiedź do hasła" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Szukaj w sejfie" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notatki" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notatka" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Limit czasu sesji" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Pozostałe opcje" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Blokowanie sejfu" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Zablokuj" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Logowanie dwustopniowe sprawia, że konto jest bardziej bezpieczne poprzez wymuszenie potwierdzenia logowania z innego urządzenia, takiego jak z klucza bezpieczeństwa, aplikacji uwierzytelniającej, wiadomości SMS, telefonu lub adresu e-mail. Logowanie dwustopniowe możesz włączyć w sejfie internetowym bitwarden.com. Czy chcesz przejść do tej strony?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder został zapisany" }, @@ -892,7 +938,7 @@ "message": "Pokaż elementy karty na stronie głównej, aby ułatwić autouzupełnianie." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Pokaż tożsamości na stronie głównej" @@ -1097,6 +1143,9 @@ "file": { "message": "Plik" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Wybierz plik" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Odblokuj kodem PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Ustaw kod PIN do odblokowywania aplikacji Bitwarden. Ustawienia odblokowywania kodem PIN zostaną zresetowane po wylogowaniu." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Kod PIN jest wymagany." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Zablokuj hasłem głównym po uruchomieniu przeglądarki" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Musisz wybrać co najmniej jedną kolekcję." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Sposób blokowania sejfu" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Zablokuj", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kosz", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Konto jest niezgodne" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Odblokowanie biometryczne nie powiodło się. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Klucz biometryczny jest niepoprawny" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Odblokowanie biometryczne nie powiodło się. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." + }, "biometricsNotEnabledTitle": { "message": "Dane biometryczne są wyłączone" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Zmiany w wykluczonych domenach zapisane" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Wyślij", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Szukaj w wysyłkach", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Tekst" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Plik" }, @@ -2232,6 +2320,9 @@ "message": "Wszystkie wysyłki", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Maksymalna liczba dostępów została osiągnięta", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Wysyłka zostanie trwale usunięta w określonym czasie.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data wygaśnięcia" }, @@ -2338,6 +2433,10 @@ "message": "Opcjonalne hasło dla użytkownika, aby uzyskać dostęp do wysyłki.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Prywatne notatki o tej wysyłce.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ukryj mój adres e-mail przed odbiorcami." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia wysyłek." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuty" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Zasady organizacji mają wpływ czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min. Twój czas blokowania sejfu to $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index a88aae11814..27f41c9ef29 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copiar número da CNH" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autopreencher" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Adicionar Item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Dica da Senha" }, @@ -462,6 +489,10 @@ "message": "Evitar Caracteres Ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Pesquisar no Cofre" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Tempo limite da sessão" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Outras opções" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Cofre - tempo esgotado" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Bloquear Agora" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "O login de duas etapas torna a sua conta mais segura ao exigir que digite um código de segurança de um aplicativo de autenticação quando for iniciar a sessão. O login de duas etapas pode ser ativado no cofre web bitwarden.com. Deseja visitar o site agora?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Pasta Editada" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Arquivo" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Selecione um arquivo." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Desbloquear com o PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. Suas configurações de PIN serão redefinidas se alguma vez você encerrar completamente toda a sessão do aplicativo." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "O código PIN é necessário." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloquear com senha mestra ao reiniciar o navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Você deve selecionar pelo menos uma coleção." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Ação de Tempo Limite do Cofre" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixeira", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "A conta não confere" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "O desbloqueio biométrico falhou. A chave secreta biométrica não conseguiu desbloquear o cofre. Tente configurar os dados biométricos novamente." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Falta de chave biométrica" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "O desbloqueio biométrico falhou. A chave secreta biométrica não conseguiu desbloquear o cofre. Tente configurar os dados biométricos novamente." + }, "biometricsNotEnabledTitle": { "message": "Biometria não ativada" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Mudanças de domínios excluídos salvas" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Pesquisar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Arquivo" }, @@ -2232,6 +2320,9 @@ "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Número máximo de acessos atingido", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "O Send será eliminado permanentemente na data e hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data de Validade" }, @@ -2338,6 +2433,10 @@ "message": "Exigir opcionalmente uma senha para os usuários acessarem este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notas privadas sobre esse Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ocultar meu endereço de e-mail dos destinatários." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Uma ou mais políticas da organização estão afetando as suas opções de Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. O Tempo Limite Máximo permitido do Cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "As políticas da sua organização estão afetando seu cofre tempo limite. Tempo limite máximo permitido para cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre é definida como $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Os requisitos de política empresarial foram aplicados nesta configuração" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 75026c9d3e0..4c5c63a343c 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copiar número da carta de condução" }, + "copyCustomField": { + "message": "Copiar $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copiar site" + }, + "copyNotes": { + "message": "Copiar notas" + }, "autoFill": { "message": "Preencher automaticamente" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Adicionar item" }, + "accountEmail": { + "message": "E-mail da conta" + }, + "requestHint": { + "message": "Pedir dica" + }, + "requestPasswordHint": { + "message": "Pedir dica da palavra-passe" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-á enviada a sua dica da palavra-passe" + }, "passwordHint": { "message": "Dica da palavra-passe" }, @@ -462,6 +489,10 @@ "message": "Evitar caracteres ambíguos", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Procurar no cofre" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Nota privada" + }, "note": { "message": "Nota" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Tempo limite da sessão" }, + "vaultTimeoutHeader": { + "message": "Tempo limite do cofre" + }, "otherOptions": { "message": "Outras opções" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Tempo limite do cofre" }, + "vaultTimeout1": { + "message": "Tempo limite" + }, "lockNow": { "message": "Bloquear agora" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "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?" }, + "twoStepLoginConfirmationContent": { + "message": "Torne a sua conta mais segura configurando a verificação de dois passos na aplicação Web Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continuar para a aplicação Web?" + }, "editedFolder": { "message": "Pasta guardada" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Ficheiro" }, + "fileToShare": { + "message": "Ficheiro a partilhar" + }, "selectFile": { "message": "Selecionar um ficheiro" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Desbloquear com PIN" }, + "setYourPinTitle": { + "message": "Definir PIN" + }, + "setYourPinButton": { + "message": "Definir PIN" + }, "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. As suas definições de PIN serão redefinidas se alguma vez terminar sessão por completo da aplicação." }, + "setYourPinCode1": { + "message": "O seu PIN será utilizado para desbloquear o Bitwarden em vez da sua palavra-passe mestra. O seu PIN será reposto se alguma vez terminar totalmente a sessão no Bitwarden." + }, "pinRequired": { "message": "É necessário o código PIN." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Bloquear com a palavra-passe mestra ao reiniciar o navegador" }, + "lockWithMasterPassOnRestart1": { + "message": "Exigir a palavra-passe mestra ao reiniciar o navegador" + }, "selectOneCollection": { "message": "Deve selecionar pelo menos uma coleção." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Ação de tempo limite do cofre" }, + "vaultTimeoutAction1": { + "message": "Ação de tempo limite" + }, "lock": { "message": "Bloquear", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Lixo", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Incompatibilidade de contas" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "O desbloqueio biométrico falhou. A chave secreta biométrica não conseguiu desbloquear o cofre. Por favor, tente configurar a biometria novamente." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Incompatibilidade da chave biométrica" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "O desbloqueio biométrico falhou. A chave secreta biométrica não conseguiu desbloquear o cofre. Por favor, tente configurar a biometria novamente." + }, "biometricsNotEnabledTitle": { "message": "Biometria não configurada" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Alterações do domínio excluído guardadas" }, + "limitSendViews": { + "message": "Limitar visualizações" + }, + "limitSendViewsHint": { + "message": "Ninguém poderá ver este Send depois de o limite ser atingido.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ visualizações restantes", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Detalhes do Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Procurar Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Texto" }, + "sendTypeTextToShare": { + "message": "Texto a partilhar" + }, "sendTypeFile": { "message": "Ficheiro" }, @@ -2232,6 +2320,9 @@ "message": "Todos os Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Ocultar texto por predefinição" + }, "maxAccessCountReached": { "message": "Número máximo de acessos atingido", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "O Send será permanentemente eliminado na data e hora especificadas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "O Send será permanentemente eliminado nesta data.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Prazo de validade" }, @@ -2338,6 +2433,10 @@ "message": "Opcionalmente, exigir uma palavra-passe para os utilizadores acederem a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Esta palavra-passe é necessária para visualizar o Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Notas privadas sobre este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ocultar o meu endereço de e-mail dos destinatários." }, + "hideYourEmail": { + "message": "Oculte o seu endereço de e-mail dos visualizadores." + }, "sendOptionsPolicyInEffect": { "message": "Uma ou mais políticas da organização estão a afetar as suas opções do Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutos" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Os requisitos da política empresarial foram aplicados às suas opções de tempo limite" + }, "vaultTimeoutPolicyInEffect": { "message": "As políticas da sua organização definiram o tempo limite máximo permitido do cofre de $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hora(s) e $MINUTES$ minuto(s) no máximo.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "O tempo limite excede a restrição definida pela sua organização: $HOURS$ hora(s) e $MINUTES$ minuto(s) no máximo", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "As políticas da sua organização estão a afetar o tempo limite do cofre. O tempo limite máximo permitido do cofre é de $HOURS$ hora(s) e $MINUTES$ minuto(s). A sua ação de tempo limite do cofre está definida para $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Os requisitos da política empresarial foram aplicados a esta definição" }, + "retry": { + "message": "Tentar novamente" + }, + "vaultCustomTimeoutMinimum": { + "message": "O tempo limite mínimo personalizado é de 1 minuto." + }, + "additionalContentAvailable": { + "message": "Estão disponíveis conteúdos adicionais" + }, "fileSavedToDevice": { "message": "Ficheiro guardado no dispositivo. Gira-o a partir das transferências do seu dispositivo." }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 989f5e1b2ee..6d5dfa9e24c 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copiați numărul de licență" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Auto-completare" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Adăugare articol" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Indiciu parolă" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Căutare în seif" }, @@ -504,6 +535,9 @@ "notes": { "message": "Note" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notă" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Expirarea sesiunii" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Alte opțiuni" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Expirare seif" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Blocare imediată" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Autentificarea în două etape vă face contul mai sigur, prin solicitarea unei verificări de autentificare cu un alt dispozitiv, cum ar fi o cheie de securitate, o aplicație de autentificare, un SMS, un apel telefonic sau un e-mail. Autentificarea în două etape poate fi configurată în seiful web bitwarden.com. Doriți să vizitați site-ul web acum?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Dosar salvat" }, @@ -892,7 +938,7 @@ "message": "Listați elementele cardului pe pagina Filă pentru a facilita completarea automată." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Afișați identitățile pe pagina Filă" @@ -1097,6 +1143,9 @@ "file": { "message": "Fișier" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Selectare fișier" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Deblocare cu codul PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Stabiliți codul PIN de deblocare Bitwarden. Setările codului PIN vor fi reinițializate dacă vă deconectați vreodată din aplicație." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Codul PIN este necesar." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Blocare cu parola principală la repornirea browserului" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Trebuie să selectați cel puțin o colecție." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Acțiune la expirarea seifului" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Blocare", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Coș de reciclare", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Eroare de cont" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Datele biometrice nu sunt configurate" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Căutare Send-uri", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fișier" }, @@ -2232,6 +2320,9 @@ "message": "Toate Send-urile", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "S-a atins numărul maxim de accesări", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send-ul va fi șters definitiv la data și ora specificate.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Data expirării" }, @@ -2338,6 +2433,10 @@ "message": "Opțional, este necesară o parolă pentru ca utilizatorii să acceseze acest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Note private despre acest Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ascundeți adresa mea de e-mail de la destinatari." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Una sau mai multe politici organizaționale vă afectează opțiunile Send-ului." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minute" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Politicile organizației dvs. au stabilit timpul maxim de expirare permis pentru seif la $HOURS$ oră/ore și $MINUTES$ de minut(e).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Politicile organizației dvs. afectează timpul de expirare al seifului. Timpul maxim de așteptare permis pentru seif este de $HOURS$ oră(e) și $MINUTES$ minut(e). Acțiunea de temporizare a seifului este setată la $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 31d419aea60..829cd56b6f5 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Скопировать номер лицензии" }, + "copyCustomField": { + "message": "Скопировать $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Скопировать сайт" + }, + "copyNotes": { + "message": "Скопировать заметки" + }, "autoFill": { "message": "Автозаполнение" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Добавить элемент" }, + "accountEmail": { + "message": "Email аккаунта" + }, + "requestHint": { + "message": "Запросить подсказку" + }, + "requestPasswordHint": { + "message": "Запросить подсказку к паролю" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Введите email вашего аккаунта, и вам будет отправлена подсказка для пароля" + }, "passwordHint": { "message": "Подсказка к паролю" }, @@ -462,6 +489,10 @@ "message": "Избегать неоднозначных символов", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Поиск в хранилище" }, @@ -504,6 +535,9 @@ "notes": { "message": "Заметки" }, + "privateNote": { + "message": "Приватная заметка" + }, "note": { "message": "Заметка" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Тайм-аут сессии" }, + "vaultTimeoutHeader": { + "message": "Тайм-аут хранилища" + }, "otherOptions": { "message": "Прочие настройки" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Тайм-аут хранилища" }, + "vaultTimeout1": { + "message": "Тайм-аут" + }, "lockNow": { "message": "Заблокировать" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Двухэтапная аутентификация делает аккаунт более защищенным, поскольку требуется подтверждение входа при помощи другого устройства, например, ключа безопасности, приложения-аутентификатора, SMS, телефонного звонка или электронной почты. Двухэтапная аутентификация включается на bitwarden.com. Перейти на сайт сейчас?" }, + "twoStepLoginConfirmationContent": { + "message": "Сделайте ваш аккаунт более защищенным, настроив двухэтапную аутентификацию в веб-приложении Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Перейти к веб-приложению?" + }, "editedFolder": { "message": "Папка сохранена" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Файл" }, + "fileToShare": { + "message": "Файл для отправки" + }, "selectFile": { "message": "Выбрать файл" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Разблокировать с помощью PIN-кода" }, + "setYourPinTitle": { + "message": "Установка PIN" + }, + "setYourPinButton": { + "message": "Задать PIN-код" + }, "setYourPinCode": { "message": "Установите PIN-код для разблокировки Bitwarden. Настройки PIN-кода будут сброшены, если вы когда-либо полностью выйдете из приложения." }, + "setYourPinCode1": { + "message": "Ваш PIN-код будет использоваться для разблокировки Bitwarden вместо мастер-пароля. PIN-код будет сброшен, если вы выйдете из Bitwarden." + }, "pinRequired": { "message": "Необходим PIN-код." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Блокировать мастер-паролем при перезапуске браузера" }, + "lockWithMasterPassOnRestart1": { + "message": "Требовать мастер-пароль при перезапуске браузера" + }, "selectOneCollection": { "message": "Необходимо выбрать хотя бы одну коллекцию." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Действие по тайм-ауту хранилища" }, + "vaultTimeoutAction1": { + "message": "Тайм-аут действия" + }, "lock": { "message": "Блокировка", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Корзина", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Несоответствие аккаунта" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Биометрическая разблокировка не удалась. Биометрический секретный ключ не смог разблокировать хранилище. Пожалуйста, попробуйте настроить биометрию еще раз." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Несовпадение биометрического ключа" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Биометрическая разблокировка не удалась. Биометрический секретный ключ не смог разблокировать хранилище. Пожалуйста, попробуйте настроить биометрию еще раз." + }, "biometricsNotEnabledTitle": { "message": "Биометрия не настроена" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Изменения в исключенном домене сохранены" }, + "limitSendViews": { + "message": "Лимит просмотров" + }, + "limitSendViewsHint": { + "message": "Никто не сможет просмотреть эту Send после лимита просмотров.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Осталось просмотров: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Информация о Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Поиск Send’ов", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Текст" }, + "sendTypeTextToShare": { + "message": "Текст для отправки" + }, "sendTypeFile": { "message": "Файл" }, @@ -2232,6 +2320,9 @@ "message": "Все Send’ы", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Скрыть текст по умолчанию" + }, "maxAccessCountReached": { "message": "Достигнут максимум обращений", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Эта Send будет окончательно удалена в указанные дату и время.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "С этой даты Send будет удалена навсегда.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Дата истечения" }, @@ -2338,6 +2433,10 @@ "message": "По возможности запрашивать у пользователей пароль для доступа к этой Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Требовать этот пароль для просмотра Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Личные заметки об этой Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Скрыть мой адрес email от получателей." }, + "hideYourEmail": { + "message": "Скрыть ваш email от просматривающих." + }, "sendOptionsPolicyInEffect": { "message": "На параметры Send влияют одна или несколько политик организации." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Мин." }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "К настройкам тайм-аута были применены требования корпоративной политики" + }, "vaultTimeoutPolicyInEffect": { "message": "В соответствии с политиками вашей организации максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Максимум $HOURS$ час. $MINUTES$ мин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Время ожидания превышает установленное организацией максимальное ограничение: $HOURS$ час. $MINUTES$ мин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин. Для вашего хранилища задан тайм-аут $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "К этой настройке были применены требования корпоративной политики" }, + "retry": { + "message": "Повторить" + }, + "vaultCustomTimeoutMinimum": { + "message": "Минимальный пользовательский тайм-аут составляет 1 минуту." + }, + "additionalContentAvailable": { + "message": "Дополнительный контент доступен" + }, "fileSavedToDevice": { "message": "Файл сохранен на устройстве. Управляйте им из загрузок устройства." }, diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 3b47e77a5bd..36094f55103 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "ස්වයං-පිරවීම" }, @@ -179,6 +194,18 @@ "addItem": { "message": "අයිතමය එකතු කරන්න" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "මුරපදය ඉඟිය" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "සුරක්ෂිතාගාරය සොයන්න" }, @@ -504,6 +535,9 @@ "notes": { "message": "සටහන්" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "සටහන" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "සුරක්ෂිතාගාරය වේලාව" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "දැන් අගුලුදමන්න" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "ආරක්ෂක යතුරක්, සත්යාපන යෙදුම, කෙටි පණිවුඩ, දුරකථන ඇමතුමක් හෝ විද්යුත් තැපෑල වැනි වෙනත් උපාංගයක් සමඟ ඔබේ පිවිසුම සත්යාපනය කිරීමට ඔබට අවශ්ය වීමෙන් ද්වි-පියවර පිවිසුම ඔබගේ ගිණුම වඩාත් සුරක්ෂිත කරයි. බිට්වොන්.com වෙබ් සුරක්ෂිතාගාරයේ ද්වි-පියවර පිවිසුම සක්රීය කළ හැකිය. ඔබට දැන් වෙබ් අඩවියට පිවිසීමට අවශ්යද?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "සංස්කරණය ෆෝල්ඩරය" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "ගොනුව" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "ගොනුවක් තෝරන්න." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "PIN අංකය සමඟ විවෘත" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "බිට්වර්ඩන් අගුළු ඇරීමට ඔබේ PIN අංකය කේතය සකසන්න. ඔබ කවදා හෝ යෙදුමෙන් සම්පූර්ණයෙන්ම පුරනය වී ඇත්නම් ඔබගේ PIN සැකසුම් නැවත සකසනු ඇත." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN කේතය අවශ්ය වේ." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "බ්රව්සරය නැවත ආරම්භ මත ප්රධාන මුරපදය සමග අගුළු" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "ඔබ අවම වශයෙන් එක් එකතුවක්වත් තෝරා ගත යුතුය." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "සුරක්ෂිතාගාරය කාලය ක්රියාකාරී" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "අගුල", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "කුණු කූඩයට", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "ගිණුම මිස්ගැලච්" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "ජීව විද්යාව සක්රීය කර නැත" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "යවන්න", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "සෙවුම් යවයි", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "පෙළ" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ගොනුව" }, @@ -2232,6 +2320,9 @@ "message": "සියලු යවයි", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "මැක්ස් ප්රවේශ ගණන ළඟා", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "නියම කරන ලද දිනය හා වේලාව මත Send ස්ථිරවම මකා දමනු ලැබේ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "කල් ඉකුත්වන දිනය" }, @@ -2338,6 +2433,10 @@ "message": "විකල්පයක් ලෙස පරිශීලකයින්ට මෙම යවන්න වෙත ප්රවේශ වීමට මුරපදයක් අවශ්ය වේ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "මේ ගැන පෞද්ගලික සටහන් යවන්න.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "ලබන්නන්ගෙන් මගේ විද්යුත් තැපැල් ලිපිනය සඟවන්න." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "සංවිධාන ප්රතිපත්ති එකක් හෝ කිහිපයක් ඔබගේ Send විකල්පයන්ට බලපායි." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "විනාඩි" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "ඔබේ සංවිධාන ප්රතිපත්ති ඔබගේ සුරක්ෂිතාගාරය කාලය කෙරෙහි බලපායි. උපරිම අවසර ලත් සුරක්ෂිතාගාරය කාලය පැය $HOURS$ (ය) සහ විනාඩි $MINUTES$ (ය)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index c3135bb9fec..3faaa066934 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -50,7 +50,7 @@ "message": "Nápoveda k hlavnému heslu vám môže pomôcť spomenúť si na heslo, ak ho zabudnete." }, "masterPassHintText": { - "message": "Ak zabudnete heslo, na váš e-mail vám môže zaslať pomôcku k heslu. Zadaných $CURRENT$ znakov, limit je $MAXIMUM$.", + "message": "Ak zabudnete heslo, na váš e-mail vám môže zaslať nápoveď k heslu. Zadaných $CURRENT$ znakov, limit je $MAXIMUM$.", "placeholders": { "current": { "content": "$1", @@ -66,7 +66,7 @@ "message": "Znovu zadajte hlavné heslo" }, "masterPassHint": { - "message": "Nápoveda k hlavnému heslu (voliteľné)" + "message": "Nápoveď k hlavnému heslu (voliteľné)" }, "joinOrganization": { "message": "Pripojte sa k organizácii" @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Kopírovať číslo licencie" }, + "copyCustomField": { + "message": "Kopírovať $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopírovať webstránku" + }, + "copyNotes": { + "message": "Kopírovať poznámky" + }, "autoFill": { "message": "Automatické vypĺňanie" }, @@ -179,14 +194,26 @@ "addItem": { "message": "Pridať položku" }, + "accountEmail": { + "message": "E-mail účtu" + }, + "requestHint": { + "message": "Požiadať o nápoveď" + }, + "requestPasswordHint": { + "message": "Požiadať o nápoveď k heslu" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Zadajte e-mailovú adresu účtu a zašleme vám nápoveď k heslu" + }, "passwordHint": { - "message": "Pomôcka pre heslo" + "message": "Nápoveď k heslu" }, "enterEmailToGetHint": { - "message": "Zadajte emailovú adresu na zaslanie nápovedy pre vaše hlavné heslo." + "message": "Zadajte emailovú adresu na zaslanie nápovede pre vaše hlavné heslo." }, "getMasterPasswordHint": { - "message": "Získať pomôcku pre hlavné heslo" + "message": "Získať nápoveď k hlavnému heslu" }, "continue": { "message": "Pokračovať" @@ -462,6 +489,10 @@ "message": "Vyhnúť sa zameniteľným znakom", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Prehľadávať trezor" }, @@ -504,6 +535,9 @@ "notes": { "message": "Poznámky" }, + "privateNote": { + "message": "Súkromná poznámka" + }, "note": { "message": "Poznámka" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Časový limit relácie" }, + "vaultTimeoutHeader": { + "message": "Časový limit pre trezor" + }, "otherOptions": { "message": "Ďalšie možnosti" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Časový limit pre trezor" }, + "vaultTimeout1": { + "message": "Časový limit" + }, "lockNow": { "message": "Uzamknúť teraz" }, @@ -650,7 +690,7 @@ "message": "Vaše hlavné heslo sa nebude dať obnoviť, ak ho zabudnete!" }, "masterPassHintLabel": { - "message": "Nápoveda pre hlavné heslo" + "message": "Nápoveď k hlavnému heslu" }, "errorOccurred": { "message": "Vyskytla sa chyba" @@ -696,7 +736,7 @@ "message": "Toto okno môžete zavrieť" }, "masterPassSent": { - "message": "Poslali sme vám email s nápovedou k hlavnému heslu." + "message": "Poslali sme vám email s nápoveďou k hlavnému heslu." }, "verificationCodeRequired": { "message": "Overovací kód je povinný." @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Dvojstupňové prihlasovanie robí váš účet bezpečnejším vďaka vyžadovaniu bezpečnostného kódu z overovacej aplikácie vždy, keď sa prihlásite. Dvojstupňové prihlasovanie môžete povoliť vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?" }, + "twoStepLoginConfirmationContent": { + "message": "Zabezpečte svoj účet nastavením dvojstupňového prihlasovania vo webovej aplikácii Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Pokračovať vo webovej aplikácii?" + }, "editedFolder": { "message": "Priečinok upravený" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Súbor" }, + "fileToShare": { + "message": "Súbor, ktorý chcete zdieľať" + }, "selectFile": { "message": "Vyberte súbor" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Odomknúť s PIN" }, + "setYourPinTitle": { + "message": "Nastaviť PIN" + }, + "setYourPinButton": { + "message": "Nastaviť PIN" + }, "setYourPinCode": { "message": "Nastaviť kód PIN na odomykanie Bitwardenu. Nastavenie PIN sa vynuluje, ak sa úplne odhlásite z aplikácie." }, + "setYourPinCode1": { + "message": "Na odomknutie Bitwardenu sa namiesto hlavného hesla použije váš PIN. Váš PIN sa resetuje, ak sa niekedy úplne odhlásite zo Bitwardenu." + }, "pinRequired": { "message": "Kód PIN je povinný." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Pri reštarte prehliadača zamknúť s hlavným heslom" }, + "lockWithMasterPassOnRestart1": { + "message": "Pri reštarte prehliadača vyžadovať hlavné heslo" + }, "selectOneCollection": { "message": "Musíte vybrať aspoň jednu zbierku." }, @@ -1923,11 +1984,14 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultTimeoutAction": { - "message": "Akcia pri vypršaní času pre trezor" + "message": "Akcia pri vypršaní časového limitu pre trezor" + }, + "vaultTimeoutAction1": { + "message": "Akcia pri vypršaní časového limitu" }, "lock": { "message": "Uzamknúť", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Kôš", @@ -1958,7 +2022,7 @@ "message": "Odhlásenie bude vyžadovať online prihlásenie po vypršaní časového limitu. Naozaj chcete použiť toto nastavenie?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Potvrdenie akcie pre vypršaný časový limit" + "message": "Potvrdenie akcie pri vypršaní časového limitu" }, "autoFillAndSave": { "message": "Auto-vyplniť a Uložiť" @@ -2072,7 +2136,7 @@ "message": "Zásady ochrany osobných údajov" }, "hintEqualsPassword": { - "message": "Nápoveda pre heslo nemôže byť rovnaká ako heslo." + "message": "Nápoveď k heslu nemôže byť rovnaká ako heslo." }, "ok": { "message": "Ok" @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Nezhoda účtu" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Odomknutie biometrickými údajmi zlyhalo. Tajný kľúč biometrických údajov nedokázal odomknúť trezor. Skúste biometrické údaje nastaviť znova." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Kľúč biometrických údajov sa nezhoduje" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Odomknutie biometrickými údajmi zlyhalo. Tajný kľúč biometrických údajov nedokázal odomknúť trezor. Skúste biometrické údaje nastaviť znova." + }, "biometricsNotEnabledTitle": { "message": "Biometria nie je povolená" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Uložené zmeny vylúčenej domény" }, + "limitSendViews": { + "message": "Obmedziť zobrazenia" + }, + "limitSendViewsHint": { + "message": "Po dosiahnutí limitu si tento Send nemôže nikto zobraziť.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Zostávajúci počet zobrazení: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Podrobnosti o Sende", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Hľadať Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text, ktorý chcete zdieľať" + }, "sendTypeFile": { "message": "Súbor" }, @@ -2232,6 +2320,9 @@ "message": "Všetky Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "V predvolenom nastavení skryť text" + }, "maxAccessCountReached": { "message": "Bol dosiahnutý maximálny počet prístupov", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Send bude natrvalo odstránený v zadaný dátum a čas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send bude natrvalo odstránený v tento deň.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Dátum exspirácie" }, @@ -2338,6 +2433,10 @@ "message": "Voliteľne môžete vyžadovať heslo pre používateľov na prístup k tomuto Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Na zobrazenie tohto Sendu vyžadovať toto heslo.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Zabezpečená poznámka o tomto Sende.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Skryť moju emailovú adresu pred príjemcami." }, + "hideYourEmail": { + "message": "Skryť moju e-mailovú adresu pri zobrazení." + }, "sendOptionsPolicyInEffect": { "message": "Jedno alebo viac pravidiel organizácie ovplyvňujú vaše možnosti funkcie Send." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minúty" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Na možnosti pri vypršaní časového limitu boli uplatnené požiadavky pravidiel spoločnosti" + }, "vaultTimeoutPolicyInEffect": { "message": "Zásady vašej organizácie ovplyvňujú časový limit trezoru. Maximálny povolený časový limit trezoru je $HOURS$ h a $MINUTES$ m", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Maximálne $HOURS$ hod. a $MINUTES$ min.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Časový limit prekračuje obmedzenie nastavené vašou organizáciou: maximálne $HOURS$ hod. a $MINUTES$ min.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Zásady vašej organizácie ovplyvňujú časový limit trezoru. Maximálny povolený časový limit trezoru je $HOURS$ h a $MINUTES$ min. Nastavenie akcie pri vypršaní časového limitu je $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Na toto nastavenie boli uplatnené požiadavky pravidiel spoločnosti" }, + "retry": { + "message": "Znova" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimálny vlastný časový limit je 1 minúta." + }, + "additionalContentAvailable": { + "message": "K dispozícii je ďalší obsah" + }, "fileSavedToDevice": { "message": "Súbor sa uložil do zariadenia. Spravujte stiahnuté súbory zo zariadenia." }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index a9665d631af..11205385d2b 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Samodejno izpolnjevanje" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Dodaj element" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Namig za geslo" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Išči v trezorju" }, @@ -504,6 +535,9 @@ "notes": { "message": "Opombe" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Opomba" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Zakleni trezor, ko preteče toliko časa:" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Zakleni zdaj" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Avtentikacija v dveh korakih dodatno varuje vaš račun, saj zahteva, da vsakokratno prijavo potrdite z drugo napravo, kot je varnostni ključ, aplikacija za preverjanje pristnosti, SMS, telefonski klic ali e-pošta. Avtentikacijo v dveh korakih lahko omogočite v spletnem trezorju bitwarden.com. Ali želite spletno stran obiskati sedaj?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Mapa shranjena" }, @@ -892,7 +938,7 @@ "message": "Na strani Zavihek prikaži kartice za lažje samodejno izpoljnjevanje." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Prikaži identitete na strani Zavihek" @@ -1097,6 +1143,9 @@ "file": { "message": "Datoteka" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Izberite datoteko." }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Odkleni s PIN-kodo" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Za odklep Bitwardna si nastavite PIN-kodo. PIN-koda bo ponastavljena, če se boste popolnoma odjavili iz aplikacije." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Potrebna je PIN-koda." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Zakleni z glavnim geslom ob ponovnem zagonu brskalnika" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Izbrati morate vsaj eno zbirko." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Dejanje ob poteku roka" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Zaklepanje", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Koš", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Išči pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Besedilo" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Datoteka" }, @@ -2232,6 +2320,9 @@ "message": "Vse pošiljke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Pošiljka bo trajno izbrisana ob izbranem času.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Datum poteka" }, @@ -2338,6 +2433,10 @@ "message": "Za dostop do te pošiljke lahko nastavite geslo.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Zasebni zapiski o tej pošiljki.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Skrij moj e-naslov pred prejemniki." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Nekatere nastavitve organizacije vplivajo na možnosti, ki jih imate v zvezi s pošiljkami." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minut" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index c9d37830153..f36038e0518 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Копирај број лиценце" }, + "copyCustomField": { + "message": "Копирати $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Копирати вебсајт" + }, + "copyNotes": { + "message": "Копирати белешке" + }, "autoFill": { "message": "Аутоматско допуњавање" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Додај ставку" }, + "accountEmail": { + "message": "Имејл налога" + }, + "requestHint": { + "message": "Захтевај савет" + }, + "requestPasswordHint": { + "message": "Затражити савет лозинке" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Унесите имејл свог налога и биће вам послат савет за лозинку" + }, "passwordHint": { "message": "Савет лозинке" }, @@ -462,6 +489,10 @@ "message": "Избегавај двосмислене карактере", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Претражи сеф" }, @@ -504,6 +535,9 @@ "notes": { "message": "Белешке" }, + "privateNote": { + "message": "Приватна белешка" + }, "note": { "message": "Белешка" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Истек сесије" }, + "vaultTimeoutHeader": { + "message": "Тајмаут сефа" + }, "otherOptions": { "message": "Остале опције" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Тајмаут сефа" }, + "vaultTimeout1": { + "message": "Тајмаут" + }, "lockNow": { "message": "Закључај одмах" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Пријава у два корака чини ваш налог сигурнијим захтевом да верификујете своје податке помоћу другог уређаја, као што су безбедносни кључ, апликација, СМС-а, телефонски позив или имејл. Пријављивање у два корака може се омогућити на веб сефу. Да ли желите да посетите веб страницу сада?" }, + "twoStepLoginConfirmationContent": { + "message": "Учините свој налог сигурнијим подешавањем пријаве у два корака у Bitwarden веб апликацији." + }, + "twoStepLoginConfirmationTitle": { + "message": "Ићи на веб апликацију?" + }, "editedFolder": { "message": "Фасцикла измењена" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Датотека" }, + "fileToShare": { + "message": "Датотека за дељење" + }, "selectFile": { "message": "Изабери датотеку." }, @@ -1797,13 +1846,13 @@ "message": "Нема лозинки у листи." }, "clearHistory": { - "message": "Clear history" + "message": "Обриши историју" }, "noPasswordsToShow": { - "message": "No passwords to show" + "message": "Нема лозинке за приказ" }, "noRecentlyGeneratedPassword": { - "message": "You haven't generated a password recently" + "message": "Нисте недавно генерисали лозинку" }, "remove": { "message": "Уклони" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Откључај са ПИН" }, + "setYourPinTitle": { + "message": "Поставите PIN" + }, + "setYourPinButton": { + "message": "Поставите PIN" + }, "setYourPinCode": { "message": "Поставите свој ПИН код за откључавање Bitwarden-а. Поставке ПИН-а ће се ресетовати ако се икада потпуно одјавите из апликације." }, + "setYourPinCode1": { + "message": "Ваш ПИН ће се користити за откључавање Bitwarden-а уместо ваше главне лозинке. Ваш ПИН ће се ресетовати ако се икада потпуно одјавите са Bitwarden-а." + }, "pinRequired": { "message": "ПИН је обавезан." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Закључајте са главном лозинком при поновном покретању прегледача" }, + "lockWithMasterPassOnRestart1": { + "message": "Потражити главну лозинку при поновном покретању прегледача" + }, "selectOneCollection": { "message": "Морате одабрати макар једну колекцију." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Акција на тајмаут сефа" }, + "vaultTimeoutAction1": { + "message": "Акција тајмаута" + }, "lock": { "message": "Закључај", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Отпад", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Неподударање налога" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Биометријско откључавање није успело. Биометријски тајни кључ није успео да откључа сеф. Покушајте поново да подесите биометрију." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Неподударање биометријског кључа" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Биометријско откључавање није успело. Биометријски тајни кључ није успео да откључа сеф. Покушајте поново да подесите биометрију." + }, "biometricsNotEnabledTitle": { "message": "Биометрија није омогућена" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Изузете промене домена су сачуване" }, + "limitSendViews": { + "message": "Ограничити приказе" + }, + "limitSendViewsHint": { + "message": "Нико не може да види ово Send након што се достигне ограничење.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Осталих прегледа: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Детаљи Send-а", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Тражи „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Текст" }, + "sendTypeTextToShare": { + "message": "Текст за дељење" + }, "sendTypeFile": { "message": "Датотека" }, @@ -2232,6 +2320,9 @@ "message": "Све „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Сакриј текст подразумевано" + }, "maxAccessCountReached": { "message": "Достигнут максималан број приступа", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "„Send“ ће бити трајно избрисан наведеног датума и времена.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Send ће бити трајно обрисано у наведени датум.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Рок употребе" }, @@ -2338,6 +2433,10 @@ "message": "Опционално захтевајте лозинку за приступ корисницима „Send“-у.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Захтева ову лозинку за преглед Send-а.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Приватне белешке о овом „Send“.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Сакриј моју е-адресу од примаоца." }, + "hideYourEmail": { + "message": "Сакријте свој имејл од гледалаца." + }, "sendOptionsPolicyInEffect": { "message": "Једна или више смерница организације утичу на опције „Send“-а." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Минута" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Захтеви политике предузећа су примењени на опције тајмаута" + }, "vaultTimeoutPolicyInEffect": { "message": "Полиса ваше организације утиче на време истека сефа. Максимално дозвољено време истека је $HOURS$ сат(и) и $MINUTES$ minut(а)", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "Макимум $HOURS$ сат(а) и $MINUTES$ минут(а).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Тајмаут је већи него што је решила организација: макимум $HOURS$ сат(а) и $MINUTES$ минут(а)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Смернице ваше организације утичу на временско ограничење сефа. Максимално дозвољено ограничење сефа је $HOURS$ сат(и) и $MINUTES$ минут(а). Ваша радња временског ограничења сефа је подешена на $ACTION$.", "placeholders": { @@ -4309,14 +4440,23 @@ "enterprisePolicyRequirementsApplied": { "message": "Захтеви политике предузећа су примењени на ово подешавање" }, + "retry": { + "message": "Пробај поново" + }, + "vaultCustomTimeoutMinimum": { + "message": "Минимално прилагођено временско ограничење је 1 минут." + }, + "additionalContentAvailable": { + "message": "Додатни садржај је доступан" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, "showCharacterCount": { - "message": "Show character count" + "message": "Прикажи бројање слова" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Сакриј бројање слова" }, "itemsInTrash": { "message": "Ставке у смећу" diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 8f8d34f8bad..4f0a1cb1ffb 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Kopiera $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Kopiera webbplats" + }, + "copyNotes": { + "message": "Kopiera anteckningar" + }, "autoFill": { "message": "Fyll i automatiskt" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Lägg till objekt" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Begär ledtråd" + }, + "requestPasswordHint": { + "message": "Begär lösenordsledtråd" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Lösenordsledtråd" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Sök i valvet" }, @@ -504,6 +535,9 @@ "notes": { "message": "Anteckningar" }, + "privateNote": { + "message": "Privat anteckning" + }, "note": { "message": "Anteckning" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Andra alternativ" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Valvets tidsgräns" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lås nu" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Tvåstegsverifiering gör ditt konto säkrare genom att kräva att du verifierar din inloggning med en annan enhet, t.ex. en säkerhetsnyckel, autentiseringsapp, SMS, telefonsamtal eller e-post. Tvåstegsverifiering kan aktiveras i Bitwardens webbvalv. Vill du besöka webbplatsen nu?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Mapp sparad" }, @@ -892,7 +938,7 @@ "message": "Lista kortobjekt på fliksidan för enkel automatisk fyllning." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Visa identiteter på fliksidan" @@ -1097,6 +1143,9 @@ "file": { "message": "Fil" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Välj en fil" }, @@ -1131,7 +1180,7 @@ "message": "1 GB lagring av krypterade filer." }, "premiumSignUpEmergency": { - "message": "Nödåtkomst" + "message": "Nödåtkomst." }, "premiumSignUpTwoStepOptions": { "message": "Premium-alternativ för tvåstegsverifiering, såsom YubiKey och Duo." @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Lås upp med PIN-kod" }, + "setYourPinTitle": { + "message": "Ställ in PIN-kod" + }, + "setYourPinButton": { + "message": "Ställ in PIN-kod" + }, "setYourPinCode": { "message": "Ange en PIN-kod för att låsa upp Bitwarden. Dina PIN-inställningar återställs om du någonsin loggar ut helt från programmet." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN-kod krävs." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lås med huvudlösenordet vid omstart av webbläsaren" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Du måste markera minst en samling." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Åtgärd när valvets tidsgräns överskrids" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lås", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Papperskorg", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Kontoavvikelse" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometri är inte aktiverat" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Sök bland Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, @@ -2232,6 +2320,9 @@ "message": "Alla Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Det maximala antalet åtkomster har uppnåtts", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Denna Send kommer att raderas permanent på angivet datum och klockslag.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Utgångsdatum" }, @@ -2338,6 +2433,10 @@ "message": "Kräv valfritt ett lösenord för att användare ska komma åt denna Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Privata anteckningar om denna Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Dölj min e-postadress för mottagare." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "En eller flera organisationsriktlinjer påverkar dina Send-inställningar." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minuter" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Dina organisationsprinciper påverkar ditt valvs tid för timeout. Maximal tillåten tid innan timeout är $HOURS$ timmar och $MINUTES$ minuter", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -3273,7 +3404,7 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "Ny inloggning", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { @@ -3281,7 +3412,7 @@ "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { - "message": "New card", + "message": "Nytt kort", "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { @@ -3289,7 +3420,7 @@ "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { - "message": "New identity", + "message": "Ny identitet", "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { @@ -3475,7 +3606,7 @@ "message": "Vault data exported" }, "typePasskey": { - "message": "Lösennyckel" + "message": "Nyckel" }, "passkeyNotCopied": { "message": "Lösennyckeln kommer inte kopieras" @@ -3487,7 +3618,7 @@ "message": "Verifiering krävs av den initierande webbplatsen. Denna funktion är ännu inte implementerad för konton utan huvudlösenord." }, "logInWithPasskeyQuestion": { - "message": "Log in with passkey?" + "message": "Logga in med nyckel?" }, "passkeyAlreadyExists": { "message": "En lösennyckel finns redan för detta program." @@ -3505,10 +3636,10 @@ "message": "Bekräfta" }, "savePasskey": { - "message": "Spara lösennyckel" + "message": "Spara nyckel" }, "savePasskeyNewLogin": { - "message": "Spara lösennyckel som ny inloggning" + "message": "Spara nyckel som ny inloggning" }, "chooseCipherForPasskeySave": { "message": "Choose a login to save this passkey to" @@ -3912,7 +4043,7 @@ "message": "Ytterligare information" }, "itemHistory": { - "message": "Item history" + "message": "Objekthistorik" }, "lastEdited": { "message": "Last edited" @@ -4080,7 +4211,7 @@ "message": "Data" }, "passkeys": { - "message": "Passkeys", + "message": "Nycklar", "description": "A section header for a list of passkeys." }, "passwords": { @@ -4088,7 +4219,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Logga in med nyckel", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4304,11 +4435,20 @@ "message": "Show number of login autofill suggestions on extension icon" }, "systemDefault": { - "message": "System default" + "message": "Systemstandard" }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Försök igen" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 338d70eaf58..8eae45e6b38 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Autofill" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Add item" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Password hint" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Search vault" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -892,7 +938,7 @@ "message": "List card items on the Tab page for easy autofill." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "Show identities on Tab page" @@ -1097,6 +1143,9 @@ "file": { "message": "File" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Select a file" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Trash", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Search Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Text" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, @@ -2232,6 +2320,9 @@ "message": "All Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 0edcb1c9f81..baa8babb5ef 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "กรอกข้อมูลอัตโนมัติ" }, @@ -179,6 +194,18 @@ "addItem": { "message": "เพิ่มรายการ" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "คำใบ้รหัสผ่าน" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "ค้นหาในตู้นิรภัย" }, @@ -504,6 +535,9 @@ "notes": { "message": "โน้ต" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "โน้ต" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "ระยะเวลาล็อกตู้เซฟ" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock Now" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Two-step login makes your account more secure by requiring you to enter a security code from an authenticator app whenever you log in. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Edited Folder" }, @@ -892,7 +938,7 @@ "message": "บัตรรายการในหน้าแท็บเพื่อให้ป้อนอัตโนมัติได้ง่าย" }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "แสดงตัวตนบนหน้าแท็บ" @@ -1097,6 +1143,9 @@ "file": { "message": "ไฟล์" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "เลือกไฟล์" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "ปลดล็อกด้วย PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "ตั้ง PIN เพื่อใช้ปลดล็อก Bitwarden ทั้งนี้ หากคุณล็อกเอาต์ออกจากแอปโดยสมบูรณ์จะเป็นการลบการตั้งค่า PIN ของคุณด้วย" }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "ต้องระบุ PIN" }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "ล็อคด้วยรหัสผ่านหลักเมื่อรีสตาร์ทเบราว์เซอร์" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "คุณต้องเลือกอย่างน้อยหนึ่งคอลเลกชัน" }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "การดำเนินการหลังหมดเวลาล็อคตู้เซฟ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "ล็อก", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "ถังขยะ", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "ค้นหาใน Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "ข้อความ" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ไฟล์" }, @@ -2232,6 +2320,9 @@ "message": "Send ทั้งหมด", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Max access count reached", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Expiration date" }, @@ -2338,6 +2433,10 @@ "message": "Optionally require a password for users to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Private notes about this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Hide my email address from recipients." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "One or more organization policies are affecting your Send options." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "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$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 02f67a672bc..55286fccc93 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Ruhsat numarasını kopyala" }, + "copyCustomField": { + "message": "$FIELD$ alanını kopyala", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Web sitesini kopyala" + }, + "copyNotes": { + "message": "Notları kopyala" + }, "autoFill": { "message": "Otomatik doldur" }, @@ -171,7 +186,7 @@ "message": "Kasanıza giriş yapın" }, "autoFillInfo": { - "message": "Mevcut sekme için otomatik doldurulacak giriş bilgisi bulunmuyor." + "message": "Mevcut sekme için otomatik doldurulabilecek hesap yok." }, "addLogin": { "message": "Hesap ekle" @@ -179,6 +194,18 @@ "addItem": { "message": "Kayıt ekle" }, + "accountEmail": { + "message": "Hesap e-posta adresi" + }, + "requestHint": { + "message": "İpucunu iste" + }, + "requestPasswordHint": { + "message": "Parola ipucunu iste" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Hesabınızın e-posta adresini girdiğinizde parola ipucunuz size gönderilecektir" + }, "passwordHint": { "message": "Parola ipucu" }, @@ -462,6 +489,10 @@ "message": "Okurken karışabilecek karakterleri kullanma", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Kasada ara" }, @@ -504,6 +535,9 @@ "notes": { "message": "Notlar" }, + "privateNote": { + "message": "Özel not" + }, "note": { "message": "Not" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Oturum zaman aşımı" }, + "vaultTimeoutHeader": { + "message": "Kasa zaman aşımı" + }, "otherOptions": { "message": "Diğer seçenekler" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Kasa zaman aşımı" }, + "vaultTimeout1": { + "message": "Zaman aşımı" + }, "lockNow": { "message": "Şimdi kilitle" }, @@ -718,7 +758,7 @@ } }, "autofillError": { - "message": "Seçilen hesap bu sayfada otomatik olarak doldurulamadı. Lütfen bilgileri elle kopyalayıp yapıştırın." + "message": "Seçilen kayıt bu sayfada otomatik olarak doldurulamadı. Lütfen bilgileri elle kopyalayıp yapıştırın." }, "totpCaptureError": { "message": "Mevcut web sayfasındaki QR kodu taranamıyor" @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "İki aşamalı giriş, hesabınıza girererken işlemi bir güvenlik anahtarı, şifrematik uygulaması, SMS, telefon araması veya e-posta gibi ek bir yöntemle doğrulamanızı isteyerek hesabınızın güvenliğini artırır. İki aşamalı giriş özelliğini bitwarden.com web kasası üzerinden etkinleştirebilirsiniz. Şimdi siteye gitmek ister misiniz?" }, + "twoStepLoginConfirmationContent": { + "message": "Bitwarden web uygulamasında iki aşamalı girişi ayarlayarak hesabınızın güvenliğini artırabilirsiniz." + }, + "twoStepLoginConfirmationTitle": { + "message": "Web uygulamasına devam edilsin mi?" + }, "editedFolder": { "message": "Klasör kaydedildi" }, @@ -889,7 +935,7 @@ "message": "Sekme sayfasında kartları göster" }, "showCardsCurrentTabDesc": { - "message": "Kolay otomatik doldurma için sekme sayfasında kart öğelerini listele" + "message": "Kolay otomatik doldurma için sekme sayfasında kartları listele." }, "showIdentitiesInVaultView": { "message": "Kasa görünümünde kimlikleri otomatik doldurma önerisi olarak göster" @@ -898,7 +944,7 @@ "message": "Sekme sayfasında kimlikleri göster" }, "showIdentitiesCurrentTabDesc": { - "message": "Kolay otomatik doldurma için sekme sayfasında kimlik öğelerini listele" + "message": "Kolay otomatik doldurma için sekme sayfasında kimlikleri listele." }, "clearClipboard": { "message": "Panoyu temizle", @@ -1097,6 +1143,9 @@ "file": { "message": "Dosya" }, + "fileToShare": { + "message": "Paylaşılacak dosya" + }, "selectFile": { "message": "Bir dosya seçin" }, @@ -1131,7 +1180,7 @@ "message": "Dosya ekleri için 1 GB şifrelenmiş depolama." }, "premiumSignUpEmergency": { - "message": "Acil durum erişimi" + "message": "Acil durum erişimi." }, "premiumSignUpTwoStepOptions": { "message": "YubiKey ve Duo gibi marka bazlı iki aşamalı giriş seçenekleri." @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Kilidi PIN koduyla aç" }, + "setYourPinTitle": { + "message": "PIN belirle" + }, + "setYourPinButton": { + "message": "PIN belirle" + }, "setYourPinCode": { "message": "Bitwarden'ı açarken kullanacağınız PIN kodunu belirleyin. Uygulamadan tamamen çıkış yaparsanız PIN ayarlarınız sıfırlanacaktır." }, + "setYourPinCode1": { + "message": "Bitwarden'ın kilidini açmak için ana parolanız yerine PIN'iniz kullanılacaktır. Bitwarden'dan tamamen çıkış yaparsanız PIN'iniz sıfırlanır." + }, "pinRequired": { "message": "PIN kodu gerekli." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Tarayıcı yeniden başlatıldığında ana parola ile kilitle" }, + "lockWithMasterPassOnRestart1": { + "message": "Tarayıcı yeniden başlatıldığında ana parolayı sor" + }, "selectOneCollection": { "message": "En az bir koleksiyon seçmelisiniz." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Kasa zaman aşımı eylemi" }, + "vaultTimeoutAction1": { + "message": "Zaman aşımı eylemi" + }, "lock": { "message": "Kilitle", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Çöp kutusu", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Hesap uyuşmazlığı" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biyometrik kilit açma başarısız oldu. Biyometrik gizli anahtarınız kasanın kilidini açamadı. Lütfen biyometriyi yeniden ayarlamayı deneyin." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biyometrik anahtar eşleşmedi" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biyometrik kilit açma başarısız oldu. Biyometrik gizli anahtarınız kasanın kilidini açamadı. Lütfen biyometriyi yeniden ayarlamayı deneyin." + }, "biometricsNotEnabledTitle": { "message": "Biyometri ayarlanmamış" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Alan adı istisnası değişiklikleri kaydedildi" }, + "limitSendViews": { + "message": "Gösterimi sınırla" + }, + "limitSendViewsHint": { + "message": "Bu sınıra ulaşıldıktan sonra bu Send'i kimse göremez.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ gösterim kaldı", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send ayrıntıları", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Send'lerde ara", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Metin" }, + "sendTypeTextToShare": { + "message": "Paylaşılacak metin" + }, "sendTypeFile": { "message": "Dosya" }, @@ -2232,6 +2320,9 @@ "message": "Tüm Send'ler", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Metni varsayılan olarak gizle" + }, "maxAccessCountReached": { "message": "Maksimum erişim sayısına ulaşıldı", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Bu Send belirtilen tarih ve saatte kalıcı olacak silinecek.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Bu Send belirtilen tarihte kalıcı olacak silinecek.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Son kullanma tarihi" }, @@ -2338,6 +2433,10 @@ "message": "Kullanıcıların bu Send'e erişmek için parola girmelerini isteyebilirsiniz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Send'i görüntülemek için bu parolayı iste.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Bu Send ile ilgili özel notlar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "E-posta adresimi alıcılardan gizle." }, + "hideYourEmail": { + "message": "E-posta adresimi Send'i görüntüleyenlerden gizle." + }, "sendOptionsPolicyInEffect": { "message": "Bir veya daha fazla kuruluş ilkesi Send seçeneklerinizi etkiliyor." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Dakika" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Zaman aşımı ayarlarınıza kurumsal ilke gereksinimleri uygulandı" + }, "vaultTimeoutPolicyInEffect": { "message": "Kuruluş ilkeleriniz izin verilen maksimum kasa zaman aşımını $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "En fazla $HOURS$ saat $MINUTES$ dakika.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Zaman aşımınız kuruluşunuzun belirlediği maksimum süreyi aşıyor: Maksimum $HOURS$ saat $MINUTES$ dakika", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Kuruluş ilkeleriniz kasa zaman aşımınızı etkiliyor. İzin verilen maksimum kasa zaman aşımı $HOURS$ saat $MINUTES$ dakikadır. Kasa zaman aşımı eyleminiz $ACTION$ olarak ayarlanmış.", "placeholders": { @@ -4029,7 +4160,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "$WEBSITE$ eşleşme tespitini göster", "placeholders": { "website": { "content": "$1", @@ -4038,7 +4169,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "$WEBSITE$ eşleşme tespitini gizle", "placeholders": { "website": { "content": "$1", @@ -4125,13 +4256,13 @@ "message": "Alan etiketi" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Güvenlik sorusu gibi veriler için metin alanlarını kullanın" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Parola gibi hassas verileri için gizli alanları kullanın" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "Formlardaki onay kutularını (örn. \"e-posta adresimi hatırla\") otomatik doldurmak isterseniz onay kutularını kullanın" }, "linkedHelpText": { "message": "Use a linked field when you are experiencing autofill issues for a specific website." @@ -4152,7 +4283,7 @@ } }, "deleteCustomField": { - "message": "Delete $LABEL$", + "message": "$LABEL$ etiketini sil", "placeholders": { "label": { "content": "$1", @@ -4298,7 +4429,7 @@ "message": "Otomatik doldurma ve kasanızda arama yapma artık eskisinden daha kolay. Yeni tasarıma göz atmayı unutmayın!" }, "accountActions": { - "message": "Account actions" + "message": "Hesap işlemleri" }, "showNumberOfAutofillSuggestions": { "message": "Otomatik öneri sayısını uzantı simgesinde göster" @@ -4309,14 +4440,23 @@ "enterprisePolicyRequirementsApplied": { "message": "Bu ayara kurumsal ilke gereksinimleri uygulandı" }, + "retry": { + "message": "Yeniden dene" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum özel zaman aşımı 1 dakikadır." + }, + "additionalContentAvailable": { + "message": "Ek içerikler mevcut" + }, "fileSavedToDevice": { "message": "Dosya cihaza kaydedildi. Cihazınızın indirilenler klasöründen yönetebilirsiniz." }, "showCharacterCount": { - "message": "Show character count" + "message": "Karakter sayacını göster" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Karakter sayacını gizle" }, "itemsInTrash": { "message": "Çöp kutusundaki kayıtlar" diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index eb7affa78c7..e063af8c7fa 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Копіювати номер ліцензії" }, + "copyCustomField": { + "message": "Копіювати $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Копіювати вебсайт" + }, + "copyNotes": { + "message": "Копіювати нотатки" + }, "autoFill": { "message": "Автозаповнення" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Додати запис" }, + "accountEmail": { + "message": "Е-пошта облікового запису" + }, + "requestHint": { + "message": "Підказка для запиту" + }, + "requestPasswordHint": { + "message": "Підказка для запиту пароля" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Введіть адресу е-пошти свого облікового запису і вам буде надіслано підказку для пароля" + }, "passwordHint": { "message": "Підказка для пароля" }, @@ -462,6 +489,10 @@ "message": "Уникати неоднозначних символів", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Пошук" }, @@ -504,6 +535,9 @@ "notes": { "message": "Нотатки" }, + "privateNote": { + "message": "Приватна нотатка" + }, "note": { "message": "Нотатка" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Час очікування сеансу" }, + "vaultTimeoutHeader": { + "message": "Час очікування сховища" + }, "otherOptions": { "message": "Інші налаштування" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Час очікування сховища" }, + "vaultTimeout1": { + "message": "Час очікування" + }, "lockNow": { "message": "Блокувати зараз" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Двоетапна перевірка дає змогу надійніше захистити ваш обліковий запис, вимагаючи підтвердження входу з використанням іншого пристрою, наприклад, за допомогою ключа безпеки, програми автентифікації, SMS, телефонного виклику, або е-пошти. Ви можете налаштувати двоетапну перевірку в сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, + "twoStepLoginConfirmationContent": { + "message": "Додайте вищий рівень захисту облікового запису, налаштувавши двоетапну перевірку у вебпрограмі Bitwarden." + }, + "twoStepLoginConfirmationTitle": { + "message": "Продовжити у вебпрограмі?" + }, "editedFolder": { "message": "Теку збережено" }, @@ -892,7 +938,7 @@ "message": "Показувати список карток на сторінці вкладки для легкого автозаповнення." }, "showIdentitiesInVaultView": { - "message": "Показувати особисті дані як пропозиції автозаповнення в режимі перегляду сховища" + "message": "Показувати посвідчення як пропозиції автозаповнення в режимі перегляду сховища" }, "showIdentitiesCurrentTab": { "message": "Показувати посвідчення на вкладці" @@ -1097,6 +1143,9 @@ "file": { "message": "Файл" }, + "fileToShare": { + "message": "Файл для поширення" + }, "selectFile": { "message": "Оберіть файл" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Розблокування з PIN-кодом" }, + "setYourPinTitle": { + "message": "Встановлення PIN-коду" + }, + "setYourPinButton": { + "message": "Встановити PIN-код" + }, "setYourPinCode": { "message": "Встановіть PIN-код для розблокування Bitwarden. Налаштування PIN-коду будуть скинуті, якщо ви коли-небудь повністю вийдете з програми." }, + "setYourPinCode1": { + "message": "PIN-код буде використовуватися для розблокування Bitwarden замість головного пароля. У разі повного виходу з Bitwarden, ваш PIN-код буде скинуто." + }, "pinRequired": { "message": "Необхідний PIN-код." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Блокувати головним паролем при перезапуску браузера" }, + "lockWithMasterPassOnRestart1": { + "message": "Вимагати головний пароль після перезапуску браузера" + }, "selectOneCollection": { "message": "Необхідно вибрати принаймні одну збірку." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Дія після часу очікування сховища" }, + "vaultTimeoutAction1": { + "message": "Дія після часу очікування" + }, "lock": { "message": "Блокувати", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Смітник", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Невідповідність облікових записів" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Збій біометричного розблокування. Біометричний секретний ключ не зміг розблокувати сховище. Спробуйте налаштувати біометрію знову." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Біометричний ключ відрізняється" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Збій біометричного розблокування. Біометричний секретний ключ не зміг розблокувати сховище. Спробуйте налаштувати біометрію знову." + }, "biometricsNotEnabledTitle": { "message": "Біометрію не налаштовано" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Виняток для домену збережено" }, + "limitSendViews": { + "message": "Ліміт переглядів" + }, + "limitSendViewsHint": { + "message": "Ніхто не може переглянути це відправлення після досягнення ліміту.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Залишок переглядів: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Відправлення", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Надіслати подробиці", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Шукати відправлення", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Текст" }, + "sendTypeTextToShare": { + "message": "Текст для поширення" + }, "sendTypeFile": { "message": "Файл" }, @@ -2232,6 +2320,9 @@ "message": "Усі відправлення", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Типово приховувати текст" + }, "maxAccessCountReached": { "message": "Досягнуто максимальної кількості доступів", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Відправлення буде остаточно видалено у вказаний час.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "Відправлення буде остаточно видалено у вказану дату.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Дата завершення" }, @@ -2338,6 +2433,10 @@ "message": "Ви можете встановити пароль для доступу до цього відправлення.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Вимагати цей пароль для перегляду відправлення.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Особисті нотатки про це відправлення.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Приховувати мою адресу електронної пошти від отримувачів." }, + "hideYourEmail": { + "message": "Приховати адресу е-пошти від отримувачів." + }, "sendOptionsPolicyInEffect": { "message": "На параметри відправлень впливають одна чи декілька політик організації." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Хвилин" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "До налаштувань часу очікування застосовано вимоги політики компанії" + }, "vaultTimeoutPolicyInEffect": { "message": "Політикою вашої організації встановлено максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ год і $MINUTES$ хв максимум.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Час очікування перевищує обмеження, встановлене вашою організацією: $HOURS$ год і $MINUTES$ хв максимум", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин. Для часу очікування вашого сховища встановлена дія $ACTION$.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "До цього налаштування застосовано вимоги політики компанії" }, + "retry": { + "message": "Повторити спробу" + }, + "vaultCustomTimeoutMinimum": { + "message": "Мінімальний власний час очікування – 1 хвилина." + }, + "additionalContentAvailable": { + "message": "Доступний додатковий вміст" + }, "fileSavedToDevice": { "message": "Файл збережено на пристрої. Ви можете його знайти у теці завантажень." }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 1b059e1b9cc..363065e4429 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Sao chép số giấy phép" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "Tự động điền" }, @@ -179,6 +194,18 @@ "addItem": { "message": "Thêm mục" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "Gợi ý mật khẩu" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "Tìm kiếm trong kho lưu trữ" }, @@ -504,6 +535,9 @@ "notes": { "message": "Ghi chú" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Ghi chú" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Thời gian chờ của phiên" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Tùy chọn khác" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "Thời gian chờ của kho" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Khóa ngay" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "Xác thực hai lớp giúp cho tài khoản của bạn an toàn hơn bằng cách yêu cầu bạn xác minh thông tin đăng nhập của bạn bằng một thiết bị khác như khóa bảo mật, ứng dụng xác thực, SMS, cuộc gọi điện thoại hoặc email. Bạn có thể bật xác thực hai lớp trong kho bitwarden nền web. Bạn có muốn ghé thăm trang web bây giờ?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Đã lưu thư mục" }, @@ -1097,6 +1143,9 @@ "file": { "message": "Tập tin" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "Chọn tập tin" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "Mở khóa bằng mã PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Đặt mã PIN của bạn để mở khóa Bitwarden. Cài đặt mã PIN của bạn sẽ bị xóa nếu bạn hoàn toàn đăng xuất khỏi ứng dụng." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "Mã PIN là bắt buộc." }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "Khóa với mật khẩu chính khi trình duyệt khởi động lại" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "Bạn phải chọn ít nhất một bộ sưu tập." }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "Hành động khi hết thời gian chờ của kho lưu trữ" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Khóa", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "Thùng rác", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "Tài khoản không đúng" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Sinh trắc học chưa được cài đặt" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Các thay đổi tên miền loại trừ đã được lưu" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "Tìm kiếm mục Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "Văn bản" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Tập tin" }, @@ -2232,6 +2320,9 @@ "message": "Tất cả mục Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "Đã vượt số lần truy cập tối đa", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "Mục Gửi sẽ được xóa vĩnh viễn vào ngày và giờ chỉ định.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "Ngày hết hạn" }, @@ -2338,6 +2433,10 @@ "message": "Yêu cầu nhập mật khẩu khi người dùng truy cập vào phần Gửi này.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "Ghi chú riêng tư về Send này.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "Ẩn địa chỉ email của tôi khỏi người nhận." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "Các chính sách của tổ chức đang ảnh hưởng đến tùy chọn Gửi của bạn." }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "Phút" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Tổ chức của bạn đã đặt thời gian mở kho tối đa là $HOURS$ giờ và $MINUTES$ phút.", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Tổ chức của bạn đang ảnh hưởng đến thời gian mở kho. Thời gian mở kho tối đa là $HOURS$ giờ và $MINUTES$ phút. Kho sẽ $ACTION$ sau khi hết thời gian mở kho.", "placeholders": { @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 04db7f8f6ec..e86e14c1a6a 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "复制许可证号码" }, + "copyCustomField": { + "message": "复制 $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "复制网站" + }, + "copyNotes": { + "message": "复制备注" + }, "autoFill": { "message": "自动填充" }, @@ -179,6 +194,18 @@ "addItem": { "message": "添加项目" }, + "accountEmail": { + "message": "账户邮件地址" + }, + "requestHint": { + "message": "请求提示" + }, + "requestPasswordHint": { + "message": "请求密码提示" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "输入您的账户电子邮件地址,您的密码提示将发送给您" + }, "passwordHint": { "message": "密码提示" }, @@ -462,6 +489,10 @@ "message": "避免易混淆的字符", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "搜索密码库" }, @@ -504,6 +535,9 @@ "notes": { "message": "备注" }, + "privateNote": { + "message": "私密备注" + }, "note": { "message": "备注" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "会话超时" }, + "vaultTimeoutHeader": { + "message": "密码库超时时间" + }, "otherOptions": { "message": "其他选项" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "密码库超时时间" }, + "vaultTimeout1": { + "message": "超时" + }, "lockNow": { "message": "立即锁定" }, @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "两步登录要求您从其他设备(例如安全钥匙、验证器 App、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码库中设置。现在访问此网站吗?" }, + "twoStepLoginConfirmationContent": { + "message": "通过在 Bitwarden 网页 App 中设置两步登录,可以使您的账户更加安全。" + }, + "twoStepLoginConfirmationTitle": { + "message": "前往网页 App 吗?" + }, "editedFolder": { "message": "文件夹已保存" }, @@ -1097,6 +1143,9 @@ "file": { "message": "文件" }, + "fileToShare": { + "message": "要分享的文件" + }, "selectFile": { "message": "选择一个文件" }, @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "使用 PIN 码解锁" }, + "setYourPinTitle": { + "message": "设置 PIN 码" + }, + "setYourPinButton": { + "message": "设置 PIN 码" + }, "setYourPinCode": { "message": "设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您完全注销此应用程序时被重置。" }, + "setYourPinCode1": { + "message": "您的 PIN 码将代替主密码用于解锁 Bitwarden。如果您完全注销 Bitwarden,PIN 码将被重置。" + }, "pinRequired": { "message": "需要 PIN 码。" }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "浏览器重启后使用主密码锁定" }, + "lockWithMasterPassOnRestart1": { + "message": "浏览器重启时需要主密码" + }, "selectOneCollection": { "message": "您必须至少选择一个集合。" }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "密码库超时动作" }, + "vaultTimeoutAction1": { + "message": "超时动作" + }, "lock": { "message": "锁定", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "回收站", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "账户不匹配" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "生物识别解锁失败。生物识别安全钥匙解锁密码库失败。请尝试重新设置生物识别。" - }, "nativeMessagingWrongUserKeyTitle": { "message": "生物识别密钥不匹配" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "生物识别解锁失败。生物识别安全钥匙解锁密码库失败。请尝试重新设置生物识别。" + }, "biometricsNotEnabledTitle": { "message": "生物识别未设置" }, @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "排除域名更改已保存" }, + "limitSendViews": { + "message": "限制查看" + }, + "limitSendViewsHint": { + "message": "在达到限额后,任何人无法查看此 Send。", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "剩余 $ACCESSCOUNT$ 次查看次数", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send 详细信息", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "搜索 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "文本" }, + "sendTypeTextToShare": { + "message": "要分享的文本" + }, "sendTypeFile": { "message": "文件" }, @@ -2232,6 +2320,9 @@ "message": "所有 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "默认隐藏文本" + }, "maxAccessCountReached": { "message": "已达最大访问次数", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "此 Send 将在指定的日期和时间后被永久删除。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "此 Send 将在此日期后被永久删除。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "过期日期" }, @@ -2338,6 +2433,10 @@ "message": "可选,用户需要提供密码才能访问此 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "需要此密码才能查看此 Send。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "关于此 Send 的私密备注。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "对收件人隐藏我的电子邮件地址。" }, + "hideYourEmail": { + "message": "对查看者隐藏您的电子邮件地址。" + }, "sendOptionsPolicyInEffect": { "message": "一个或多个组织策略正在影响您的 Send 选项。" }, @@ -2510,6 +2612,9 @@ "minutes": { "message": "分钟" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "企业策略要求已应用到您的超时选项" + }, "vaultTimeoutPolicyInEffect": { "message": "您的组织策略已将您最大允许的密码库超时时间设置为 $HOURS$ 小时 $MINUTES$ 分钟。", "placeholders": { @@ -2523,6 +2628,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "最多 $HOURS$ 小时 $MINUTES$ 分钟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "超时时间超出了您组织设置的此限制:最多 $HOURS$ 小时 $MINUTES$ 分钟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "您的组织策略正在影响您的密码库超时时间。最大允许的密码库超时时间是 $HOURS$ 小时 $MINUTES$ 分钟。您的密码库超时动作被设置为 $ACTION$。", "placeholders": { @@ -3881,7 +4012,7 @@ "message": "无文件夹的项目" }, "itemDetails": { - "message": "项目详情" + "message": "项目详细信息" }, "itemName": { "message": "项目名称" @@ -3966,7 +4097,7 @@ "message": "筛选" }, "personalDetails": { - "message": "个人信息" + "message": "个人详细信息" }, "identification": { "message": "身份" @@ -4056,10 +4187,10 @@ "message": "如果您的支付卡已续期,请更新该卡的信息。" }, "cardDetails": { - "message": "支付卡详情" + "message": "支付卡详细信息" }, "cardBrandDetails": { - "message": "$BRAND$ 详情", + "message": "$BRAND$ 详细信息", "placeholders": { "brand": { "content": "$1", @@ -4309,8 +4440,17 @@ "enterprisePolicyRequirementsApplied": { "message": "企业策略要求已应用于此设置" }, + "retry": { + "message": "重试" + }, + "vaultCustomTimeoutMinimum": { + "message": "自定义超时时间最小为 1 分钟。" + }, + "additionalContentAvailable": { + "message": "其他内容可用" + }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "文件已保存到设备。可以在设备下载中进行管理。" }, "showCharacterCount": { "message": "显示字符计数" diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index d61e831d738..49a407d51d5 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Bitwarden - 免費密碼管理工具", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "Bitwarden 是一款安全、免費、跨平台的密碼管理工具。", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -128,6 +128,21 @@ "copyLicenseNumber": { "message": "Copy license number" }, + "copyCustomField": { + "message": "Copy $FIELD$", + "placeholders": { + "field": { + "content": "$1", + "example": "Custom field label" + } + } + }, + "copyWebsite": { + "message": "Copy website" + }, + "copyNotes": { + "message": "Copy notes" + }, "autoFill": { "message": "自動填入" }, @@ -171,7 +186,7 @@ "message": "登入您的密碼庫" }, "autoFillInfo": { - "message": "沒有可以自動填入目前瀏覽器分頁的登入資訊。" + "message": "沒有可以在目前瀏覽器分頁自動填入的登入資訊。" }, "addLogin": { "message": "新增登入資料" @@ -179,6 +194,18 @@ "addItem": { "message": "新增項目" }, + "accountEmail": { + "message": "Account email" + }, + "requestHint": { + "message": "Request hint" + }, + "requestPasswordHint": { + "message": "Request password hint" + }, + "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { + "message": "Enter your account email address and your password hint will be sent to you" + }, "passwordHint": { "message": "密碼提示" }, @@ -462,6 +489,10 @@ "message": "Avoid ambiguous characters", "description": "Label for the avoid ambiguous characters checkbox." }, + "generatorPolicyInEffect": { + "message": "Enterprise policy requirements have been applied to your generator options.", + "description": "Indicates that a policy limits the credential generator screen." + }, "searchVault": { "message": "搜尋密碼庫" }, @@ -504,6 +535,9 @@ "notes": { "message": "備註" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "備註" }, @@ -549,6 +583,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -589,6 +626,9 @@ "vaultTimeout": { "message": "密碼庫逾時時間" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "立即鎖定" }, @@ -718,7 +758,7 @@ } }, "autofillError": { - "message": "無法在此頁面自動填入所選項目。請手動複製並貼上。" + "message": "無法在此頁面自動填入所選項目,請手動複製貼上。" }, "totpCaptureError": { "message": "無法掃描此網頁的二維碼" @@ -789,6 +829,12 @@ "twoStepLoginConfirmation": { "message": "兩步驟登入需要您從其他裝置(例如安全鑰匙、驗證器程式、SMS、手機或電子郵件)來驗證您的登入,這使您的帳戶更加安全。兩步驟登入可以在 bitwarden.com 網頁版密碼庫啟用。現在要前往嗎?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "資料夾已儲存" }, @@ -892,7 +938,7 @@ "message": "於分頁頁面顯示信用卡以便於自動填入。" }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Show identities as Autofill suggestions on Vault view" }, "showIdentitiesCurrentTab": { "message": "於分頁頁面顯示身分" @@ -958,7 +1004,7 @@ "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "選擇在執行自動填入等動作時對登入資料進行 URI 一致性偵測的預設方式。" + "message": "選擇在執行自動填入等動作時,登入資訊的預設統一資源標識符(URI)比對方式。" }, "theme": { "message": "主題" @@ -1097,6 +1143,9 @@ "file": { "message": "檔案" }, + "fileToShare": { + "message": "File to share" + }, "selectFile": { "message": "選取檔案" }, @@ -1191,7 +1240,7 @@ "message": "自動複製 TOTP" }, "disableAutoTotpCopyDesc": { - "message": "若登入資料已包含驗證器金鑰,在自動填入此登入資料時,TOTP 驗證碼將複製至您的剪貼簿。" + "message": "若登入資訊已包含驗證器金鑰,在自動填入登入資訊時,也會同步為您複製 TOTP 驗證碼。" }, "enableAutoBiometricsPrompt": { "message": "啟動時要求生物特徵辨識" @@ -1397,7 +1446,7 @@ } }, "experimentalFeature": { - "message": "被入侵或不可信任的網站可不當利用頁面載入時的自動填入功能。" + "message": "被入侵或不被信任的網站,可能會濫用頁面載入的自動填入功能。" }, "learnMoreAboutAutofillOnPageLoadLinkText": { "message": "Learn more about risks" @@ -1412,7 +1461,7 @@ "message": "您可以從項目的編輯檢視中為單個登入項目關閉頁面載入時自動填入。" }, "itemAutoFillOnPageLoad": { - "message": "頁面載入時自動填入(如果選項中已設定)" + "message": "頁面載入時自動填入(如果已在選項中設定)" }, "autoFillOnPageLoadUseDefault": { "message": "使用預設設定" @@ -1863,9 +1912,18 @@ "unlockWithPin": { "message": "使用 PIN 碼解鎖" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "設定您用來解鎖 Bitwarden 的 PIN 碼。您的 PIN 設定將在您完全登出本應用程式時被重設。" }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "必須填入 PIN 碼。" }, @@ -1887,6 +1945,9 @@ "lockWithMasterPassOnRestart": { "message": "瀏覽器重啟後使用主密碼鎖定" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "您必須至少選擇一個集合。" }, @@ -1925,9 +1986,12 @@ "vaultTimeoutAction": { "message": "密碼庫逾時動作" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "鎖定", - "description": "Verb form: to make secure or inaccesible by" + "description": "Verb form: to make secure or inaccessible by" }, "trash": { "message": "垃圾桶", @@ -1967,10 +2031,10 @@ "message": "Fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "項目已自動填入並且 URL 已儲存" + "message": "項目已自動填入並且已儲存統一資源標識符(URI)" }, "autoFillSuccess": { - "message": "項目已自動填入" + "message": "項目已自動填入 " }, "insecurePageWarning": { "message": "警告:這是不安全的 HTTP 頁面,任何您送出的資訊均可能被其他人看見和更改。此登入資訊原先是在安全的 (HTTPS) 頁面儲存的。" @@ -1979,10 +2043,10 @@ "message": "您仍要填入此登入資訊嗎?" }, "autofillIframeWarning": { - "message": "這個表單寄放在不同的網域,而非您儲存登入資訊的 URI。選擇「確認」則依然自動填入,「取消」則停止本動作。" + "message": "這個表單存放在不同的網域,而非儲存您登入資訊的統一資源標識符(URI)。選擇「確認」則依然自動填入,「取消」則停止本動作。" }, "autofillIframeWarningTip": { - "message": "若以後不想再跳出這個警告,請將這個網站的 URI「$HOSTNAME$」儲存到您的 Bitwarden 登入項目。", + "message": "若以後不想再跳出這個警告,請將這個網站的統一資源標識符(URI)「$HOSTNAME$」儲存到您的 Bitwarden 登入項目。", "placeholders": { "hostname": { "content": "$1", @@ -2119,12 +2183,12 @@ "nativeMessagingWrongUserTitle": { "message": "帳戶不相符" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "生物特徵辨識未設定" }, @@ -2187,7 +2251,7 @@ "message": "Bitwarden 不會要求儲存這些網域的詳細登入資訊。必須重新整理頁面才能使變更生效。" }, "excludedDomainsDescAlt": { - "message": "對於所有已登入的帳戶,Bitwarden 不會詢問是否儲存這些網域的登入資訊。您必須重新整理頁面以使變更生效。" + "message": "對於所有已登入的帳戶,Bitwarden 不會詢問是否儲存這些網域的登入資訊。您必須重新整理頁面變更才會生效。" }, "websiteItemLabel": { "message": "Website $number$ (URI)", @@ -2210,10 +2274,31 @@ "excludedDomainsSavedSuccess": { "message": "Excluded domain changes saved" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "searchSends": { "message": "搜尋 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2225,6 +2310,9 @@ "sendTypeText": { "message": "文字" }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "檔案" }, @@ -2232,6 +2320,9 @@ "message": "所有 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "maxAccessCountReached": { "message": "已達最大存取次數", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." @@ -2305,6 +2396,10 @@ "message": "此 Send 將在指定的日期和時間後被永久刪除。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "expirationDate": { "message": "逾期日期" }, @@ -2338,6 +2433,10 @@ "message": "選用功能。使用者需提供密碼才能存取此 Send。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "sendPasswordDescV2": { + "message": "Require this password to view the Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "sendNotesDesc": { "message": "關於此 Send 的私人備註。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2443,6 +2542,9 @@ "hideEmail": { "message": "對收件人隱藏我的電子郵件地址。" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "sendOptionsPolicyInEffect": { "message": "一個或多個組織原則正影響您的 Send 選項。" }, @@ -2474,7 +2576,7 @@ "message": "您的主密碼最近被您的組織管理者變更過。若要存取密碼庫,您必須立即更新主密碼。繼續操作會登出目前的登入階段,並要求您重新登入。其他裝置上的活動登入階段最多會保持一個小時。" }, "updateWeakMasterPasswordWarning": { - "message": "您的主密碼不符合一個或多個組織原則要求。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能繼續長達一小時。" + "message": "您的主密碼不符合一個或多個組織政策規定。您必須立即更新您的主密碼才能存取密碼庫。進行此動作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能持續長達一小時。" }, "tdeDisabledMasterPasswordRequired": { "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." @@ -2510,8 +2612,37 @@ "minutes": { "message": "分鐘" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { - "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。", + "message": "您的組織政策已限定您密碼庫逾時的時間長度。密碼庫逾時時間最高可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", "placeholders": { "hours": { "content": "$1", @@ -2813,7 +2944,7 @@ "message": "伺服器版本" }, "selfHostedServer": { - "message": "自我裝載" + "message": "自架" }, "thirdParty": { "message": "第三方" @@ -2861,7 +2992,7 @@ "message": "指紋短語" }, "fingerprintMatchInfo": { - "message": "請確保您的密碼庫已解鎖,並且指紋短語與其他裝置的一致。" + "message": "請確保您的密碼庫已解鎖,並且指紋短語與其他裝置一致。" }, "resendNotification": { "message": "重新傳送通知" @@ -2873,22 +3004,22 @@ "message": "已傳送通知至您的裝置。" }, "loginInitiated": { - "message": "登入已發起" + "message": "登入已啟動" }, "exposedMasterPassword": { - "message": "已暴露的主密碼" + "message": "已洩露的主密碼" }, "exposedMasterPasswordDesc": { - "message": "在資料外洩事件中找到了密碼。我們建議您使用一個獨特的密碼來保護您的帳戶,您確定要使用已暴露的密碼嗎?" + "message": "該密碼已洩露。建議您使用一個獨特的密碼來保護您的帳戶,您確定要使用已洩露的密碼嗎?" }, "weakAndExposedMasterPassword": { - "message": "強度不足且已暴露的主密碼" + "message": "強度不足且已洩露的主密碼" }, "weakAndBreachedMasterPasswordDesc": { - "message": "密碼強度不足,且在資料外洩事件中找到了這個密碼。使用一個強度足夠和獨特的密碼來保護您的帳戶。您確定要使用這個密碼嗎?" + "message": "密碼強度不足,且該密碼已洩露。請使用一個強度足夠和獨特的密碼來保護您的帳戶。您確定要使用這個密碼嗎?" }, "checkForBreaches": { - "message": "檢查外洩密碼資料庫中是否有此密碼" + "message": "檢查外洩的密碼資料庫中是否包含此密碼" }, "important": { "message": "重要:" @@ -2897,7 +3028,7 @@ "message": "若您忘記主密碼,將會無法找回!" }, "characterMinimum": { - "message": "$LENGTH$ 個字元以上", + "message": "最少 $LENGTH$ 個字元以上", "placeholders": { "length": { "content": "$1", @@ -2906,13 +3037,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "您的組織原則已啟用頁面載入時自動填入的功能。" + "message": "您的組織政策已啟用頁面載入時的自動填入功能。" }, "howToAutofill": { - "message": "如何自動填入" + "message": "如何使用自動填入功能" }, "autofillSelectInfoWithCommand": { - "message": "從此畫面中選擇一個項目;使用捷徑 $COMMAND$,或在設定中探索其他選項。", + "message": "從本畫面選擇一個項目,然後使用 $COMMAND$ 快速鍵,或是瞭解設定當中的其他選項。", "placeholders": { "command": { "content": "$1", @@ -2921,7 +3052,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "從此畫面中選擇一個項目,或在設定中探索其他選項。" + "message": "從本畫面選擇一個項目,或是瞭解設定當中的其他選項。" }, "gotIt": { "message": "我知道了" @@ -2954,7 +3085,7 @@ } }, "autofillShortcutTextSafari": { - "message": "預設自動填入快速鍵:$COMMAND$", + "message": "預設自動填入快速鍵:$COMMAND$。", "placeholders": { "command": { "content": "$1", @@ -2969,7 +3100,7 @@ "message": "在新視窗開啟" }, "deviceApprovalRequired": { - "message": "裝置核准已要求。請在下面選擇一個核准選項:" + "message": "裝置需要取得核准。請在下面選擇一個核准選項:" }, "rememberThisDevice": { "message": "記住這個裝置" @@ -2978,13 +3109,13 @@ "message": "若使用公用裝置,請勿勾選" }, "approveFromYourOtherDevice": { - "message": "從其他裝置核准" + "message": "使用其他裝置核准" }, "requestAdminApproval": { "message": "要求管理員核准" }, "approveWithMasterPassword": { - "message": "使用主密碼批准" + "message": "使用主密碼核准" }, "ssoIdentifierRequired": { "message": "需要組織 SSO 識別碼。" @@ -3011,7 +3142,7 @@ "message": "to edit your email address." }, "eu": { - "message": "EU", + "message": "歐盟", "description": "European Union" }, "accessDenied": { @@ -3024,7 +3155,7 @@ "message": "顯示" }, "accountSuccessfullyCreated": { - "message": "已成功建立帳戶!" + "message": "帳戶已成功建立!" }, "adminApprovalRequested": { "message": "已要求管理員核准" @@ -3042,7 +3173,7 @@ "message": "登入已核准" }, "userEmailMissing": { - "message": "缺少使用者電子郵件" + "message": "缺少使用者電子郵件地址" }, "deviceTrusted": { "message": "裝置已信任" @@ -3156,7 +3287,7 @@ "message": "全部清除" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "再加上 $QUANTITY$ 個", "placeholders": { "quantity": { "content": "$1", @@ -3168,7 +3299,7 @@ "message": "子選單" }, "toggleCollapse": { - "message": "切換折疊", + "message": "切換至折疊狀態", "description": "Toggling an expand/collapse state." }, "filelessImport": { @@ -3207,11 +3338,11 @@ "message": "別名網域" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "使用主密碼重新提示的項目無法在頁面載入時自動填寫。已關閉頁面載入時的自動填入。", + "message": "使用主密碼重新提示的項目無法在頁面載入時使用自動填入功能。已關閉頁面載入時的自動填入功能。", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "將頁面載入時的自動填入設定為使用預設設定。", + "message": "將頁面載入時使用自動填入功能設定為預設。", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { @@ -3297,7 +3428,7 @@ "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Bitwarden 自動填入選單可用。按下箭頭鍵來選擇。", + "message": "您可以使用 Bitwarden 自動填入選單。請按向下鍵來選擇。", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -3314,7 +3445,7 @@ "message": "匯入時發生錯誤" }, "importErrorDesc": { - "message": "您嘗試匯入的資料有問題,請處理下方列出的來源檔案中的錯誤然後再試一次。" + "message": "您嘗試匯入的資料有問題,請解決下列來源檔案中的錯誤然後再試一次。" }, "resolveTheErrorsBelowAndTryAgain": { "message": "請解決下面的錯誤然後再試一次。" @@ -3326,7 +3457,7 @@ "message": "資料匯入成功" }, "importSuccessNumberOfItems": { - "message": "一共匯入了 $AMOUNT$ 個項目。", + "message": "一共匯入 $AMOUNT$ 個項目。", "placeholders": { "amount": { "content": "$1", @@ -3401,10 +3532,10 @@ "message": "開啟Duo" }, "importFormatError": { - "message": "資料格式不正確。請檢查您匯入的檔案後再試一次。" + "message": "資料格式不正確。請檢查匯入檔案後再試一次。" }, "importNothingError": { - "message": "沒有匯入任何內容。" + "message": "未匯入任何內容。" }, "importEncKeyError": { "message": "解密匯出的檔案時發生錯誤,您的加密金鑰與匯出資料時使用的金鑰不同。" @@ -3422,7 +3553,7 @@ "message": "選擇一個資料夾" }, "selectImportCollection": { - "message": "選擇一個集合" + "message": "選擇一個分類" }, "importTargetHint": { "message": "如果您要將匯入檔案的內容移動到 $DESTINATION$,請選擇此選項", @@ -3435,7 +3566,7 @@ } }, "importUnassignedItemsError": { - "message": "檔案包含未指派的項目。" + "message": "檔案包含未指派項目。" }, "selectFormat": { "message": "選擇匯入檔案的格式" @@ -3481,10 +3612,10 @@ "message": "密碼金鑰不會被複製" }, "passkeyNotCopiedAlert": { - "message": "密碼金鑰不會被複製到新複製的項目。 您想繼續複製此項目嗎?" + "message": "不會將密碼金鑰複製到拓製的項目中。您想繼續拓製該項目嗎?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "發起站點需要驗證。對於沒有主密碼的帳戶,此功能尚未實現。" + "message": "發起站點需要驗證。沒有主密碼的帳戶尚未開通此功能。" }, "logInWithPasskeyQuestion": { "message": "Log in with passkey?" @@ -3496,7 +3627,7 @@ "message": "未發現用於這個應用程式的密碼金鑰。" }, "noMatchingPasskeyLogin": { - "message": "您沒有適用於此網站的登入項目。" + "message": "您沒有符合該網站的登入資訊。" }, "noMatchingLoginsForSite": { "message": "No matching logins for this site" @@ -3508,7 +3639,7 @@ "message": "儲存密碼金鑰" }, "savePasskeyNewLogin": { - "message": "儲存密碼金鑰為新登入項目" + "message": "將密碼金鑰儲存為新的登入資訊" }, "chooseCipherForPasskeySave": { "message": "Choose a login to save this passkey to" @@ -3526,7 +3657,7 @@ "message": "該項目已包含密碼金鑰。您確定要覆寫目前的密碼金鑰嗎?" }, "featureNotSupported": { - "message": "功能尚不受支援" + "message": "尚未支援此功能" }, "yourPasskeyIsLocked": { "message": "使用密碼金鑰需要身分驗證。請驗證您的身份以繼續。" @@ -3556,28 +3687,28 @@ "message": "包含共用的資料夾" }, "lastPassEmail": { - "message": "LastPass Email" + "message": "LastPass 電子郵件" }, "importingYourAccount": { "message": "正在匯入您的帳戶..." }, "lastPassMFARequired": { - "message": "要求 LastPass 多因素驗證" + "message": "需要進行 LastPass 多因素驗證" }, "lastPassMFADesc": { - "message": "輸入來自身分驗證 App 的一次性通行代碼" + "message": "輸入來自驗證程式的單次使用通行碼" }, "lastPassOOBDesc": { - "message": "在身分驗證 App 中核准登入請求或輸入一次性通行代碼。" + "message": "在驗證程式中核准登入請求或輸入單次使用通行碼。" }, "passcode": { - "message": "繞行代碼" + "message": "密碼" }, "lastPassMasterPassword": { "message": "LastPass 主密碼" }, "lastPassAuthRequired": { - "message": "要求 LastPass 驗證" + "message": "需要 LastPass 驗證" }, "awaitingSSO": { "message": "等待 SSO 驗證" @@ -3586,7 +3717,7 @@ "message": "請使用您的公司憑證繼續登入。" }, "seeDetailedInstructions": { - "message": "請參閱我們的幫助網站上的詳細說明:", + "message": "請參閱我們說明網站上的詳細說明於", "description": "This is followed a by a hyperlink to the help website." }, "importDirectlyFromLastPass": { @@ -3596,13 +3727,13 @@ "message": "從 CSV 匯入" }, "lastPassTryAgainCheckEmail": { - "message": "請再嘗試一次,或檢查您的電子郵件以確認 LastPass 的驗證信。" + "message": "請再嘗試一次,或檢查電子郵件信箱中來自 LastPass 的驗證信。" }, "collection": { - "message": "收藏" + "message": "分類" }, "lastPassYubikeyDesc": { - "message": "將與您的 LastPass 帳戶關聯的 YubiKey 插入電腦的 USB 連接埠,然後觸摸其按鈕。" + "message": "將與您的 LastPass 帳戶連結的 YubiKey 插入電腦的 USB 連接埠,然後按下按鈕。" }, "switchAccount": { "message": "切換帳戶" @@ -4309,6 +4440,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, From 2b462b6fd671fd3321ee6f6e7c5bf0c50a48fd16 Mon Sep 17 00:00:00 2001 From: Jared McCannon Date: Mon, 23 Sep 2024 10:33:44 -0500 Subject: [PATCH 085/104] Validate domain has been verified (#11125) - Added client-side validation that the domain has been verified. --- apps/web/src/app/auth/sso.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/auth/sso.component.ts b/apps/web/src/app/auth/sso.component.ts index f55152fed3b..e498384c278 100644 --- a/apps/web/src/app/auth/sso.component.ts +++ b/apps/web/src/app/auth/sso.component.ts @@ -110,7 +110,7 @@ export class SsoComponent extends BaseSsoComponent implements OnInit { const response: OrganizationDomainSsoDetailsResponse = await this.orgDomainApiService.getClaimedOrgDomainByEmail(qParams.email); - if (response?.ssoAvailable) { + if (response?.ssoAvailable && response?.verifiedDate) { this.identifierFormControl.setValue(response.organizationIdentifier); await this.submit(); return; From bcddf575a1935e2c29189f0707587afaf82f5f84 Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Mon, 23 Sep 2024 11:56:09 -0500 Subject: [PATCH 086/104] [PM-11306] Disable Animation Setting (#11157) * add appearance option to disable animations * add check to only show the form after it's populated to avoid flash of inaccurate values * switch to form loading while waiting for form values --- apps/browser/src/_locales/en/messages.json | 3 +++ .../settings/appearance-v2.component.html | 9 ++++++-- .../settings/appearance-v2.component.spec.ts | 17 +++++++++++++- .../popup/settings/appearance-v2.component.ts | 22 +++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 8eae45e6b38..900c3b37caa 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -4201,6 +4201,9 @@ "enableAnimations": { "message": "Enable animations" }, + "showAnimations": { + "message": "Show animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/vault/popup/settings/appearance-v2.component.html b/apps/browser/src/vault/popup/settings/appearance-v2.component.html index 565699a6f5b..b267e1c5cb2 100644 --- a/apps/browser/src/vault/popup/settings/appearance-v2.component.html +++ b/apps/browser/src/vault/popup/settings/appearance-v2.component.html @@ -1,4 +1,4 @@ - + @@ -23,10 +23,15 @@ {{ "showNumberOfAutofillSuggestions" | i18n }} - + {{ "enableFavicon" | i18n }} + + + + {{ "showAnimations" | i18n }} + diff --git a/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts b/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts index 69186359e2b..bbd210b65a3 100644 --- a/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts @@ -5,6 +5,7 @@ import { BehaviorSubject } from "rxjs"; import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -41,14 +42,17 @@ describe("AppearanceV2Component", () => { const showFavicons$ = new BehaviorSubject(true); const enableBadgeCounter$ = new BehaviorSubject(true); const selectedTheme$ = new BehaviorSubject(ThemeType.Nord); + const enableRoutingAnimation$ = new BehaviorSubject(true); const setSelectedTheme = jest.fn().mockResolvedValue(undefined); const setShowFavicons = jest.fn().mockResolvedValue(undefined); const setEnableBadgeCounter = jest.fn().mockResolvedValue(undefined); + const setEnableRoutingAnimation = jest.fn().mockResolvedValue(undefined); beforeEach(async () => { setSelectedTheme.mockClear(); setShowFavicons.mockClear(); setEnableBadgeCounter.mockClear(); + setEnableRoutingAnimation.mockClear(); await TestBed.configureTestingModule({ imports: [AppearanceV2Component], @@ -58,11 +62,15 @@ describe("AppearanceV2Component", () => { { provide: MessagingService, useValue: mock() }, { provide: I18nService, useValue: { t: (key: string) => key } }, { provide: DomainSettingsService, useValue: { showFavicons$, setShowFavicons } }, + { provide: ThemeStateService, useValue: { selectedTheme$, setSelectedTheme } }, + { + provide: AnimationControlService, + useValue: { enableRoutingAnimation$, setEnableRoutingAnimation }, + }, { provide: BadgeSettingsServiceAbstraction, useValue: { enableBadgeCounter$, setEnableBadgeCounter }, }, - { provide: ThemeStateService, useValue: { selectedTheme$, setSelectedTheme } }, ], }) .overrideComponent(AppearanceV2Component, { @@ -82,6 +90,7 @@ describe("AppearanceV2Component", () => { it("populates the form with the user's current settings", () => { expect(component.appearanceForm.value).toEqual({ + enableAnimations: true, enableFavicon: true, enableBadgeCounter: true, theme: ThemeType.Nord, @@ -106,5 +115,11 @@ describe("AppearanceV2Component", () => { expect(setEnableBadgeCounter).toHaveBeenCalledWith(false); }); + + it("updates the animation setting", () => { + component.appearanceForm.controls.enableAnimations.setValue(false); + + expect(setEnableRoutingAnimation).toHaveBeenCalledWith(false); + }); }); }); diff --git a/apps/browser/src/vault/popup/settings/appearance-v2.component.ts b/apps/browser/src/vault/popup/settings/appearance-v2.component.ts index 12f5c540409..9d600ec83e8 100644 --- a/apps/browser/src/vault/popup/settings/appearance-v2.component.ts +++ b/apps/browser/src/vault/popup/settings/appearance-v2.component.ts @@ -7,6 +7,7 @@ import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; @@ -41,8 +42,12 @@ export class AppearanceV2Component implements OnInit { enableFavicon: false, enableBadgeCounter: true, theme: ThemeType.System, + enableAnimations: true, }); + /** To avoid flashes of inaccurate values, only show the form after the entire form is populated. */ + formLoading = true; + /** Available theme options */ themeOptions: { name: string; value: ThemeType }[]; @@ -53,6 +58,7 @@ export class AppearanceV2Component implements OnInit { private themeStateService: ThemeStateService, private formBuilder: FormBuilder, private destroyRef: DestroyRef, + private animationControlService: AnimationControlService, i18nService: I18nService, ) { this.themeOptions = [ @@ -66,14 +72,20 @@ export class AppearanceV2Component implements OnInit { const enableFavicon = await firstValueFrom(this.domainSettingsService.showFavicons$); const enableBadgeCounter = await firstValueFrom(this.badgeSettingsService.enableBadgeCounter$); const theme = await firstValueFrom(this.themeStateService.selectedTheme$); + const enableAnimations = await firstValueFrom( + this.animationControlService.enableRoutingAnimation$, + ); // Set initial values for the form this.appearanceForm.setValue({ enableFavicon, enableBadgeCounter, theme, + enableAnimations, }); + this.formLoading = false; + this.appearanceForm.controls.theme.valueChanges .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((newTheme) => { @@ -91,6 +103,12 @@ export class AppearanceV2Component implements OnInit { .subscribe((enableBadgeCounter) => { void this.updateBadgeCounter(enableBadgeCounter); }); + + this.appearanceForm.controls.enableAnimations.valueChanges + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((enableBadgeCounter) => { + void this.updateAnimations(enableBadgeCounter); + }); } async updateFavicon(enableFavicon: boolean) { @@ -105,4 +123,8 @@ export class AppearanceV2Component implements OnInit { async saveTheme(newTheme: ThemeType) { await this.themeStateService.setSelectedTheme(newTheme); } + + async updateAnimations(enableAnimations: boolean) { + await this.animationControlService.setEnableRoutingAnimation(enableAnimations); + } } From 08f0dadc2f370737db54e4bb69e1148b5b56ea7b Mon Sep 17 00:00:00 2001 From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:23:53 +0100 Subject: [PATCH 087/104] Resolve the bug on change payment method (#11202) --- .../change-plan-dialog.component.html | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html index bd8ae20c92e..27d51af92b3 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html @@ -332,20 +332,16 @@

{{ "paymentMethod" | i18n }}

-

+

- {{ billing?.paymentSource?.description }} - {{ - "changePaymentMethod" | i18n - }} - -

-

- - {{ paymentSource?.description }} - {{ - "changePaymentMethod" | i18n - }} + {{ + deprecateStripeSourcesAPI + ? paymentSource?.description + : billing?.paymentSource?.description + }} + + {{ "changePaymentMethod" | i18n }} +

Date: Mon, 23 Sep 2024 16:39:57 -0400 Subject: [PATCH 088/104] Add Retries to `get` (#11176) --- .../browser/src/background/main.background.ts | 2 +- .../services/browser-local-storage.service.ts | 61 ++++++++++++++++++- .../src/popup/services/services.module.ts | 2 +- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 18883a5fe5e..7111b34875b 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -419,7 +419,7 @@ export default class MainBackground { this.logService = new ConsoleLogService(isDev); this.cryptoFunctionService = new WebCryptoFunctionService(self); this.keyGenerationService = new KeyGenerationService(this.cryptoFunctionService); - this.storageService = new BrowserLocalStorageService(); + this.storageService = new BrowserLocalStorageService(this.logService); this.intraprocessMessagingSubject = new Subject>>(); diff --git a/apps/browser/src/platform/services/browser-local-storage.service.ts b/apps/browser/src/platform/services/browser-local-storage.service.ts index 61a2653f137..9c315b7f6f4 100644 --- a/apps/browser/src/platform/services/browser-local-storage.service.ts +++ b/apps/browser/src/platform/services/browser-local-storage.service.ts @@ -1,10 +1,67 @@ -import AbstractChromeStorageService from "./abstractions/abstract-chrome-storage-api.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import AbstractChromeStorageService, { + SerializedValue, +} from "./abstractions/abstract-chrome-storage-api.service"; export default class BrowserLocalStorageService extends AbstractChromeStorageService { - constructor() { + constructor(private readonly logService: LogService) { super(chrome.storage.local); } + override async get(key: string): Promise { + return await this.getWithRetries(key, 0); + } + + private async getWithRetries(key: string, retryNum: number): Promise { + // See: https://github.com/EFForg/privacybadger/pull/2980 + const MAX_RETRIES = 5; + const WAIT_TIME = 200; + + const store = await this.getStore(key); + + if (store == null) { + if (retryNum >= MAX_RETRIES) { + throw new Error(`Failed to get a value for key '${key}', see logs for more details.`); + } + + retryNum++; + this.logService.warning(`Retrying attempt to get value for key '${key}' in ${WAIT_TIME}ms`); + await new Promise((resolve) => setTimeout(resolve, WAIT_TIME)); + return await this.getWithRetries(key, retryNum); + } + + // We have a store + return this.processGetObject(store[key] as T | SerializedValue); + } + + private async getStore(key: string) { + if (this.chromeStorageApi == null) { + this.logService.warning( + `chrome.storage.local was not initialized while retrieving key '${key}'.`, + ); + return null; + } + + return new Promise<{ [key: string]: unknown }>((resolve) => { + this.chromeStorageApi.get(key, (store) => { + if (chrome.runtime.lastError) { + this.logService.warning(`Failed to get value for key '${key}'`, chrome.runtime.lastError); + resolve(null); + return; + } + + if (store == null) { + this.logService.warning(`Store was empty while retrieving value for key '${key}'`); + resolve(null); + return; + } + + resolve(store); + }); + }); + } + async fillBuffer() { // Write 4MB of data in chrome.storage.local, log files will hold 4MB of data (by default) // before forcing a compaction. To force a compaction and have it remove previously saved data, diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index efbe9ce6bf5..129744fd3bc 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -304,7 +304,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: AbstractStorageService, useClass: BrowserLocalStorageService, - deps: [], + deps: [LogService], }), safeProvider({ provide: AutofillServiceAbstraction, From 0db179e97443db9996b8a65459516584ef7ba6c7 Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Mon, 23 Sep 2024 16:45:53 -0400 Subject: [PATCH 089/104] [PM-739] Using a space at the beginning of otpauth:// generate a wrong OTP (#11204) * Trimmed tariling whitespace from totp field * Trimmed tariling whitespace from totp field * Fix failing test --- libs/angular/src/vault/components/add-edit.component.ts | 5 +++++ .../login-details-section/login-details-section.component.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index 45475440d0a..255d553a3ec 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -329,6 +329,11 @@ export class AddEditComponent implements OnInit, OnDestroy { this.cipher.card.expYear = normalizeExpiryYearFormat(this.cipher.card.expYear); } + // trim whitespace from the TOTP field + if (this.cipher.type === this.cipherType.Login && this.cipher.login.totp) { + this.cipher.login.totp = this.cipher.login.totp.trim(); + } + if (this.cipher.name == null || this.cipher.name === "") { this.platformUtilsService.showToast( "error", diff --git a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.ts b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.ts index eb34f820df8..691b05be2b4 100644 --- a/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.ts +++ b/libs/vault/src/cipher-form/components/login-details-section/login-details-section.component.ts @@ -125,7 +125,7 @@ export class LoginDetailsSectionComponent implements OnInit { Object.assign(cipher.login, { username: value.username, password: value.password, - totp: value.totp, + totp: value.totp?.trim(), } as LoginView); return cipher; From 4b9935b28c48e5824a19166170604ec3a6911593 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Mon, 23 Sep 2024 15:01:48 -0700 Subject: [PATCH 090/104] [PM-12528] AC Fix Collection Refresh (#11207) * [PM-12528] Ensure collections refresh when the refresh$ subject emits * [PM-12528] Cleanup all collections observable --- .../app/vault/org-vault/vault.component.ts | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) 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 fce33a972bf..0a8e8769715 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -11,7 +11,6 @@ import { ActivatedRoute, Params, Router } from "@angular/router"; import { BehaviorSubject, combineLatest, - defer, firstValueFrom, lastValueFrom, Observable, @@ -283,27 +282,10 @@ export class VaultComponent implements OnInit, OnDestroy { this.currentSearchText$ = this.route.queryParams.pipe(map((queryParams) => queryParams.search)); - this.allCollectionsWithoutUnassigned$ = combineLatest([ - organizationId$.pipe(switchMap((orgId) => this.collectionAdminService.getAll(orgId))), - defer(() => this.collectionService.getAllDecrypted()), - ]).pipe( - map(([adminCollections, syncCollections]) => { - const syncCollectionDict = Object.fromEntries(syncCollections.map((c) => [c.id, c])); - - return adminCollections.map((collection) => { - const currentId: any = collection.id; - - const match = syncCollectionDict[currentId]; - - if (match) { - collection.manage = match.manage; - collection.readOnly = match.readOnly; - collection.hidePasswords = match.hidePasswords; - } - return collection; - }); - }), - shareReplay({ refCount: true, bufferSize: 1 }), + this.allCollectionsWithoutUnassigned$ = this.refresh$.pipe( + switchMap(() => organizationId$), + switchMap((orgId) => this.collectionAdminService.getAll(orgId)), + shareReplay({ refCount: false, bufferSize: 1 }), ); this.editableCollections$ = this.allCollectionsWithoutUnassigned$.pipe( @@ -367,7 +349,6 @@ export class VaultComponent implements OnInit, OnDestroy { map((ciphers) => { return Object.fromEntries(ciphers.map((c) => [c.id, c])); }), - shareReplay({ refCount: true, bufferSize: 1 }), ); const nestedCollections$ = allCollections$.pipe( From e691e2dadba1c959c92e6c8ca5a9b2afe0fd6858 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:48:23 +0000 Subject: [PATCH 091/104] Bumped client version(s) (#11211) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/package.json | 2 +- apps/browser/src/manifest.json | 2 +- apps/browser/src/manifest.v3.json | 2 +- apps/cli/package.json | 2 +- apps/desktop/package.json | 2 +- apps/desktop/src/package-lock.json | 4 ++-- apps/desktop/src/package.json | 2 +- apps/web/package.json | 2 +- package-lock.json | 8 ++++---- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/browser/package.json b/apps/browser/package.json index 4d008b684cb..fff378c72b9 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2024.9.1", + "version": "2024.9.2", "scripts": { "build": "cross-env MANIFEST_VERSION=3 webpack", "build:mv2": "webpack", diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 2d7f46fa59a..35692dd5674 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2024.9.1", + "version": "2024.9.2", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 5e132774e6e..7bd40691768 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2024.9.1", + "version": "2024.9.2", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/cli/package.json b/apps/cli/package.json index b5317794c35..8ab2afc4129 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2024.9.0", + "version": "2024.9.1", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 40ce2fec5d9..c50e7ccbac4 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2024.9.1", + "version": "2024.9.2", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index ce08dfde2cd..3bd771c66af 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2024.9.1", + "version": "2024.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2024.9.1", + "version": "2024.9.2", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native/napi", diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index e34641f1e09..29b3f8ed7d1 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2024.9.1", + "version": "2024.9.2", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/web/package.json b/apps/web/package.json index 37deab411b9..520c096a50c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2024.9.1", + "version": "2024.9.2", "scripts": { "build:oss": "webpack", "build:bit": "webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/package-lock.json b/package-lock.json index bfc943b55b5..b2058de0dc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -192,11 +192,11 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2024.9.1" + "version": "2024.9.2" }, "apps/cli": { "name": "@bitwarden/cli", - "version": "2024.9.0", + "version": "2024.9.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@koa/multer": "3.0.2", @@ -232,7 +232,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2024.9.1", + "version": "2024.9.2", "hasInstallScript": true, "license": "GPL-3.0" }, @@ -246,7 +246,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2024.9.1" + "version": "2024.9.2" }, "libs/admin-console": { "name": "@bitwarden/admin-console", From aa91a8d5ca0444b09bff6ff00cb4a13aff1cb789 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:12:27 -0700 Subject: [PATCH 092/104] fix send form defects (#11212) --- .../options/send-options.component.html | 13 +++++++---- .../send-details/send-details.component.html | 6 ++--- .../send-file-details.component.html | 22 ++++++++++--------- .../send-file-details.component.ts | 8 ++++++- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html index 9c5183aabd2..53483065b73 100644 --- a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html @@ -1,6 +1,6 @@ -

{{ "additionalOptions" | i18n }}

+

{{ "additionalOptions" | i18n }}

@@ -16,16 +16,21 @@ {{ "newPassword" | i18n }} - + {{ "sendPasswordDescV2" | i18n }} {{ "hideYourEmail" | i18n }} - + {{ "privateNote" | i18n }} - +
diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html index e5b99828fe4..98f399760be 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.html @@ -1,6 +1,6 @@ - -

{{ "sendDetails" | i18n }}

+ +

{{ "sendDetails" | i18n }}

@@ -34,7 +34,7 @@ > - + {{ "deletionDate" | i18n }}
-
{{ "file" | i18n }}
+
{{ "file" | i18n }}
{{ originalSendView.file.fileName }}
{{ originalSendView.file.sizeName }}
{{ "fileToShare" | i18n }} - - - {{ fileName || ("noFileChosen" | i18n) }} +
+ + + {{ fileName || ("noFileChosen" | i18n) }} +
Date: Tue, 24 Sep 2024 00:26:25 -0700 Subject: [PATCH 093/104] [PM-12505] - add delete send button to footer (#11187) * add delete send button to footer * add basic error handling * update copy. user bitAction * use arrow function. remove border class --- apps/browser/src/_locales/en/messages.json | 4 ++ .../add-edit/send-add-edit.component.html | 9 ++++ .../add-edit/send-add-edit.component.ts | 45 ++++++++++++++++++- .../send-list-items-container.component.ts | 2 +- 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 900c3b37caa..8c08caec353 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -2374,6 +2374,10 @@ "message": "Are you sure you want to delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "editSend": { "message": "Edit Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." diff --git a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html index 3e9a8d7c50d..7f723cc7364 100644 --- a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html +++ b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.html @@ -13,5 +13,14 @@ +
diff --git a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts index 49526bb032b..91311ab7e7a 100644 --- a/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts +++ b/apps/browser/src/tools/popup/send-v2/add-edit/send-add-edit.component.ts @@ -8,8 +8,16 @@ import { map, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; import { SendId } from "@bitwarden/common/types/guid"; -import { AsyncActionsModule, ButtonModule, SearchModule } from "@bitwarden/components"; +import { + AsyncActionsModule, + ButtonModule, + DialogService, + IconButtonModule, + SearchModule, + ToastService, +} from "@bitwarden/components"; import { DefaultSendFormConfigService, SendFormConfig, @@ -58,6 +66,7 @@ export type AddEditQueryParams = Partial>; JslibModule, FormsModule, ButtonModule, + IconButtonModule, PopupPageComponent, PopupHeaderComponent, PopupFooterComponent, @@ -81,6 +90,9 @@ export class SendAddEditComponent { private location: Location, private i18nService: I18nService, private addEditFormConfigService: SendFormConfigService, + private sendApiService: SendApiService, + private toastService: ToastService, + private dialogService: DialogService, ) { this.subscribeToParams(); } @@ -92,6 +104,37 @@ export class SendAddEditComponent { this.location.back(); } + deleteSend = async () => { + const confirmed = await this.dialogService.openSimpleDialog({ + title: { key: "deleteSend" }, + content: { key: "deleteSendPermanentConfirmation" }, + type: "warning", + }); + + if (!confirmed) { + return; + } + + try { + await this.sendApiService.delete(this.config.originalSend?.id); + } catch (e) { + this.toastService.showToast({ + variant: "error", + title: null, + message: e.message, + }); + return; + } + + this.location.back(); + + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("deletedSend"), + }); + }; + /** * Subscribes to the route query parameters and builds the configuration based on the parameters. */ diff --git a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts index 2dd8078fd7a..a0f10c2cea9 100644 --- a/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts +++ b/libs/tools/send/send-ui/src/send-list-items-container/send-list-items-container.component.ts @@ -64,7 +64,7 @@ export class SendListItemsContainerComponent { async deleteSend(s: SendView): Promise { const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "deleteSend" }, - content: { key: "deleteSendConfirmation" }, + content: { key: "deleteSendPermanentConfirmation" }, type: "warning", }); From d92b2cbea27feb62fd23d0bceed96fa588b6b519 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Tue, 24 Sep 2024 11:28:33 +0200 Subject: [PATCH 094/104] [PM-11477] Remove deprecated cryptoservice functions (#10854) * Remove deprecated cryptoservice functions * Use getUserkeyWithLegacySupport to get userkey * Fix tests * Fix tests * Fix tests * Remove unused cryptoservice instances * Fix build * Remove unused apiService in constructor * Fix encryption * Ensure passed in key is used if present * Fix sends and folders * Fix tests * Remove logged key * Fix import for account restricted keys --- .../browser/src/background/main.background.ts | 8 +++ .../background/nativeMessaging.background.ts | 6 ++- .../add-edit-folder-dialog.component.spec.ts | 35 ++++++++++-- .../add-edit-folder-dialog.component.ts | 9 +++- .../components/vault/attachments.component.ts | 3 ++ .../popup/components/vault/view.component.ts | 3 ++ .../settings/folder-add-edit.component.ts | 6 +++ apps/cli/src/commands/download.command.ts | 6 +-- apps/cli/src/commands/edit.command.ts | 9 +++- apps/cli/src/commands/get.command.ts | 8 +-- apps/cli/src/oss-serve-configurator.ts | 5 +- .../service-container/service-container.ts | 7 +++ .../src/tools/send/commands/get.command.ts | 6 +-- .../tools/send/commands/receive.command.ts | 8 +-- apps/cli/src/tools/send/send.program.ts | 7 +-- apps/cli/src/vault.program.ts | 3 ++ apps/cli/src/vault/create.command.ts | 8 ++- .../src/app/services/services.module.ts | 2 +- .../native-message-handler.service.ts | 8 +-- .../src/services/native-messaging.service.ts | 6 ++- .../vault/app/vault/attachments.component.ts | 3 ++ .../app/vault/folder-add-edit.component.ts | 6 +++ .../src/vault/app/vault/view.component.ts | 3 ++ .../emergency-access-attachments.component.ts | 3 ++ .../organization-plans.component.ts | 6 ++- .../tools/send/send-access-file.component.ts | 6 +-- .../vault/core/collection-admin.service.ts | 6 ++- .../individual-vault/attachments.component.ts | 3 ++ .../folder-add-edit.component.ts | 11 +++- .../vault/org-vault/attachments.component.ts | 3 ++ .../bit-cli/src/service-container.ts | 1 + .../organization-auth-request.service.spec.ts | 4 ++ .../organization-auth-request.service.ts | 4 +- .../device-approvals.component.ts | 8 ++- .../services/web-provider.service.ts | 2 +- .../src/services/jslib-services.module.ts | 10 +++- .../vault/components/attachments.component.ts | 6 ++- .../components/folder-add-edit.component.ts | 9 +++- .../src/vault/components/view.component.ts | 4 +- .../auth-request-login.strategy.spec.ts | 3 ++ .../login-strategies/login.strategy.spec.ts | 5 ++ .../common/login-strategies/login.strategy.ts | 2 + .../password-login.strategy.spec.ts | 4 ++ .../sso-login.strategy.spec.ts | 4 ++ .../user-api-login.strategy.spec.ts | 3 ++ .../webauthn-login.strategy.spec.ts | 14 +++-- .../webauthn-login.strategy.ts | 2 +- .../login-strategy.service.ts | 1 + .../platform/abstractions/crypto.service.ts | 32 ----------- .../src/platform/services/crypto.service.ts | 53 ------------------- .../src/tools/send/models/domain/send.spec.ts | 12 +++-- .../src/tools/send/models/domain/send.ts | 4 +- .../folder/folder.service.abstraction.ts | 2 +- .../src/vault/services/cipher.service.spec.ts | 16 +++++- .../src/vault/services/cipher.service.ts | 43 +++++++++------ .../src/vault/services/collection.service.ts | 5 +- .../services/folder/folder.service.spec.ts | 14 +++-- .../vault/services/folder/folder.service.ts | 7 ++- ...warden-password-protected-importer.spec.ts | 6 ++- .../src/components/import.component.ts | 2 + .../bitwarden/bitwarden-json-importer.ts | 14 +++-- .../bitwarden-password-protected-importer.ts | 8 +-- .../src/services/import.service.spec.ts | 4 ++ libs/importer/src/services/import.service.ts | 6 ++- .../src/services/base-vault-export.service.ts | 8 +-- .../individual-vault-export.service.spec.ts | 27 ++++++++-- .../individual-vault-export.service.ts | 15 ++++-- .../src/services/org-vault-export.service.ts | 8 +-- .../src/services/vault-export.service.spec.ts | 26 +++++++-- 69 files changed, 404 insertions(+), 197 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 7111b34875b..43a6d5968e9 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -693,6 +693,7 @@ export default class MainBackground { this.collectionService = new CollectionService( this.cryptoService, + this.encryptService, this.i18nService, this.stateProvider, ); @@ -803,9 +804,11 @@ export default class MainBackground { this.cipherFileUploadService, this.configService, this.stateProvider, + this.accountService, ); this.folderService = new FolderService( this.cryptoService, + this.encryptService, this.i18nService, this.cipherService, this.stateProvider, @@ -977,6 +980,7 @@ export default class MainBackground { this.i18nService, this.collectionService, this.cryptoService, + this.encryptService, this.pinService, this.accountService, ); @@ -986,8 +990,10 @@ export default class MainBackground { this.cipherService, this.pinService, this.cryptoService, + this.encryptService, this.cryptoFunctionService, this.kdfConfigService, + this.accountService, ); this.organizationVaultExportService = new OrganizationVaultExportService( @@ -995,6 +1001,7 @@ export default class MainBackground { this.apiService, this.pinService, this.cryptoService, + this.encryptService, this.cryptoFunctionService, this.collectionService, this.kdfConfigService, @@ -1098,6 +1105,7 @@ export default class MainBackground { ); this.nativeMessagingBackground = new NativeMessagingBackground( this.cryptoService, + this.encryptService, this.cryptoFunctionService, this.runtimeBackground, this.messagingService, diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 8f2cac7915c..68a43fbdfe3 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -6,6 +6,7 @@ import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authenticatio import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -73,6 +74,7 @@ export class NativeMessagingBackground { constructor( private cryptoService: CryptoService, + private encryptService: EncryptService, private cryptoFunctionService: CryptoFunctionService, private runtimeBackground: RuntimeBackground, private messagingService: MessagingService, @@ -227,7 +229,7 @@ export class NativeMessagingBackground { await this.secureCommunication(); } - return await this.cryptoService.encrypt(JSON.stringify(message), this.sharedSecret); + return await this.encryptService.encrypt(JSON.stringify(message), this.sharedSecret); } getResponse(): Promise { @@ -273,7 +275,7 @@ export class NativeMessagingBackground { let message = rawMessage as ReceiveMessage; if (!this.platformUtilsService.isSafari()) { message = JSON.parse( - await this.cryptoService.decryptToUtf8(rawMessage as EncString, this.sharedSecret), + await this.encryptService.decryptToUtf8(rawMessage as EncString, this.sharedSecret), ); } diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts index 8453b4cc63e..156cc9d8195 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts @@ -1,9 +1,13 @@ import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { BehaviorSubject } from "rxjs"; +import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { Folder } from "@bitwarden/common/vault/models/domain/folder"; @@ -25,6 +29,7 @@ describe("AddEditFolderDialogComponent", () => { const save = jest.fn().mockResolvedValue(null); const deleteFolder = jest.fn().mockResolvedValue(null); const openSimpleDialog = jest.fn().mockResolvedValue(true); + const getUserKeyWithLegacySupport = jest.fn().mockResolvedValue(""); const error = jest.fn(); const close = jest.fn(); const showToast = jest.fn(); @@ -41,12 +46,29 @@ describe("AddEditFolderDialogComponent", () => { close.mockClear(); showToast.mockClear(); + const userId = "" as UserId; + const accountInfo: AccountInfo = { + email: "", + emailVerified: true, + name: undefined, + }; + await TestBed.configureTestingModule({ imports: [AddEditFolderDialogComponent, NoopAnimationsModule], providers: [ { provide: I18nService, useValue: { t: (key: string) => key } }, { provide: FolderService, useValue: { encrypt } }, { provide: FolderApiServiceAbstraction, useValue: { save, delete: deleteFolder } }, + { + provide: AccountService, + useValue: { activeAccount$: new BehaviorSubject({ id: userId, ...accountInfo }) }, + }, + { + provide: CryptoService, + useValue: { + getUserKeyWithLegacySupport, + }, + }, { provide: LogService, useValue: { error } }, { provide: ToastService, useValue: { showToast } }, { provide: DIALOG_DATA, useValue: dialogData }, @@ -82,7 +104,7 @@ describe("AddEditFolderDialogComponent", () => { const newFolder = new FolderView(); newFolder.name = "New Folder"; - expect(encrypt).toHaveBeenCalledWith(newFolder); + expect(encrypt).toHaveBeenCalledWith(newFolder, ""); expect(save).toHaveBeenCalled(); }); @@ -137,10 +159,13 @@ describe("AddEditFolderDialogComponent", () => { component.folderForm.controls.name.setValue("Edited Folder"); await component.submit(); - expect(encrypt).toHaveBeenCalledWith({ - ...dialogData.editFolderConfig.folder, - name: "Edited Folder", - }); + expect(encrypt).toHaveBeenCalledWith( + { + ...dialogData.editFolderConfig.folder, + name: "Edited Folder", + }, + "", + ); }); it("deletes the folder", async () => { diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts index 33263533990..4f793abb6a0 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit-folder-dialog/add-edit-folder-dialog.component.ts @@ -11,8 +11,11 @@ import { } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms"; +import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; @@ -68,6 +71,8 @@ export class AddEditFolderDialogComponent implements AfterViewInit, OnInit { private formBuilder: FormBuilder, private folderService: FolderService, private folderApiService: FolderApiServiceAbstraction, + private accountService: AccountService, + private cryptoService: CryptoService, private toastService: ToastService, private i18nService: I18nService, private logService: LogService, @@ -107,7 +112,9 @@ export class AddEditFolderDialogComponent implements AfterViewInit, OnInit { this.folder.name = this.folderForm.controls.name.value; try { - const folder = await this.folderService.encrypt(this.folder); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$); + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeUserId.id); + const folder = await this.folderService.encrypt(this.folder, userKey); await this.folderApiService.save(folder); this.toastService.showToast({ diff --git a/apps/browser/src/vault/popup/components/vault/attachments.component.ts b/apps/browser/src/vault/popup/components/vault/attachments.component.ts index 75819689b44..1ab1ff428b2 100644 --- a/apps/browser/src/vault/popup/components/vault/attachments.component.ts +++ b/apps/browser/src/vault/popup/components/vault/attachments.component.ts @@ -8,6 +8,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -28,6 +29,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent implements On cipherService: CipherService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, platformUtilsService: PlatformUtilsService, apiService: ApiService, private location: Location, @@ -44,6 +46,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent implements On cipherService, i18nService, cryptoService, + encryptService, platformUtilsService, apiService, window, diff --git a/apps/browser/src/vault/popup/components/vault/view.component.ts b/apps/browser/src/vault/popup/components/vault/view.component.ts index f8e7de21dc8..a77a27046af 100644 --- a/apps/browser/src/vault/popup/components/vault/view.component.ts +++ b/apps/browser/src/vault/popup/components/vault/view.component.ts @@ -13,6 +13,7 @@ import { TokenService } from "@bitwarden/common/auth/abstractions/token.service" import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -80,6 +81,7 @@ export class ViewComponent extends BaseViewComponent implements OnInit, OnDestro tokenService: TokenService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, platformUtilsService: PlatformUtilsService, auditService: AuditService, private route: ActivatedRoute, @@ -108,6 +110,7 @@ export class ViewComponent extends BaseViewComponent implements OnInit, OnDestro tokenService, i18nService, cryptoService, + encryptService, platformUtilsService, auditService, window, diff --git a/apps/browser/src/vault/popup/settings/folder-add-edit.component.ts b/apps/browser/src/vault/popup/settings/folder-add-edit.component.ts index b873735b460..3ef5fc73aa9 100644 --- a/apps/browser/src/vault/popup/settings/folder-add-edit.component.ts +++ b/apps/browser/src/vault/popup/settings/folder-add-edit.component.ts @@ -4,6 +4,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; import { FolderAddEditComponent as BaseFolderAddEditComponent } from "@bitwarden/angular/vault/components/folder-add-edit.component"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.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"; @@ -20,6 +22,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent implement constructor( folderService: FolderService, folderApiService: FolderApiServiceAbstraction, + accountService: AccountService, + cryptoService: CryptoService, i18nService: I18nService, platformUtilsService: PlatformUtilsService, private router: Router, @@ -31,6 +35,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent implement super( folderService, folderApiService, + accountService, + cryptoService, i18nService, platformUtilsService, logService, diff --git a/apps/cli/src/commands/download.command.ts b/apps/cli/src/commands/download.command.ts index e417b7c3b88..f819875063d 100644 --- a/apps/cli/src/commands/download.command.ts +++ b/apps/cli/src/commands/download.command.ts @@ -1,6 +1,6 @@ import * as fet from "node-fetch"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncArrayBuffer } from "@bitwarden/common/platform/models/domain/enc-array-buffer"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; @@ -9,7 +9,7 @@ import { FileResponse } from "../models/response/file.response"; import { CliUtils } from "../utils"; export abstract class DownloadCommand { - constructor(protected cryptoService: CryptoService) {} + constructor(protected encryptService: EncryptService) {} protected async saveAttachmentToFile( url: string, @@ -26,7 +26,7 @@ export abstract class DownloadCommand { try { const encBuf = await EncArrayBuffer.fromResponse(response); - const decBuf = await this.cryptoService.decryptFromBytes(encBuf, key); + const decBuf = await this.encryptService.decryptToBytes(encBuf, key); if (process.env.BW_SERVE === "true") { const res = new FileResponse(Buffer.from(decBuf), fileName); return Response.success(res); diff --git a/apps/cli/src/commands/edit.command.ts b/apps/cli/src/commands/edit.command.ts index bac1cce7c75..84ed7190a54 100644 --- a/apps/cli/src/commands/edit.command.ts +++ b/apps/cli/src/commands/edit.command.ts @@ -7,6 +7,7 @@ import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; import { FolderExport } from "@bitwarden/common/models/export/folder.export"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; @@ -25,6 +26,7 @@ export class EditCommand { private cipherService: CipherService, private folderService: FolderService, private cryptoService: CryptoService, + private encryptService: EncryptService, private apiService: ApiService, private folderApiService: FolderApiServiceAbstraction, private accountService: AccountService, @@ -139,7 +141,10 @@ export class EditCommand { let folderView = await folder.decrypt(); folderView = FolderExport.toView(req, folderView); - const encFolder = await this.folderService.encrypt(folderView); + + const activeUserId = await firstValueFrom(this.accountService.activeAccount$); + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeUserId.id); + const encFolder = await this.folderService.encrypt(folderView, userKey); try { await this.folderApiService.save(encFolder); const updatedFolder = await this.folderService.get(folder.id); @@ -187,7 +192,7 @@ export class EditCommand { (u) => new SelectionReadOnlyRequest(u.id, u.readOnly, u.hidePasswords, u.manage), ); const request = new CollectionRequest(); - request.name = (await this.cryptoService.encrypt(req.name, orgKey)).encryptedString; + request.name = (await this.encryptService.encrypt(req.name, orgKey)).encryptedString; request.externalId = req.externalId; request.groups = groups; request.users = users; diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index 923187bfcd0..3b2b18c66e3 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -20,6 +20,7 @@ import { LoginExport } from "@bitwarden/common/models/export/login.export"; import { SecureNoteExport } from "@bitwarden/common/models/export/secure-note.export"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; 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"; @@ -56,7 +57,8 @@ export class GetCommand extends DownloadCommand { private collectionService: CollectionService, private totpService: TotpService, private auditService: AuditService, - cryptoService: CryptoService, + private cryptoService: CryptoService, + encryptService: EncryptService, private stateService: StateService, private searchService: SearchService, private apiService: ApiService, @@ -65,7 +67,7 @@ export class GetCommand extends DownloadCommand { private accountProfileService: BillingAccountProfileStateService, private accountService: AccountService, ) { - super(cryptoService); + super(encryptService); } async run(object: string, id: string, cmdOptions: Record): Promise { @@ -451,7 +453,7 @@ export class GetCommand extends DownloadCommand { const response = await this.apiService.getCollectionAccessDetails(options.organizationId, id); const decCollection = new CollectionView(response); - decCollection.name = await this.cryptoService.decryptToUtf8( + decCollection.name = await this.encryptService.decryptToUtf8( new EncString(response.name), orgKey, ); diff --git a/apps/cli/src/oss-serve-configurator.ts b/apps/cli/src/oss-serve-configurator.ts index d7ef9ac871d..fd2a10975f3 100644 --- a/apps/cli/src/oss-serve-configurator.ts +++ b/apps/cli/src/oss-serve-configurator.ts @@ -57,6 +57,7 @@ export class OssServeConfigurator { this.serviceContainer.totpService, this.serviceContainer.auditService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.stateService, this.serviceContainer.searchService, this.serviceContainer.apiService, @@ -79,6 +80,7 @@ export class OssServeConfigurator { this.serviceContainer.cipherService, this.serviceContainer.folderService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.apiService, this.serviceContainer.folderApiService, this.serviceContainer.billingAccountProfileStateService, @@ -89,6 +91,7 @@ export class OssServeConfigurator { this.serviceContainer.cipherService, this.serviceContainer.folderService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.apiService, this.serviceContainer.folderApiService, this.serviceContainer.accountService, @@ -150,7 +153,7 @@ export class OssServeConfigurator { this.serviceContainer.sendService, this.serviceContainer.environmentService, this.serviceContainer.searchService, - this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, ); this.sendEditCommand = new SendEditCommand( this.serviceContainer.sendService, diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index b9225fec43d..98c5fc86b52 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -494,6 +494,7 @@ export class ServiceContainer { this.collectionService = new CollectionService( this.cryptoService, + this.encryptService, this.i18nService, this.stateProvider, ); @@ -631,10 +632,12 @@ export class ServiceContainer { this.cipherFileUploadService, this.configService, this.stateProvider, + this.accountService, ); this.folderService = new FolderService( this.cryptoService, + this.encryptService, this.i18nService, this.cipherService, this.stateProvider, @@ -721,6 +724,7 @@ export class ServiceContainer { this.i18nService, this.collectionService, this.cryptoService, + this.encryptService, this.pinService, this.accountService, ); @@ -730,8 +734,10 @@ export class ServiceContainer { this.cipherService, this.pinService, this.cryptoService, + this.encryptService, this.cryptoFunctionService, this.kdfConfigService, + this.accountService, ); this.organizationExportService = new OrganizationVaultExportService( @@ -739,6 +745,7 @@ export class ServiceContainer { this.apiService, this.pinService, this.cryptoService, + this.encryptService, this.cryptoFunctionService, this.collectionService, this.kdfConfigService, diff --git a/apps/cli/src/tools/send/commands/get.command.ts b/apps/cli/src/tools/send/commands/get.command.ts index 2ffe2423174..057a1c27f33 100644 --- a/apps/cli/src/tools/send/commands/get.command.ts +++ b/apps/cli/src/tools/send/commands/get.command.ts @@ -2,7 +2,7 @@ import { OptionValues } from "commander"; import { firstValueFrom } from "rxjs"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; @@ -17,9 +17,9 @@ export class SendGetCommand extends DownloadCommand { private sendService: SendService, private environmentService: EnvironmentService, private searchService: SearchService, - cryptoService: CryptoService, + encryptService: EncryptService, ) { - super(cryptoService); + super(encryptService); } async run(id: string, options: OptionValues) { diff --git a/apps/cli/src/tools/send/commands/receive.command.ts b/apps/cli/src/tools/send/commands/receive.command.ts index dc662f02727..a8740992f72 100644 --- a/apps/cli/src/tools/send/commands/receive.command.ts +++ b/apps/cli/src/tools/send/commands/receive.command.ts @@ -2,10 +2,10 @@ import { OptionValues } from "commander"; import * as inquirer from "inquirer"; import { firstValueFrom } from "rxjs"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -27,14 +27,14 @@ export class SendReceiveCommand extends DownloadCommand { private sendAccessRequest: SendAccessRequest; constructor( - private apiService: ApiService, - cryptoService: CryptoService, + private cryptoService: CryptoService, + encryptService: EncryptService, private cryptoFunctionService: CryptoFunctionService, private platformUtilsService: PlatformUtilsService, private environmentService: EnvironmentService, private sendApiService: SendApiService, ) { - super(cryptoService); + super(encryptService); } async run(url: string, options: OptionValues): Promise { diff --git a/apps/cli/src/tools/send/send.program.ts b/apps/cli/src/tools/send/send.program.ts index 05e7e7d22d7..878eaa52b24 100644 --- a/apps/cli/src/tools/send/send.program.ts +++ b/apps/cli/src/tools/send/send.program.ts @@ -100,8 +100,8 @@ export class SendProgram extends BaseProgram { }) .action(async (url: string, options: OptionValues) => { const cmd = new SendReceiveCommand( - this.serviceContainer.apiService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.cryptoFunctionService, this.serviceContainer.platformUtilsService, this.serviceContainer.environmentService, @@ -143,6 +143,7 @@ export class SendProgram extends BaseProgram { this.serviceContainer.totpService, this.serviceContainer.auditService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.stateService, this.serviceContainer.searchService, this.serviceContainer.apiService, @@ -187,7 +188,7 @@ export class SendProgram extends BaseProgram { this.serviceContainer.sendService, this.serviceContainer.environmentService, this.serviceContainer.searchService, - this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, ); const response = await cmd.run(id, options); this.processResponse(response); @@ -246,7 +247,7 @@ export class SendProgram extends BaseProgram { this.serviceContainer.sendService, this.serviceContainer.environmentService, this.serviceContainer.searchService, - this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, ); const cmd = new SendEditCommand( this.serviceContainer.sendService, diff --git a/apps/cli/src/vault.program.ts b/apps/cli/src/vault.program.ts index 2dad9a7c68a..11876ef6ece 100644 --- a/apps/cli/src/vault.program.ts +++ b/apps/cli/src/vault.program.ts @@ -178,6 +178,7 @@ export class VaultProgram extends BaseProgram { this.serviceContainer.totpService, this.serviceContainer.auditService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.stateService, this.serviceContainer.searchService, this.serviceContainer.apiService, @@ -224,6 +225,7 @@ export class VaultProgram extends BaseProgram { this.serviceContainer.cipherService, this.serviceContainer.folderService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.apiService, this.serviceContainer.folderApiService, this.serviceContainer.billingAccountProfileStateService, @@ -272,6 +274,7 @@ export class VaultProgram extends BaseProgram { this.serviceContainer.cipherService, this.serviceContainer.folderService, this.serviceContainer.cryptoService, + this.serviceContainer.encryptService, this.serviceContainer.apiService, this.serviceContainer.folderApiService, this.serviceContainer.accountService, diff --git a/apps/cli/src/vault/create.command.ts b/apps/cli/src/vault/create.command.ts index 0284ccc37bd..fc52720f77d 100644 --- a/apps/cli/src/vault/create.command.ts +++ b/apps/cli/src/vault/create.command.ts @@ -12,6 +12,7 @@ import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; import { FolderExport } from "@bitwarden/common/models/export/folder.export"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; @@ -31,6 +32,7 @@ export class CreateCommand { private cipherService: CipherService, private folderService: FolderService, private cryptoService: CryptoService, + private encryptService: EncryptService, private apiService: ApiService, private folderApiService: FolderApiServiceAbstraction, private accountProfileService: BillingAccountProfileStateService, @@ -167,7 +169,9 @@ export class CreateCommand { } private async createFolder(req: FolderExport) { - const folder = await this.folderService.encrypt(FolderExport.toView(req)); + const activeAccountId = await firstValueFrom(this.accountService.activeAccount$); + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeAccountId.id); + const folder = await this.folderService.encrypt(FolderExport.toView(req), userKey); try { await this.folderApiService.save(folder); const newFolder = await this.folderService.get(folder.id); @@ -210,7 +214,7 @@ export class CreateCommand { (u) => new SelectionReadOnlyRequest(u.id, u.readOnly, u.hidePasswords, u.manage), ); const request = new CollectionRequest(); - request.name = (await this.cryptoService.encrypt(req.name, orgKey)).encryptedString; + request.name = (await this.encryptService.encrypt(req.name, orgKey)).encryptedString; request.externalId = req.externalId; request.groups = groups; request.users = users; diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index d5672f54c0f..a6db7fe5db4 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -234,7 +234,7 @@ const safeProviders: SafeProvider[] = [ provide: NativeMessageHandlerService, deps: [ StateServiceAbstraction, - CryptoServiceAbstraction, + EncryptService, CryptoFunctionServiceAbstraction, MessagingServiceAbstraction, EncryptedMessageHandlerService, diff --git a/apps/desktop/src/services/native-message-handler.service.ts b/apps/desktop/src/services/native-message-handler.service.ts index 065726559b1..106dc11e41b 100644 --- a/apps/desktop/src/services/native-message-handler.service.ts +++ b/apps/desktop/src/services/native-message-handler.service.ts @@ -3,7 +3,7 @@ import { firstValueFrom } from "rxjs"; import { NativeMessagingVersion } from "@bitwarden/common/enums"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -31,7 +31,7 @@ export class NativeMessageHandlerService { constructor( private stateService: StateService, - private cryptoService: CryptoService, + private encryptService: EncryptService, private cryptoFunctionService: CryptoFunctionService, private messagingService: MessagingService, private encryptedMessageHandlerService: EncryptedMessageHandlerService, @@ -162,7 +162,7 @@ export class NativeMessageHandlerService { payload: DecryptedCommandData, key: SymmetricCryptoKey, ): Promise { - return await this.cryptoService.encrypt(JSON.stringify(payload), key); + return await this.encryptService.encrypt(JSON.stringify(payload), key); } private async decryptPayload(message: EncryptedMessage): Promise { @@ -182,7 +182,7 @@ export class NativeMessageHandlerService { } try { - let decryptedResult = await this.cryptoService.decryptToUtf8( + let decryptedResult = await this.encryptService.decryptToUtf8( message.encryptedCommand as EncString, this.ddgSharedSecret, ); diff --git a/apps/desktop/src/services/native-messaging.service.ts b/apps/desktop/src/services/native-messaging.service.ts index f106d137b76..2b218001947 100644 --- a/apps/desktop/src/services/native-messaging.service.ts +++ b/apps/desktop/src/services/native-messaging.service.ts @@ -6,6 +6,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service"; @@ -33,6 +34,7 @@ export class NativeMessagingService { constructor( private cryptoFunctionService: CryptoFunctionService, private cryptoService: CryptoService, + private encryptService: EncryptService, private logService: LogService, private messagingService: MessagingService, private desktopSettingService: DesktopSettingsService, @@ -111,7 +113,7 @@ export class NativeMessagingService { } const message: LegacyMessage = JSON.parse( - await this.cryptoService.decryptToUtf8( + await this.encryptService.decryptToUtf8( rawMessage as EncString, SymmetricCryptoKey.fromString(await ipc.platform.ephemeralStore.getEphemeralValue(appId)), ), @@ -224,7 +226,7 @@ export class NativeMessagingService { private async send(message: any, appId: string) { message.timestamp = Date.now(); - const encrypted = await this.cryptoService.encrypt( + const encrypted = await this.encryptService.encrypt( JSON.stringify(message), SymmetricCryptoKey.fromString(await ipc.platform.ephemeralStore.getEphemeralValue(appId)), ); diff --git a/apps/desktop/src/vault/app/vault/attachments.component.ts b/apps/desktop/src/vault/app/vault/attachments.component.ts index 2e25d390872..47e08a13cde 100644 --- a/apps/desktop/src/vault/app/vault/attachments.component.ts +++ b/apps/desktop/src/vault/app/vault/attachments.component.ts @@ -5,6 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -22,6 +23,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent { cipherService: CipherService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, platformUtilsService: PlatformUtilsService, apiService: ApiService, logService: LogService, @@ -36,6 +38,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent { cipherService, i18nService, cryptoService, + encryptService, platformUtilsService, apiService, window, diff --git a/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts b/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts index 3865ec4837c..0cc55d65f3e 100644 --- a/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts @@ -2,6 +2,8 @@ import { Component } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { FolderAddEditComponent as BaseFolderAddEditComponent } from "@bitwarden/angular/vault/components/folder-add-edit.component"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.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"; @@ -17,6 +19,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { constructor( folderService: FolderService, folderApiService: FolderApiServiceAbstraction, + accountService: AccountService, + cryptoService: CryptoService, i18nService: I18nService, platformUtilsService: PlatformUtilsService, logService: LogService, @@ -26,6 +30,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { super( folderService, folderApiService, + accountService, + cryptoService, i18nService, platformUtilsService, logService, diff --git a/apps/desktop/src/vault/app/vault/view.component.ts b/apps/desktop/src/vault/app/vault/view.component.ts index 140e1e9ced6..7f2fb9ceae5 100644 --- a/apps/desktop/src/vault/app/vault/view.component.ts +++ b/apps/desktop/src/vault/app/vault/view.component.ts @@ -19,6 +19,7 @@ import { TokenService } from "@bitwarden/common/auth/abstractions/token.service" import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -48,6 +49,7 @@ export class ViewComponent extends BaseViewComponent implements OnInit, OnDestro tokenService: TokenService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, platformUtilsService: PlatformUtilsService, auditService: AuditService, broadcasterService: BroadcasterService, @@ -72,6 +74,7 @@ export class ViewComponent extends BaseViewComponent implements OnInit, OnDestro tokenService, i18nService, cryptoService, + encryptService, platformUtilsService, auditService, window, diff --git a/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts b/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts index e0a6f6c53d5..4912a866fd1 100644 --- a/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts @@ -5,6 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -26,6 +27,7 @@ export class EmergencyAccessAttachmentsComponent extends BaseAttachmentsComponen cipherService: CipherService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, stateService: StateService, platformUtilsService: PlatformUtilsService, apiService: ApiService, @@ -40,6 +42,7 @@ export class EmergencyAccessAttachmentsComponent extends BaseAttachmentsComponen cipherService, i18nService, cryptoService, + encryptService, platformUtilsService, apiService, window, diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts index 3d02fa027ef..924b128a50a 100644 --- a/apps/web/src/app/billing/organizations/organization-plans.component.ts +++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts @@ -31,6 +31,7 @@ import { PlanResponse } from "@bitwarden/common/billing/models/response/plan.res import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -147,6 +148,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private cryptoService: CryptoService, + private encryptService: EncryptService, private router: Router, private syncService: SyncService, private policyService: PolicyService, @@ -590,7 +592,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { if (this.createOrganization) { const orgKey = await this.cryptoService.makeOrgKey(); const key = orgKey[0].encryptedString; - const collection = await this.cryptoService.encrypt( + const collection = await this.encryptService.encrypt( this.i18nService.t("defaultCollection"), orgKey[1], ); @@ -744,7 +746,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { ); const providerKey = await this.cryptoService.getProviderKey(this.providerId); providerRequest.organizationCreateRequest.key = ( - await this.cryptoService.encrypt(orgKey.key, providerKey) + await this.encryptService.encrypt(orgKey.key, providerKey) ).encryptedString; const orgId = ( await this.apiService.postProviderCreateOrganization(this.providerId, providerRequest) diff --git a/apps/web/src/app/tools/send/send-access-file.component.ts b/apps/web/src/app/tools/send/send-access-file.component.ts index 8bb3558a69d..1efabb5fec7 100644 --- a/apps/web/src/app/tools/send/send-access-file.component.ts +++ b/apps/web/src/app/tools/send/send-access-file.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from "@angular/core"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -26,7 +26,7 @@ export class SendAccessFileComponent { constructor( private i18nService: I18nService, private toastService: ToastService, - private cryptoService: CryptoService, + private encryptService: EncryptService, private fileDownloadService: FileDownloadService, private sendApiService: SendApiService, ) {} @@ -62,7 +62,7 @@ export class SendAccessFileComponent { try { const encBuf = await EncArrayBuffer.fromResponse(response); - const decBuf = await this.cryptoService.decryptFromBytes(encBuf, this.decKey); + const decBuf = await this.encryptService.decryptToBytes(encBuf, this.decKey); this.fileDownloadService.download({ fileName: this.send.file.fileName, blobData: decBuf, diff --git a/apps/web/src/app/vault/core/collection-admin.service.ts b/apps/web/src/app/vault/core/collection-admin.service.ts index b6ddd452a1d..e0c15e34047 100644 --- a/apps/web/src/app/vault/core/collection-admin.service.ts +++ b/apps/web/src/app/vault/core/collection-admin.service.ts @@ -3,6 +3,7 @@ import { Injectable } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; import { CollectionData } from "@bitwarden/common/vault/models/data/collection.data"; @@ -23,6 +24,7 @@ export class CollectionAdminService { constructor( private apiService: ApiService, private cryptoService: CryptoService, + private encryptService: EncryptService, private collectionService: CollectionService, ) {} @@ -116,7 +118,7 @@ export class CollectionAdminService { const promises = collections.map(async (c) => { const view = new CollectionAdminView(); view.id = c.id; - view.name = await this.cryptoService.decryptToUtf8(new EncString(c.name), orgKey); + view.name = await this.encryptService.decryptToUtf8(new EncString(c.name), orgKey); view.externalId = c.externalId; view.organizationId = c.organizationId; @@ -146,7 +148,7 @@ export class CollectionAdminService { } const collection = new CollectionRequest(); collection.externalId = model.externalId; - collection.name = (await this.cryptoService.encrypt(model.name, key)).encryptedString; + collection.name = (await this.encryptService.encrypt(model.name, key)).encryptedString; collection.groups = model.groups.map( (group) => new SelectionReadOnlyRequest(group.id, group.readOnly, group.hidePasswords, group.manage), diff --git a/apps/web/src/app/vault/individual-vault/attachments.component.ts b/apps/web/src/app/vault/individual-vault/attachments.component.ts index b578efcae67..bb070ef6887 100644 --- a/apps/web/src/app/vault/individual-vault/attachments.component.ts +++ b/apps/web/src/app/vault/individual-vault/attachments.component.ts @@ -5,6 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -25,6 +26,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent { cipherService: CipherService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, stateService: StateService, platformUtilsService: PlatformUtilsService, apiService: ApiService, @@ -39,6 +41,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent { cipherService, i18nService, cryptoService, + encryptService, platformUtilsService, apiService, window, diff --git a/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts b/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts index fe61d9b9a11..bc31cdc8cde 100644 --- a/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts +++ b/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts @@ -1,8 +1,11 @@ import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog"; import { Component, Inject } from "@angular/core"; import { FormBuilder } from "@angular/forms"; +import { firstValueFrom } from "rxjs"; import { FolderAddEditComponent as BaseFolderAddEditComponent } from "@bitwarden/angular/vault/components/folder-add-edit.component"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.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,6 +22,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { constructor( folderService: FolderService, folderApiService: FolderApiServiceAbstraction, + protected accountSerivce: AccountService, + protected cryptoService: CryptoService, i18nService: I18nService, platformUtilsService: PlatformUtilsService, logService: LogService, @@ -31,6 +36,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { super( folderService, folderApiService, + accountSerivce, + cryptoService, i18nService, platformUtilsService, logService, @@ -73,7 +80,9 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { } try { - const folder = await this.folderService.encrypt(this.folder); + const activeAccountId = (await firstValueFrom(this.accountSerivce.activeAccount$)).id; + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeAccountId); + const folder = await this.folderService.encrypt(this.folder, userKey); this.formPromise = this.folderApiService.save(folder); await this.formPromise; this.platformUtilsService.showToast( diff --git a/apps/web/src/app/vault/org-vault/attachments.component.ts b/apps/web/src/app/vault/org-vault/attachments.component.ts index 2bba4d389c0..62e65ade5de 100644 --- a/apps/web/src/app/vault/org-vault/attachments.component.ts +++ b/apps/web/src/app/vault/org-vault/attachments.component.ts @@ -5,6 +5,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -31,6 +32,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent implements On cipherService: CipherService, i18nService: I18nService, cryptoService: CryptoService, + encryptService: EncryptService, stateService: StateService, platformUtilsService: PlatformUtilsService, apiService: ApiService, @@ -45,6 +47,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent implements On cipherService, i18nService, cryptoService, + encryptService, stateService, platformUtilsService, apiService, diff --git a/bitwarden_license/bit-cli/src/service-container.ts b/bitwarden_license/bit-cli/src/service-container.ts index 716c045fd16..c624afd9460 100644 --- a/bitwarden_license/bit-cli/src/service-container.ts +++ b/bitwarden_license/bit-cli/src/service-container.ts @@ -18,6 +18,7 @@ export class ServiceContainer extends OssServiceContainer { this.organizationAuthRequestService = new OrganizationAuthRequestService( this.organizationAuthRequestApiService, this.cryptoService, + this.encryptService, this.organizationUserApiService, ); } diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts index a8e6445d331..3ee89cbda51 100644 --- a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts +++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.spec.ts @@ -6,6 +6,7 @@ import { } from "@bitwarden/admin-console/common"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; import { OrganizationAuthRequestApiService } from "./organization-auth-request-api.service"; @@ -16,16 +17,19 @@ import { PendingAuthRequestView } from "./pending-auth-request.view"; describe("OrganizationAuthRequestService", () => { let organizationAuthRequestApiService: MockProxy; let cryptoService: MockProxy; + let encryptService: MockProxy; let organizationUserApiService: MockProxy; let organizationAuthRequestService: OrganizationAuthRequestService; beforeEach(() => { organizationAuthRequestApiService = mock(); cryptoService = mock(); + encryptService = mock(); organizationUserApiService = mock(); organizationAuthRequestService = new OrganizationAuthRequestService( organizationAuthRequestApiService, cryptoService, + encryptService, organizationUserApiService, ); }); diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts index edba399b8b2..ad6e29c5834 100644 --- a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts +++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts @@ -3,6 +3,7 @@ import { OrganizationUserResetPasswordDetailsResponse, } from "@bitwarden/admin-console/common"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; @@ -15,6 +16,7 @@ export class OrganizationAuthRequestService { constructor( private organizationAuthRequestApiService: OrganizationAuthRequestApiService, private cryptoService: CryptoService, + private encryptService: EncryptService, private organizationUserApiService: OrganizationUserApiService, ) {} @@ -109,7 +111,7 @@ export class OrganizationAuthRequestService { // Decrypt Organization's encrypted Private Key with org key const orgSymKey = await this.cryptoService.getOrgKey(organizationId); - const decOrgPrivateKey = await this.cryptoService.decryptToBytes( + const decOrgPrivateKey = await this.encryptService.decryptToBytes( new EncString(encryptedOrgPrivateKey), orgSymKey, ); diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts index 34c7bba7d0c..e074e0dd315 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts @@ -10,6 +10,7 @@ import { PendingAuthRequestView } from "@bitwarden/bit-common/admin-console/auth import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; @@ -30,7 +31,12 @@ import { SharedModule } from "@bitwarden/web-vault/app/shared/shared.module"; }), safeProvider({ provide: OrganizationAuthRequestService, - deps: [OrganizationAuthRequestApiService, CryptoService, OrganizationUserApiService], + deps: [ + OrganizationAuthRequestApiService, + CryptoService, + EncryptService, + OrganizationUserApiService, + ], }), ] satisfies SafeProvider[], imports: [SharedModule, NoItemsModule, LooseComponentsModule], diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts index 76094646808..3a2c7b8b644 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/services/web-provider.service.ts @@ -27,7 +27,7 @@ export class WebProviderService { const orgKey = await this.cryptoService.getOrgKey(organizationId); const providerKey = await this.cryptoService.getProviderKey(providerId); - const encryptedOrgKey = await this.cryptoService.encrypt(orgKey.key, providerKey); + const encryptedOrgKey = await this.encryptService.encrypt(orgKey.key, providerKey); const request = new ProviderAddOrganizationRequest(); request.organizationId = organizationId; diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 4cdf5be8651..734ae03d59b 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -449,6 +449,7 @@ const safeProviders: SafeProvider[] = [ fileUploadService: CipherFileUploadServiceAbstraction, configService: ConfigService, stateProvider: StateProvider, + accountService: AccountServiceAbstraction, ) => new CipherService( cryptoService, @@ -463,6 +464,7 @@ const safeProviders: SafeProvider[] = [ fileUploadService, configService, stateProvider, + accountService, ), deps: [ CryptoServiceAbstraction, @@ -477,6 +479,7 @@ const safeProviders: SafeProvider[] = [ CipherFileUploadServiceAbstraction, ConfigService, StateProvider, + AccountServiceAbstraction, ], }), safeProvider({ @@ -484,6 +487,7 @@ const safeProviders: SafeProvider[] = [ useClass: FolderService, deps: [ CryptoServiceAbstraction, + EncryptService, I18nServiceAbstraction, CipherServiceAbstraction, StateProvider, @@ -527,7 +531,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: CollectionServiceAbstraction, useClass: CollectionService, - deps: [CryptoServiceAbstraction, I18nServiceAbstraction, StateProvider], + deps: [CryptoServiceAbstraction, EncryptService, I18nServiceAbstraction, StateProvider], }), safeProvider({ provide: EnvironmentService, @@ -785,6 +789,7 @@ const safeProviders: SafeProvider[] = [ I18nServiceAbstraction, CollectionServiceAbstraction, CryptoServiceAbstraction, + EncryptService, PinServiceAbstraction, AccountServiceAbstraction, ], @@ -797,8 +802,10 @@ const safeProviders: SafeProvider[] = [ CipherServiceAbstraction, PinServiceAbstraction, CryptoServiceAbstraction, + EncryptService, CryptoFunctionServiceAbstraction, KdfConfigServiceAbstraction, + AccountServiceAbstraction, ], }), safeProvider({ @@ -809,6 +816,7 @@ const safeProviders: SafeProvider[] = [ ApiServiceAbstraction, PinServiceAbstraction, CryptoServiceAbstraction, + EncryptService, CryptoFunctionServiceAbstraction, CollectionServiceAbstraction, KdfConfigServiceAbstraction, diff --git a/libs/angular/src/vault/components/attachments.component.ts b/libs/angular/src/vault/components/attachments.component.ts index 4ae68c9ca9d..43c5a0d6d41 100644 --- a/libs/angular/src/vault/components/attachments.component.ts +++ b/libs/angular/src/vault/components/attachments.component.ts @@ -6,6 +6,7 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -40,6 +41,7 @@ export class AttachmentsComponent implements OnInit { protected cipherService: CipherService, protected i18nService: I18nService, protected cryptoService: CryptoService, + protected encryptService: EncryptService, protected platformUtilsService: PlatformUtilsService, protected apiService: ApiService, protected win: Window, @@ -178,7 +180,7 @@ export class AttachmentsComponent implements OnInit { attachment.key != null ? attachment.key : await this.cryptoService.getOrgKey(this.cipher.organizationId); - const decBuf = await this.cryptoService.decryptFromBytes(encBuf, key); + const decBuf = await this.encryptService.decryptToBytes(encBuf, key); this.fileDownloadService.download({ fileName: attachment.fileName, blobData: decBuf, @@ -249,7 +251,7 @@ export class AttachmentsComponent implements OnInit { attachment.key != null ? attachment.key : await this.cryptoService.getOrgKey(this.cipher.organizationId); - const decBuf = await this.cryptoService.decryptFromBytes(encBuf, key); + const decBuf = await this.encryptService.decryptToBytes(encBuf, key); const activeUserId = await firstValueFrom( this.accountService.activeAccount$.pipe(map((a) => a?.id)), ); diff --git a/libs/angular/src/vault/components/folder-add-edit.component.ts b/libs/angular/src/vault/components/folder-add-edit.component.ts index 0f179ae012c..199feb599ff 100644 --- a/libs/angular/src/vault/components/folder-add-edit.component.ts +++ b/libs/angular/src/vault/components/folder-add-edit.component.ts @@ -1,6 +1,9 @@ import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { Validators, FormBuilder } from "@angular/forms"; +import { firstValueFrom } from "rxjs"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.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"; @@ -29,6 +32,8 @@ export class FolderAddEditComponent implements OnInit { constructor( protected folderService: FolderService, protected folderApiService: FolderApiServiceAbstraction, + protected accountService: AccountService, + protected cryptoService: CryptoService, protected i18nService: I18nService, protected platformUtilsService: PlatformUtilsService, protected logService: LogService, @@ -52,7 +57,9 @@ export class FolderAddEditComponent implements OnInit { } try { - const folder = await this.folderService.encrypt(this.folder); + const activeAccountId = await firstValueFrom(this.accountService.activeAccount$); + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeAccountId.id); + const folder = await this.folderService.encrypt(this.folder, userKey); this.formPromise = this.folderApiService.save(folder); await this.formPromise; this.platformUtilsService.showToast( diff --git a/libs/angular/src/vault/components/view.component.ts b/libs/angular/src/vault/components/view.component.ts index a6e96bc542a..ac644acf9e4 100644 --- a/libs/angular/src/vault/components/view.component.ts +++ b/libs/angular/src/vault/components/view.component.ts @@ -21,6 +21,7 @@ import { EventType } from "@bitwarden/common/enums"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -87,6 +88,7 @@ export class ViewComponent implements OnDestroy, OnInit { protected tokenService: TokenService, protected i18nService: I18nService, protected cryptoService: CryptoService, + protected encryptService: EncryptService, protected platformUtilsService: PlatformUtilsService, protected auditService: AuditService, protected win: Window, @@ -442,7 +444,7 @@ export class ViewComponent implements OnDestroy, OnInit { attachment.key != null ? attachment.key : await this.cryptoService.getOrgKey(this.cipher.organizationId); - const decBuf = await this.cryptoService.decryptFromBytes(encBuf, key); + const decBuf = await this.encryptService.decryptToBytes(encBuf, key); this.fileDownloadService.download({ fileName: attachment.fileName, blobData: decBuf, diff --git a/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts index b112e5aa2ab..efc6da51d9f 100644 --- a/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts @@ -12,6 +12,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -37,6 +38,7 @@ describe("AuthRequestLoginStrategy", () => { let cache: AuthRequestLoginStrategyData; let cryptoService: MockProxy; + let encryptService: MockProxy; let apiService: MockProxy; let tokenService: MockProxy; let appIdService: MockProxy; @@ -101,6 +103,7 @@ describe("AuthRequestLoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, diff --git a/libs/auth/src/common/login-strategies/login.strategy.spec.ts b/libs/auth/src/common/login-strategies/login.strategy.spec.ts index 665857c1f47..35d62ca76b3 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.spec.ts @@ -22,6 +22,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -104,6 +105,7 @@ describe("LoginStrategy", () => { let loginStrategyService: MockProxy; let cryptoService: MockProxy; + let encryptService: MockProxy; let apiService: MockProxy; let tokenService: MockProxy; let appIdService: MockProxy; @@ -128,6 +130,7 @@ describe("LoginStrategy", () => { loginStrategyService = mock(); cryptoService = mock(); + encryptService = mock(); apiService = mock(); tokenService = mock(); appIdService = mock(); @@ -156,6 +159,7 @@ describe("LoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, @@ -467,6 +471,7 @@ describe("LoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index ff6bf07af7e..2e881f978dc 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -26,6 +26,7 @@ import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -66,6 +67,7 @@ export abstract class LoginStrategy { protected accountService: AccountService, protected masterPasswordService: InternalMasterPasswordServiceAbstraction, protected cryptoService: CryptoService, + protected encryptService: EncryptService, protected apiService: ApiService, protected tokenService: TokenService, protected appIdService: AppIdService, diff --git a/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts index 7ba58e1443a..07cbf2424ab 100644 --- a/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts @@ -16,6 +16,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -63,6 +64,7 @@ describe("PasswordLoginStrategy", () => { let loginStrategyService: MockProxy; let cryptoService: MockProxy; + let encryptService: MockProxy; let apiService: MockProxy; let tokenService: MockProxy; let appIdService: MockProxy; @@ -88,6 +90,7 @@ describe("PasswordLoginStrategy", () => { loginStrategyService = mock(); cryptoService = mock(); + encryptService = mock(); apiService = mock(); tokenService = mock(); appIdService = mock(); @@ -127,6 +130,7 @@ describe("PasswordLoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, diff --git a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts index 8e28a2c0222..f5de10766c0 100644 --- a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts @@ -17,6 +17,7 @@ import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -44,6 +45,7 @@ describe("SsoLoginStrategy", () => { let masterPasswordService: FakeMasterPasswordService; let cryptoService: MockProxy; + let encryptService: MockProxy; let apiService: MockProxy; let tokenService: MockProxy; let appIdService: MockProxy; @@ -78,6 +80,7 @@ describe("SsoLoginStrategy", () => { masterPasswordService = new FakeMasterPasswordService(); cryptoService = mock(); + encryptService = mock(); apiService = mock(); tokenService = mock(); appIdService = mock(); @@ -125,6 +128,7 @@ describe("SsoLoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, diff --git a/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts index 16614497964..d299a8e0ced 100644 --- a/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts @@ -11,6 +11,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Environment, EnvironmentService, @@ -39,6 +40,7 @@ describe("UserApiLoginStrategy", () => { let masterPasswordService: FakeMasterPasswordService; let cryptoService: MockProxy; + let encryptService: MockProxy; let apiService: MockProxy; let tokenService: MockProxy; let appIdService: MockProxy; @@ -99,6 +101,7 @@ describe("UserApiLoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, diff --git a/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts index 0db41c1e64f..b25022d25df 100644 --- a/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts @@ -14,6 +14,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -37,6 +38,7 @@ describe("WebAuthnLoginStrategy", () => { let masterPasswordService: FakeMasterPasswordService; let cryptoService!: MockProxy; + let encryptService!: MockProxy; let apiService!: MockProxy; let tokenService!: MockProxy; let appIdService!: MockProxy; @@ -79,6 +81,7 @@ describe("WebAuthnLoginStrategy", () => { masterPasswordService = new FakeMasterPasswordService(); cryptoService = mock(); + encryptService = mock(); apiService = mock(); tokenService = mock(); appIdService = mock(); @@ -103,6 +106,7 @@ describe("WebAuthnLoginStrategy", () => { accountService, masterPasswordService, cryptoService, + encryptService, apiService, tokenService, appIdService, @@ -221,7 +225,7 @@ describe("WebAuthnLoginStrategy", () => { const mockUserKeyArray: Uint8Array = randomBytes(32); const mockUserKey = new SymmetricCryptoKey(mockUserKeyArray) as UserKey; - cryptoService.decryptToBytes.mockResolvedValue(mockPrfPrivateKey); + encryptService.decryptToBytes.mockResolvedValue(mockPrfPrivateKey); cryptoService.rsaDecrypt.mockResolvedValue(mockUserKeyArray); // Act @@ -235,8 +239,8 @@ describe("WebAuthnLoginStrategy", () => { userId, ); - expect(cryptoService.decryptToBytes).toHaveBeenCalledTimes(1); - expect(cryptoService.decryptToBytes).toHaveBeenCalledWith( + expect(encryptService.decryptToBytes).toHaveBeenCalledTimes(1); + expect(encryptService.decryptToBytes).toHaveBeenCalledWith( idTokenResponse.userDecryptionOptions.webAuthnPrfOption.encryptedPrivateKey, webAuthnCredentials.prfKey, ); @@ -268,7 +272,7 @@ describe("WebAuthnLoginStrategy", () => { await webAuthnLoginStrategy.logIn(webAuthnCredentials); // Assert - expect(cryptoService.decryptToBytes).not.toHaveBeenCalled(); + expect(encryptService.decryptToBytes).not.toHaveBeenCalled(); expect(cryptoService.rsaDecrypt).not.toHaveBeenCalled(); expect(cryptoService.setUserKey).not.toHaveBeenCalled(); }); @@ -303,7 +307,7 @@ describe("WebAuthnLoginStrategy", () => { apiService.postIdentityToken.mockResolvedValue(idTokenResponse); - cryptoService.decryptToBytes.mockResolvedValue(null); + encryptService.decryptToBytes.mockResolvedValue(null); // Act await webAuthnLoginStrategy.logIn(webAuthnCredentials); diff --git a/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts b/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts index d283d163da1..96f8bc7d633 100644 --- a/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/webauthn-login.strategy.ts @@ -80,7 +80,7 @@ export class WebAuthnLoginStrategy extends LoginStrategy { } // decrypt prf encrypted private key - const privateKey = await this.cryptoService.decryptToBytes( + const privateKey = await this.encryptService.decryptToBytes( webAuthnPrfOption.encryptedPrivateKey, credentials.prfKey, ); diff --git a/libs/auth/src/common/services/login-strategies/login-strategy.service.ts b/libs/auth/src/common/services/login-strategies/login-strategy.service.ts index 67bcdc3658e..89c2bc01d94 100644 --- a/libs/auth/src/common/services/login-strategies/login-strategy.service.ts +++ b/libs/auth/src/common/services/login-strategies/login-strategy.service.ts @@ -317,6 +317,7 @@ export class LoginStrategyService implements LoginStrategyServiceAbstraction { this.accountService, this.masterPasswordService, this.cryptoService, + this.encryptService, this.apiService, this.tokenService, this.appIdService, diff --git a/libs/common/src/platform/abstractions/crypto.service.ts b/libs/common/src/platform/abstractions/crypto.service.ts index 1fe97e023f2..2a8e1ad6476 100644 --- a/libs/common/src/platform/abstractions/crypto.service.ts +++ b/libs/common/src/platform/abstractions/crypto.service.ts @@ -15,7 +15,6 @@ import { UserPublicKey, } from "../../types/key"; import { KeySuffixOptions, HashPurpose } from "../enums"; -import { EncArrayBuffer } from "../models/domain/enc-array-buffer"; import { EncString } from "../models/domain/enc-string"; import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; @@ -373,37 +372,6 @@ export abstract class CryptoService { * @param userId The desired user */ abstract clearDeprecatedKeys(keySuffix: KeySuffixOptions, userId?: string): Promise; - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.encrypt - */ - abstract encrypt(plainValue: string | Uint8Array, key?: SymmetricCryptoKey): Promise; - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.encryptToBytes - */ - abstract encryptToBytes( - plainValue: Uint8Array, - key?: SymmetricCryptoKey, - ): Promise; - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.decryptToBytes - */ - abstract decryptToBytes(encString: EncString, key?: SymmetricCryptoKey): Promise; - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.decryptToUtf8 - */ - abstract decryptToUtf8(encString: EncString, key?: SymmetricCryptoKey): Promise; - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.decryptToBytes - */ - abstract decryptFromBytes( - encBuffer: EncArrayBuffer, - key: SymmetricCryptoKey, - ): Promise; /** * Retrieves all the keys needed for decrypting Ciphers diff --git a/libs/common/src/platform/services/crypto.service.ts b/libs/common/src/platform/services/crypto.service.ts index 8ce2b5e1a0c..6a93ac7f3ff 100644 --- a/libs/common/src/platform/services/crypto.service.ts +++ b/libs/common/src/platform/services/crypto.service.ts @@ -48,7 +48,6 @@ import { StateService } from "../abstractions/state.service"; import { KeySuffixOptions, HashPurpose, EncryptionType } from "../enums"; import { convertValues } from "../misc/convert-values"; import { EFFLongWordList } from "../misc/wordlist"; -import { EncArrayBuffer } from "../models/domain/enc-array-buffer"; import { EncString, EncryptedString } from "../models/domain/enc-string"; import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; import { ActiveUserState, StateProvider } from "../state"; @@ -859,58 +858,6 @@ export class CryptoService implements CryptoServiceAbstraction { } } - // --DEPRECATED METHODS-- - - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.encrypt - */ - async encrypt(plainValue: string | Uint8Array, key?: SymmetricCryptoKey): Promise { - key ||= await this.getUserKeyWithLegacySupport(); - return await this.encryptService.encrypt(plainValue, key); - } - - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.encryptToBytes - */ - async encryptToBytes(plainValue: Uint8Array, key?: SymmetricCryptoKey): Promise { - key ||= await this.getUserKeyWithLegacySupport(); - return this.encryptService.encryptToBytes(plainValue, key); - } - - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.decryptToBytes - */ - async decryptToBytes(encString: EncString, key?: SymmetricCryptoKey): Promise { - key ||= await this.getUserKeyWithLegacySupport(); - return this.encryptService.decryptToBytes(encString, key); - } - - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.decryptToUtf8 - */ - async decryptToUtf8(encString: EncString, key?: SymmetricCryptoKey): Promise { - key ||= await this.getUserKeyWithLegacySupport(); - return await this.encryptService.decryptToUtf8(encString, key); - } - - /** - * @deprecated July 25 2022: Get the key you need from CryptoService (getKeyForUserEncryption or getOrgKey) - * and then call encryptService.decryptToBytes - */ - async decryptFromBytes(encBuffer: EncArrayBuffer, key: SymmetricCryptoKey): Promise { - if (encBuffer == null) { - throw new Error("No buffer provided for decryption."); - } - - key ||= await this.getUserKeyWithLegacySupport(); - - return this.encryptService.decryptToBytes(encBuffer, key); - } - userKey$(userId: UserId): Observable { return this.stateProvider.getUser(userId, USER_KEY).state$; } diff --git a/libs/common/src/tools/send/models/domain/send.spec.ts b/libs/common/src/tools/send/models/domain/send.spec.ts index bd42ab09cf9..5b1d7e73dae 100644 --- a/libs/common/src/tools/send/models/domain/send.spec.ts +++ b/libs/common/src/tools/send/models/domain/send.spec.ts @@ -1,5 +1,8 @@ import { mock } from "jest-mock-extended"; +import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { UserKey } from "@bitwarden/common/types/key"; + import { makeStaticByteArray, mockEnc } from "../../../../../spec"; import { CryptoService } from "../../../../platform/abstractions/crypto.service"; import { EncryptService } from "../../../../platform/abstractions/encrypt.service"; @@ -89,6 +92,7 @@ describe("Send", () => { it("Decrypt", async () => { const text = mock(); text.decrypt.mockResolvedValue("textView" as any); + const userKey = new SymmetricCryptoKey(new Uint8Array(32)) as UserKey; const send = new Send(); send.id = "id"; @@ -106,13 +110,13 @@ describe("Send", () => { send.disabled = false; send.hideEmail = true; + const encryptService = mock(); const cryptoService = mock(); - cryptoService.decryptToBytes - .calledWith(send.key, null) + encryptService.decryptToBytes + .calledWith(send.key, userKey) .mockResolvedValue(makeStaticByteArray(32)); cryptoService.makeSendKey.mockResolvedValue("cryptoKey" as any); - - const encryptService = mock(); + cryptoService.getUserKey.mockResolvedValue(userKey); (window as any).bitwardenContainerService = new ContainerService(cryptoService, encryptService); diff --git a/libs/common/src/tools/send/models/domain/send.ts b/libs/common/src/tools/send/models/domain/send.ts index 610980062b6..41d1fecc10b 100644 --- a/libs/common/src/tools/send/models/domain/send.ts +++ b/libs/common/src/tools/send/models/domain/send.ts @@ -73,9 +73,11 @@ export class Send extends Domain { const model = new SendView(this); const cryptoService = Utils.getContainerService().getCryptoService(); + const encryptService = Utils.getContainerService().getEncryptService(); try { - model.key = await cryptoService.decryptToBytes(this.key, null); + const sendKeyEncryptionKey = await cryptoService.getUserKey(); + model.key = await encryptService.decryptToBytes(this.key, sendKeyEncryptionKey); model.cryptoKey = await cryptoService.makeSendKey(model.key); } catch (e) { // TODO: error? diff --git a/libs/common/src/vault/abstractions/folder/folder.service.abstraction.ts b/libs/common/src/vault/abstractions/folder/folder.service.abstraction.ts index 3480a8aca03..857915ddb80 100644 --- a/libs/common/src/vault/abstractions/folder/folder.service.abstraction.ts +++ b/libs/common/src/vault/abstractions/folder/folder.service.abstraction.ts @@ -15,7 +15,7 @@ export abstract class FolderService implements UserKeyRotationDataProvider; clearCache: () => Promise; - encrypt: (model: FolderView, key?: SymmetricCryptoKey) => Promise; + encrypt: (model: FolderView, key: SymmetricCryptoKey) => Promise; get: (id: string) => Promise; getDecrypted$: (id: string) => Observable; getAllFromState: () => Promise; diff --git a/libs/common/src/vault/services/cipher.service.spec.ts b/libs/common/src/vault/services/cipher.service.spec.ts index b2712dee559..0873fa9d928 100644 --- a/libs/common/src/vault/services/cipher.service.spec.ts +++ b/libs/common/src/vault/services/cipher.service.spec.ts @@ -145,6 +145,7 @@ describe("Cipher Service", () => { cipherFileUploadService, configService, stateProvider, + accountService, ); cipherObj = new Cipher(cipherData); @@ -273,7 +274,7 @@ describe("Cipher Service", () => { cryptoService.makeCipherKey.mockReturnValue( Promise.resolve(new SymmetricCryptoKey(makeStaticByteArray(64)) as CipherKey), ); - cryptoService.encrypt.mockImplementation(encryptText); + encryptService.encrypt.mockImplementation(encryptText); jest.spyOn(cipherService as any, "getAutofillOnPageLoadDefault").mockResolvedValue(true); }); @@ -285,6 +286,10 @@ describe("Cipher Service", () => { { uri: "uri", match: UriMatchStrategy.RegularExpression } as LoginUriView, ]; + cryptoService.getOrgKey.mockReturnValue( + Promise.resolve(new SymmetricCryptoKey(new Uint8Array(32)) as OrgKey), + ); + const domain = await cipherService.encrypt(cipherView, userId); expect(domain.login.uris).toEqual([ @@ -301,6 +306,9 @@ describe("Cipher Service", () => { it("is null when feature flag is false", async () => { configService.getFeatureFlag.mockResolvedValue(false); + cryptoService.getOrgKey.mockReturnValue( + Promise.resolve(new SymmetricCryptoKey(new Uint8Array(32)) as OrgKey), + ); const cipher = await cipherService.encrypt(cipherView, userId); expect(cipher.key).toBeNull(); @@ -322,6 +330,9 @@ describe("Cipher Service", () => { it("is not called when feature flag is false", async () => { configService.getFeatureFlag.mockResolvedValue(false); + cryptoService.getOrgKey.mockReturnValue( + Promise.resolve(new SymmetricCryptoKey(new Uint8Array(32)) as OrgKey), + ); await cipherService.encrypt(cipherView, userId); @@ -330,6 +341,9 @@ describe("Cipher Service", () => { it("is called when feature flag is true", async () => { configService.getFeatureFlag.mockResolvedValue(true); + cryptoService.getOrgKey.mockReturnValue( + Promise.resolve(new SymmetricCryptoKey(new Uint8Array(32)) as OrgKey), + ); await cipherService.encrypt(cipherView, userId); diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index 70b7c77fc15..9761387284f 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -1,6 +1,7 @@ import { firstValueFrom, map, Observable, skipWhile, switchMap } from "rxjs"; import { SemVer } from "semver"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { BulkEncryptService } from "@bitwarden/common/platform/abstractions/bulk-encrypt.service"; @@ -108,6 +109,7 @@ export class CipherService implements CipherServiceAbstraction { private cipherFileUploadService: CipherFileUploadService, private configService: ConfigService, private stateProvider: StateProvider, + private accountService: AccountService, ) { this.localDataState = this.stateProvider.getActive(LOCAL_DATA_KEY); this.encryptedCiphersState = this.stateProvider.getActive(ENCRYPTED_CIPHERS); @@ -165,7 +167,7 @@ export class CipherService implements CipherServiceAbstraction { async encrypt( model: CipherView, userId: UserId, - keyForEncryption?: SymmetricCryptoKey, + keyForCipherEncryption?: SymmetricCryptoKey, keyForCipherKeyDecryption?: SymmetricCryptoKey, originalCipher: Cipher = null, ): Promise { @@ -195,26 +197,21 @@ export class CipherService implements CipherServiceAbstraction { const userOrOrgKey = await this.getKeyForCipherKeyDecryption(cipher, userId); // The keyForEncryption is only used for encrypting the cipher key, not the cipher itself, since cipher key encryption is enabled. // If the caller has provided a key for cipher key encryption, use it. Otherwise, use the user or org key. - keyForEncryption ||= userOrOrgKey; + keyForCipherEncryption ||= userOrOrgKey; // If the caller has provided a key for cipher key decryption, use it. Otherwise, use the user or org key. keyForCipherKeyDecryption ||= userOrOrgKey; return this.encryptCipherWithCipherKey( model, cipher, - keyForEncryption, + keyForCipherEncryption, keyForCipherKeyDecryption, ); } else { - if (keyForEncryption == null && cipher.organizationId != null) { - keyForEncryption = await this.cryptoService.getOrgKey(cipher.organizationId); - if (keyForEncryption == null) { - throw new Error("Cannot encrypt cipher for organization. No key."); - } - } + keyForCipherEncryption ||= await this.getKeyForCipherKeyDecryption(cipher, userId); // We want to ensure that the cipher key is null if cipher key encryption is disabled // so that decryption uses the proper key. cipher.key = null; - return this.encryptCipher(model, cipher, keyForEncryption); + return this.encryptCipher(model, cipher, keyForCipherEncryption); } } @@ -243,7 +240,7 @@ export class CipherService implements CipherServiceAbstraction { key, ).then(async () => { if (model.key != null) { - attachment.key = await this.cryptoService.encrypt(model.key.key, key); + attachment.key = await this.encryptService.encrypt(model.key.key, key); } encAttachments.push(attachment); }); @@ -1348,7 +1345,9 @@ export class CipherService implements CipherServiceAbstraction { } const encBuf = await EncArrayBuffer.fromResponse(attachmentResponse); - const decBuf = await this.cryptoService.decryptFromBytes(encBuf, null); + const activeUserId = await firstValueFrom(this.accountService.activeAccount$); + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeUserId.id); + const decBuf = await this.encryptService.decryptToBytes(encBuf, userKey); let encKey: UserKey | OrgKey; encKey = await this.cryptoService.getOrgKey(organizationId); @@ -1412,7 +1411,7 @@ export class CipherService implements CipherServiceAbstraction { .then(() => { const modelProp = (model as any)[map[theProp] || theProp]; if (modelProp && modelProp !== "") { - return self.cryptoService.encrypt(modelProp, key); + return self.encryptService.encrypt(modelProp, key); } return null; }) @@ -1458,7 +1457,7 @@ export class CipherService implements CipherServiceAbstraction { key, ); const uriHash = await this.encryptService.hash(model.login.uris[i].uri, "sha256"); - loginUri.uriChecksum = await this.cryptoService.encrypt(uriHash, key); + loginUri.uriChecksum = await this.encryptService.encrypt(uriHash, key); cipher.login.uris.push(loginUri); } } @@ -1485,8 +1484,8 @@ export class CipherService implements CipherServiceAbstraction { }, key, ); - domainKey.counter = await this.cryptoService.encrypt(String(viewKey.counter), key); - domainKey.discoverable = await this.cryptoService.encrypt( + domainKey.counter = await this.encryptService.encrypt(String(viewKey.counter), key); + domainKey.discoverable = await this.encryptService.encrypt( String(viewKey.discoverable), key, ); @@ -1605,11 +1604,23 @@ export class CipherService implements CipherServiceAbstraction { this.sortedCiphersCache.clear(); } + /** + * Encrypts a cipher object. + * @param model The cipher view model. + * @param cipher The cipher object. + * @param key The encryption key to encrypt with. This can be the org key, user key or cipher key, but must never be null + */ private async encryptCipher( model: CipherView, cipher: Cipher, key: SymmetricCryptoKey, ): Promise { + if (key == null) { + throw new Error( + "Key to encrypt cipher must not be null. Use the org key, user key or cipher key.", + ); + } + await Promise.all([ this.encryptObjProperty( model, diff --git a/libs/common/src/vault/services/collection.service.ts b/libs/common/src/vault/services/collection.service.ts index e9ad09a4831..09d21390aea 100644 --- a/libs/common/src/vault/services/collection.service.ts +++ b/libs/common/src/vault/services/collection.service.ts @@ -1,6 +1,8 @@ import { firstValueFrom, map, Observable } from "rxjs"; import { Jsonify } from "type-fest"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; + import { CryptoService } from "../../platform/abstractions/crypto.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { Utils } from "../../platform/misc/utils"; @@ -61,6 +63,7 @@ export class CollectionService implements CollectionServiceAbstraction { constructor( private cryptoService: CryptoService, + private encryptService: EncryptService, private i18nService: I18nService, protected stateProvider: StateProvider, ) { @@ -101,7 +104,7 @@ export class CollectionService implements CollectionServiceAbstraction { collection.organizationId = model.organizationId; collection.readOnly = model.readOnly; collection.externalId = model.externalId; - collection.name = await this.cryptoService.encrypt(model.name, key); + collection.name = await this.encryptService.encrypt(model.name, key); return collection; } diff --git a/libs/common/src/vault/services/folder/folder.service.spec.ts b/libs/common/src/vault/services/folder/folder.service.spec.ts index c27ea7646b0..05e1cdebc93 100644 --- a/libs/common/src/vault/services/folder/folder.service.spec.ts +++ b/libs/common/src/vault/services/folder/folder.service.spec.ts @@ -49,7 +49,13 @@ describe("Folder Service", () => { ); encryptService.decryptToUtf8.mockResolvedValue("DEC"); - folderService = new FolderService(cryptoService, i18nService, cipherService, stateProvider); + folderService = new FolderService( + cryptoService, + encryptService, + i18nService, + cipherService, + stateProvider, + ); folderState = stateProvider.activeUser.getFake(FOLDER_ENCRYPTED_FOLDERS); @@ -62,9 +68,9 @@ describe("Folder Service", () => { model.id = "2"; model.name = "Test Folder"; - cryptoService.encrypt.mockResolvedValue(new EncString("ENC")); + encryptService.encrypt.mockResolvedValue(new EncString("ENC")); - const result = await folderService.encrypt(model); + const result = await folderService.encrypt(model, null); expect(result).toEqual({ id: "2", @@ -185,7 +191,7 @@ describe("Folder Service", () => { beforeEach(() => { encryptedKey = new EncString("Re-encrypted Folder"); - cryptoService.encrypt.mockResolvedValue(encryptedKey); + encryptService.encrypt.mockResolvedValue(encryptedKey); }); it("returns re-encrypted user folders", async () => { diff --git a/libs/common/src/vault/services/folder/folder.service.ts b/libs/common/src/vault/services/folder/folder.service.ts index 0c17d7178b2..2adbc8c6d0e 100644 --- a/libs/common/src/vault/services/folder/folder.service.ts +++ b/libs/common/src/vault/services/folder/folder.service.ts @@ -1,5 +1,7 @@ import { Observable, firstValueFrom, map, shareReplay } from "rxjs"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; + import { CryptoService } from "../../../platform/abstractions/crypto.service"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { Utils } from "../../../platform/misc/utils"; @@ -25,6 +27,7 @@ export class FolderService implements InternalFolderServiceAbstraction { constructor( private cryptoService: CryptoService, + private encryptService: EncryptService, private i18nService: I18nService, private cipherService: CipherService, private stateProvider: StateProvider, @@ -48,10 +51,10 @@ export class FolderService implements InternalFolderServiceAbstraction { } // TODO: This should be moved to EncryptService or something - async encrypt(model: FolderView, key?: SymmetricCryptoKey): Promise { + async encrypt(model: FolderView, key: SymmetricCryptoKey): Promise { const folder = new Folder(); folder.id = model.id; - folder.name = await this.cryptoService.encrypt(model.name, key); + folder.name = await this.encryptService.encrypt(model.name, key); return folder; } diff --git a/libs/importer/spec/bitwarden-password-protected-importer.spec.ts b/libs/importer/spec/bitwarden-password-protected-importer.spec.ts index d36ce8b9a64..e5100e49900 100644 --- a/libs/importer/spec/bitwarden-password-protected-importer.spec.ts +++ b/libs/importer/spec/bitwarden-password-protected-importer.spec.ts @@ -3,6 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { KdfType } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -19,6 +20,7 @@ import { emptyUnencryptedExport } from "./test-data/bitwarden-json/unencrypted.j describe("BitwardenPasswordProtectedImporter", () => { let importer: BitwardenPasswordProtectedImporter; let cryptoService: MockProxy; + let encryptService: MockProxy; let i18nService: MockProxy; let cipherService: MockProxy; let pinService: MockProxy; @@ -30,6 +32,7 @@ describe("BitwardenPasswordProtectedImporter", () => { beforeEach(() => { cryptoService = mock(); + encryptService = mock(); i18nService = mock(); cipherService = mock(); pinService = mock(); @@ -37,6 +40,7 @@ describe("BitwardenPasswordProtectedImporter", () => { importer = new BitwardenPasswordProtectedImporter( cryptoService, + encryptService, i18nService, cipherService, pinService, @@ -91,7 +95,7 @@ describe("BitwardenPasswordProtectedImporter", () => { }); it("succeeds with default jdoc", async () => { - cryptoService.decryptToUtf8.mockReturnValue(Promise.resolve(emptyUnencryptedExport)); + encryptService.decryptToUtf8.mockReturnValue(Promise.resolve(emptyUnencryptedExport)); expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(true); }); diff --git a/libs/importer/src/components/import.component.ts b/libs/importer/src/components/import.component.ts index 8ee882734b3..10a3f5a89ab 100644 --- a/libs/importer/src/components/import.component.ts +++ b/libs/importer/src/components/import.component.ts @@ -30,6 +30,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { ClientType } from "@bitwarden/common/enums"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.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"; @@ -89,6 +90,7 @@ const safeProviders: SafeProvider[] = [ I18nService, CollectionService, CryptoService, + EncryptService, PinServiceAbstraction, AccountService, ], diff --git a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts index 2248606814b..9adc8a97819 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-json-importer.ts @@ -8,8 +8,10 @@ import { FolderWithIdExport, } from "@bitwarden/common/models/export"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; 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 { OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CollectionView } from "@bitwarden/common/vault/models/view/collection.view"; @@ -31,6 +33,7 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { protected constructor( protected cryptoService: CryptoService, + protected encryptService: EncryptService, protected i18nService: I18nService, protected cipherService: CipherService, protected pinService: PinServiceAbstraction, @@ -60,11 +63,16 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { results: BitwardenEncryptedIndividualJsonExport | BitwardenEncryptedOrgJsonExport, ) { if (results.encKeyValidation_DO_NOT_EDIT != null) { - const orgKey = await this.cryptoService.getOrgKey(this.organizationId); + let keyForDecryption: SymmetricCryptoKey = await this.cryptoService.getOrgKey( + this.organizationId, + ); + if (keyForDecryption == null) { + keyForDecryption = await this.cryptoService.getUserKeyWithLegacySupport(); + } const encKeyValidation = new EncString(results.encKeyValidation_DO_NOT_EDIT); - const encKeyValidationDecrypt = await this.cryptoService.decryptToUtf8( + const encKeyValidationDecrypt = await this.encryptService.decryptToUtf8( encKeyValidation, - orgKey, + keyForDecryption, ); if (encKeyValidationDecrypt === null) { this.result.success = false; 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 a854346bccb..35a0ec0f22c 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.ts @@ -6,6 +6,7 @@ import { PBKDF2KdfConfig, } from "@bitwarden/common/auth/models/domain/kdf-config"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { KdfType } from "@bitwarden/common/platform/enums"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; @@ -23,13 +24,14 @@ export class BitwardenPasswordProtectedImporter extends BitwardenJsonImporter im constructor( cryptoService: CryptoService, + encryptService: EncryptService, i18nService: I18nService, cipherService: CipherService, pinService: PinServiceAbstraction, accountService: AccountService, private promptForPassword_callback: () => Promise, ) { - super(cryptoService, i18nService, cipherService, pinService, accountService); + super(cryptoService, encryptService, i18nService, cipherService, pinService, accountService); } async parse(data: string): Promise { @@ -65,7 +67,7 @@ export class BitwardenPasswordProtectedImporter extends BitwardenJsonImporter im } const encData = new EncString(parsedData.data); - const clearTextData = await this.cryptoService.decryptToUtf8(encData, this.key); + const clearTextData = await this.encryptService.decryptToUtf8(encData, this.key); return await super.parse(clearTextData); } @@ -86,7 +88,7 @@ export class BitwardenPasswordProtectedImporter extends BitwardenJsonImporter im const encKeyValidation = new EncString(jdoc.encKeyValidation_DO_NOT_EDIT); - const encKeyValidationDecrypt = await this.cryptoService.decryptToUtf8( + const encKeyValidationDecrypt = await this.encryptService.decryptToUtf8( encKeyValidation, this.key, ); diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index e44c8f6aa98..ef605746e6e 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -3,6 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -27,6 +28,7 @@ describe("ImportService", () => { let i18nService: MockProxy; let collectionService: MockProxy; let cryptoService: MockProxy; + let encryptService: MockProxy; let pinService: MockProxy; let accountService: MockProxy; @@ -37,6 +39,7 @@ describe("ImportService", () => { i18nService = mock(); collectionService = mock(); cryptoService = mock(); + encryptService = mock(); pinService = mock(); importService = new ImportService( @@ -46,6 +49,7 @@ describe("ImportService", () => { i18nService, collectionService, cryptoService, + encryptService, pinService, accountService, ); diff --git a/libs/importer/src/services/import.service.ts b/libs/importer/src/services/import.service.ts index 13b77fb5b4e..2295f4f7041 100644 --- a/libs/importer/src/services/import.service.ts +++ b/libs/importer/src/services/import.service.ts @@ -7,6 +7,7 @@ import { ImportOrganizationCiphersRequest } from "@bitwarden/common/models/reque import { KvpRequest } from "@bitwarden/common/models/request/kvp.request"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -104,6 +105,7 @@ export class ImportService implements ImportServiceAbstraction { private i18nService: I18nService, private collectionService: CollectionService, private cryptoService: CryptoService, + private encryptService: EncryptService, private pinService: PinServiceAbstraction, private accountService: AccountService, ) {} @@ -207,6 +209,7 @@ export class ImportService implements ImportServiceAbstraction { case "bitwardenpasswordprotected": return new BitwardenPasswordProtectedImporter( this.cryptoService, + this.encryptService, this.i18nService, this.cipherService, this.pinService, @@ -344,9 +347,10 @@ export class ImportService implements ImportServiceAbstraction { const c = await this.cipherService.encrypt(importResult.ciphers[i], activeUserId); request.ciphers.push(new CipherRequest(c)); } + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeUserId); if (importResult.folders != null) { for (let i = 0; i < importResult.folders.length; i++) { - const f = await this.folderService.encrypt(importResult.folders[i]); + const f = await this.folderService.encrypt(importResult.folders[i], userKey); request.folders.push(new FolderWithIdRequest(f)); } } diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts index a494885698e..76b008be620 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/base-vault-export.service.ts @@ -2,7 +2,7 @@ import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service"; import { KdfConfig } from "@bitwarden/common/auth/models/domain/kdf-config"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KdfType } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -12,7 +12,7 @@ import { BitwardenCsvExportType, BitwardenPasswordProtectedFileFormat } from ".. export class BaseVaultExportService { constructor( protected pinService: PinServiceAbstraction, - protected cryptoService: CryptoService, + protected encryptService: EncryptService, private cryptoFunctionService: CryptoFunctionService, private kdfConfigService: KdfConfigService, ) {} @@ -23,8 +23,8 @@ export class BaseVaultExportService { const salt = Utils.fromBufferToB64(await this.cryptoFunctionService.randomBytes(16)); const key = await this.pinService.makePinKey(password, salt, kdfConfig); - const encKeyValidation = await this.cryptoService.encrypt(Utils.newGuid(), key); - const encText = await this.cryptoService.encrypt(clearText, key); + const encKeyValidation = await this.encryptService.encrypt(Utils.newGuid(), key); + const encText = await this.encryptService.encrypt(clearText, key); const jsonDoc: BitwardenPasswordProtectedFileFormat = { encrypted: true, diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts index 44df18116de..1a66fe92256 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts @@ -1,6 +1,8 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service"; import { DEFAULT_KDF_CONFIG, @@ -9,9 +11,11 @@ import { import { CipherWithIdExport } from "@bitwarden/common/models/export/cipher-with-ids.export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KdfType } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -149,7 +153,9 @@ describe("VaultExportService", () => { let pinService: MockProxy; let folderService: MockProxy; let cryptoService: MockProxy; + let encryptService: MockProxy; let kdfConfigService: MockProxy; + let accountService: MockProxy; beforeEach(() => { cryptoFunctionService = mock(); @@ -157,20 +163,35 @@ describe("VaultExportService", () => { pinService = mock(); folderService = mock(); cryptoService = mock(); + encryptService = mock(); kdfConfigService = mock(); + accountService = mock(); + + cryptoService.userKey$.mockReturnValue(new BehaviorSubject("mockOriginalUserKey" as any)); + + const userId = "" as UserId; + const accountInfo: AccountInfo = { + email: "", + emailVerified: true, + name: undefined, + }; + const activeAccount = { id: userId, ...accountInfo }; + accountService.activeAccount$ = new BehaviorSubject(activeAccount); folderService.getAllDecryptedFromState.mockResolvedValue(UserFolderViews); folderService.getAllFromState.mockResolvedValue(UserFolders); kdfConfigService.getKdfConfig.mockResolvedValue(DEFAULT_KDF_CONFIG); - cryptoService.encrypt.mockResolvedValue(new EncString("encrypted")); + encryptService.encrypt.mockResolvedValue(new EncString("encrypted")); exportService = new IndividualVaultExportService( folderService, cipherService, pinService, cryptoService, + encryptService, cryptoFunctionService, kdfConfigService, + accountService, ); }); @@ -250,7 +271,7 @@ describe("VaultExportService", () => { }); it("has a mac property", async () => { - cryptoService.encrypt.mockResolvedValue(mac); + encryptService.encrypt.mockResolvedValue(mac); exportString = await exportService.getPasswordProtectedExport(password); exportObject = JSON.parse(exportString); @@ -258,7 +279,7 @@ describe("VaultExportService", () => { }); it("has data property", async () => { - cryptoService.encrypt.mockResolvedValue(data); + encryptService.encrypt.mockResolvedValue(data); exportString = await exportService.getPasswordProtectedExport(password); exportObject = JSON.parse(exportString); diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts index 3da92ef16b5..d6d37b28ac7 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts @@ -1,10 +1,13 @@ import * as papa from "papaparse"; +import { firstValueFrom, map } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service"; import { CipherWithIdExport, FolderWithIdExport } from "@bitwarden/common/models/export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -32,11 +35,13 @@ export class IndividualVaultExportService private folderService: FolderService, private cipherService: CipherService, pinService: PinServiceAbstraction, - cryptoService: CryptoService, + private cryptoService: CryptoService, + encryptService: EncryptService, cryptoFunctionService: CryptoFunctionService, kdfConfigService: KdfConfigService, + private accountService: AccountService, ) { - super(pinService, cryptoService, cryptoFunctionService, kdfConfigService); + super(pinService, encryptService, cryptoFunctionService, kdfConfigService); } async getExport(format: ExportFormat = "csv"): Promise { @@ -96,7 +101,11 @@ export class IndividualVaultExportService await Promise.all(promises); - const encKeyValidation = await this.cryptoService.encrypt(Utils.newGuid()); + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + const userKey = await this.cryptoService.getUserKeyWithLegacySupport(activeUserId); + const encKeyValidation = await this.encryptService.encrypt(Utils.newGuid(), userKey); const jsonDoc: BitwardenEncryptedIndividualJsonExport = { encrypted: true, diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts index 0c3e94178f6..9fc1f20b832 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts @@ -8,6 +8,7 @@ import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config import { CipherWithIdExport, CollectionWithIdExport } from "@bitwarden/common/models/export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -39,13 +40,14 @@ export class OrganizationVaultExportService private cipherService: CipherService, private apiService: ApiService, pinService: PinServiceAbstraction, - cryptoService: CryptoService, + private cryptoService: CryptoService, + encryptService: EncryptService, cryptoFunctionService: CryptoFunctionService, private collectionService: CollectionService, kdfConfigService: KdfConfigService, private accountService: AccountService, ) { - super(pinService, cryptoService, cryptoFunctionService, kdfConfigService); + super(pinService, encryptService, cryptoFunctionService, kdfConfigService); } async getPasswordProtectedExport( @@ -242,7 +244,7 @@ export class OrganizationVaultExportService ciphers: Cipher[], ): Promise { const orgKey = await this.cryptoService.getOrgKey(organizationId); - const encKeyValidation = await this.cryptoService.encrypt(Utils.newGuid(), orgKey); + const encKeyValidation = await this.encryptService.encrypt(Utils.newGuid(), orgKey); const jsonDoc: BitwardenEncryptedOrgJsonExport = { encrypted: true, diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts b/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts index 44df18116de..7e93c78fc51 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/vault-export.service.spec.ts @@ -1,6 +1,8 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; +import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service"; import { DEFAULT_KDF_CONFIG, @@ -9,9 +11,11 @@ import { import { CipherWithIdExport } from "@bitwarden/common/models/export/cipher-with-ids.export"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { KdfType } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { EncryptedString, EncString } from "@bitwarden/common/platform/models/domain/enc-string"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -149,6 +153,8 @@ describe("VaultExportService", () => { let pinService: MockProxy; let folderService: MockProxy; let cryptoService: MockProxy; + let encryptService: MockProxy; + let accountService: MockProxy; let kdfConfigService: MockProxy; beforeEach(() => { @@ -157,20 +163,34 @@ describe("VaultExportService", () => { pinService = mock(); folderService = mock(); cryptoService = mock(); + encryptService = mock(); + accountService = mock(); + kdfConfigService = mock(); folderService.getAllDecryptedFromState.mockResolvedValue(UserFolderViews); folderService.getAllFromState.mockResolvedValue(UserFolders); kdfConfigService.getKdfConfig.mockResolvedValue(DEFAULT_KDF_CONFIG); - cryptoService.encrypt.mockResolvedValue(new EncString("encrypted")); + encryptService.encrypt.mockResolvedValue(new EncString("encrypted")); + cryptoService.userKey$.mockReturnValue(new BehaviorSubject("mockOriginalUserKey" as any)); + const userId = "" as UserId; + const accountInfo: AccountInfo = { + email: "", + emailVerified: true, + name: undefined, + }; + const activeAccount = { id: userId, ...accountInfo }; + accountService.activeAccount$ = new BehaviorSubject(activeAccount); exportService = new IndividualVaultExportService( folderService, cipherService, pinService, cryptoService, + encryptService, cryptoFunctionService, kdfConfigService, + accountService, ); }); @@ -250,7 +270,7 @@ describe("VaultExportService", () => { }); it("has a mac property", async () => { - cryptoService.encrypt.mockResolvedValue(mac); + encryptService.encrypt.mockResolvedValue(mac); exportString = await exportService.getPasswordProtectedExport(password); exportObject = JSON.parse(exportString); @@ -258,7 +278,7 @@ describe("VaultExportService", () => { }); it("has data property", async () => { - cryptoService.encrypt.mockResolvedValue(data); + encryptService.encrypt.mockResolvedValue(data); exportString = await exportService.getPasswordProtectedExport(password); exportObject = JSON.parse(exportString); From 8507097fe7e50a80288a0a55b4e2039e23adce63 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:45:08 -0700 Subject: [PATCH 095/104] fix send password input (#11208) --- .../send-form/components/options/send-options.component.ts | 2 +- .../send-ui/src/send-form/components/send-form.component.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts index ab4ffaa9dd0..89ab9d19ba2 100644 --- a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts @@ -102,7 +102,7 @@ export class SendOptionsComponent implements OnInit { this.sendOptionsForm.patchValue({ maxAccessCount: this.sendFormContainer.originalSendView.maxAccessCount, accessCount: this.sendFormContainer.originalSendView.accessCount, - password: this.sendFormContainer.originalSendView.password, + password: null, hideEmail: this.sendFormContainer.originalSendView.hideEmail, notes: this.sendFormContainer.originalSendView.notes, }); diff --git a/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts b/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts index b265b644df4..1d93804e11f 100644 --- a/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/send-form.component.ts @@ -16,6 +16,7 @@ import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { @@ -199,6 +200,10 @@ export class SendFormComponent implements AfterViewInit, OnInit, OnChanges, Send return; } + if (Utils.isNullOrWhitespace(this.updatedSendView.password)) { + this.updatedSendView.password = null; + } + await this.addEditFormService.saveSend(this.updatedSendView, this.file, this.config); this.toastService.showToast({ From c8084cc4e3d5bb2a97b9f8424a00d130e36a07dd Mon Sep 17 00:00:00 2001 From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com> Date: Tue, 24 Sep 2024 09:26:39 -0400 Subject: [PATCH 096/104] Fixed free organization upgrade after stripe sources deprecation (#11205) --- .../organization-plans.component.ts | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts index 924b128a50a..9ee56b0bcea 100644 --- a/apps/web/src/app/billing/organizations/organization-plans.component.ts +++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts @@ -23,8 +23,11 @@ import { OrganizationKeysRequest } from "@bitwarden/common/admin-console/models/ import { OrganizationUpgradeRequest } from "@bitwarden/common/admin-console/models/request/organization-upgrade.request"; import { ProviderOrganizationCreateRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-organization-create.request"; import { ProviderResponse } from "@bitwarden/common/admin-console/models/response/provider/provider.response"; +import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions"; import { PaymentMethodType, PlanType, ProductTierType } from "@bitwarden/common/billing/enums"; +import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request"; import { PaymentRequest } from "@bitwarden/common/billing/models/request/payment.request"; +import { UpdatePaymentMethodRequest } from "@bitwarden/common/billing/models/request/update-payment-method.request"; import { BillingResponse } from "@bitwarden/common/billing/models/response/billing.response"; import { OrganizationSubscriptionResponse } from "@bitwarden/common/billing/models/response/organization-subscription.response"; import { PlanResponse } from "@bitwarden/common/billing/models/response/plan.response"; @@ -33,7 +36,6 @@ import { ConfigService } from "@bitwarden/common/platform/abstractions/config/co import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; @@ -153,15 +155,15 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { private syncService: SyncService, private policyService: PolicyService, private organizationService: OrganizationService, - private logService: LogService, private messagingService: MessagingService, private formBuilder: FormBuilder, private organizationApiService: OrganizationApiServiceAbstraction, private providerApiService: ProviderApiServiceAbstraction, private toastService: ToastService, private configService: ConfigService, + private billingApiService: BillingApiServiceAbstraction, ) { - this.selfHosted = platformUtilsService.isSelfHost(); + this.selfHosted = this.platformUtilsService.isSelfHost(); } async ngOnInit() { @@ -660,21 +662,26 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy { this.buildSecretsManagerRequest(request); if (this.upgradeRequiresPaymentMethod) { - let type: PaymentMethodType; - let token: string; - if (this.deprecateStripeSourcesAPI) { - ({ type, token } = await this.paymentV2Component.tokenize()); + const updatePaymentMethodRequest = new UpdatePaymentMethodRequest(); + updatePaymentMethodRequest.paymentSource = await this.paymentV2Component.tokenize(); + const expandedTaxInfoUpdateRequest = new ExpandedTaxInfoUpdateRequest(); + expandedTaxInfoUpdateRequest.country = this.taxComponent.country; + expandedTaxInfoUpdateRequest.postalCode = this.taxComponent.postalCode; + updatePaymentMethodRequest.taxInformation = expandedTaxInfoUpdateRequest; + await this.billingApiService.updateOrganizationPaymentMethod( + this.organizationId, + updatePaymentMethodRequest, + ); } else { - [token, type] = await this.paymentComponent.createPaymentToken(); + const [paymentToken, paymentMethodType] = await this.paymentComponent.createPaymentToken(); + const paymentRequest = new PaymentRequest(); + paymentRequest.paymentToken = paymentToken; + paymentRequest.paymentMethodType = paymentMethodType; + paymentRequest.country = this.taxComponent.taxFormGroup?.value.country; + paymentRequest.postalCode = this.taxComponent.taxFormGroup?.value.postalCode; + await this.organizationApiService.updatePayment(this.organizationId, paymentRequest); } - - const paymentRequest = new PaymentRequest(); - paymentRequest.paymentToken = token; - paymentRequest.paymentMethodType = type; - paymentRequest.country = this.taxComponent.taxFormGroup?.value.country; - paymentRequest.postalCode = this.taxComponent.taxFormGroup?.value.postalCode; - await this.organizationApiService.updatePayment(this.organizationId, paymentRequest); } // Backfill pub/priv key if necessary From e88e231d48ef3f0040833206308c8a739dbe9f4d Mon Sep 17 00:00:00 2001 From: Jonathan Prusik Date: Tue, 24 Sep 2024 10:36:44 -0400 Subject: [PATCH 097/104] [PM-11588] Bugfix - parse user input value for combined expiry date when creating/adding a card cipher (#11103) * simplify logic and fix some pattern-matching bugs * add first pass at parsing combined expiry year and month from user input * clean up code * fix broken three-digit parsing case * fix case where splitCombinedDateValues returns empty strings when the input is only a delimiter * fix incorrect expectation of falsy negative integers * clean up code * split out logic from parseYearMonthExpiry * move utils from vault to autofill --- .../autofill/background/overlay.background.ts | 15 +- .../autofill/services/autofill-constants.ts | 2 - .../src/autofill/services/autofill.service.ts | 15 +- .../components/vault/add-edit.component.ts | 2 +- .../individual-vault/add-edit.component.ts | 2 +- .../vault/components/add-edit.component.ts | 2 +- libs/common/src/autofill/constants/index.ts | 2 + .../src/autofill/constants/match-patterns.ts | 26 ++ libs/common/src/autofill/utils.spec.ts | 284 ++++++++++++++++ libs/common/src/autofill/utils.ts | 307 ++++++++++++++++++ .../common/src/vault/models/view/card.view.ts | 2 +- libs/common/src/vault/utils.spec.ts | 122 ------- libs/common/src/vault/utils.ts | 83 ----- libs/importer/src/importers/base-importer.ts | 2 +- .../card-details-section.component.ts | 2 +- .../src/cipher-view/cipher-view.component.ts | 2 +- 16 files changed, 648 insertions(+), 222 deletions(-) create mode 100644 libs/common/src/autofill/constants/match-patterns.ts create mode 100644 libs/common/src/autofill/utils.spec.ts create mode 100644 libs/common/src/autofill/utils.ts delete mode 100644 libs/common/src/vault/utils.spec.ts delete mode 100644 libs/common/src/vault/utils.ts diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 0047d1de28e..c8d250df509 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -20,6 +20,7 @@ import { import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types"; +import { parseYearMonthExpiry } from "@bitwarden/common/autofill/utils"; import { NeverDomains } from "@bitwarden/common/models/domain/domain-service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { @@ -1898,11 +1899,21 @@ export class OverlayBackground implements OverlayBackgroundInterface { const cardView = new CardView(); cardView.cardholderName = card.cardholderName || ""; cardView.number = card.number || ""; - cardView.expMonth = card.expirationMonth || ""; - cardView.expYear = card.expirationYear || ""; cardView.code = card.cvv || ""; cardView.brand = card.number ? CardView.getCardBrandByPatterns(card.number) : ""; + // If there's a combined expiration date value and no individual month or year values, + // try to parse them from the combined value + if (card.expirationDate && !card.expirationMonth && !card.expirationYear) { + const [parsedYear, parsedMonth] = parseYearMonthExpiry(card.expirationDate); + + cardView.expMonth = parsedMonth || ""; + cardView.expYear = parsedYear || ""; + } else { + cardView.expMonth = card.expirationMonth || ""; + cardView.expYear = card.expirationYear || ""; + } + const cipherView = new CipherView(); cipherView.name = ""; cipherView.folderId = null; diff --git a/apps/browser/src/autofill/services/autofill-constants.ts b/apps/browser/src/autofill/services/autofill-constants.ts index 9cf2b6848c6..c379daaf2d8 100644 --- a/apps/browser/src/autofill/services/autofill-constants.ts +++ b/apps/browser/src/autofill/services/autofill-constants.ts @@ -300,8 +300,6 @@ export class CreditCardAutoFillConstants { "cb-type", ]; - static readonly CardExpiryDateDelimiters: string[] = ["/", "-", ".", " "]; - // Note, these are expressions of user-guidance for the expected expiry date format to be used static readonly CardExpiryDateFormats: CardExpiryDateFormat[] = [ // English diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index 49d00624f34..5d9bfa9f9d4 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -6,11 +6,15 @@ import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions 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 { AutofillOverlayVisibility } from "@bitwarden/common/autofill/constants"; +import { + AutofillOverlayVisibility, + CardExpiryDateDelimiters, +} from "@bitwarden/common/autofill/constants"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { UserNotificationSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/user-notification-settings.service"; import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types"; +import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EventType } from "@bitwarden/common/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; @@ -30,7 +34,6 @@ import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FieldView } from "@bitwarden/common/vault/models/view/field.view"; import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"; -import { normalizeExpiryYearFormat } from "@bitwarden/common/vault/utils"; import { BrowserApi } from "../../platform/browser/browser-api"; import { ScriptInjectorService } from "../../platform/services/abstractions/script-injector.service"; @@ -1397,8 +1400,7 @@ export default class AutofillService implements AutofillServiceInterface { if (expectedExpiryDateFormat) { const { Month, MonthShort, Year } = expiryDateFormatPatterns; - const expiryDateDelimitersPattern = - "\\" + CreditCardAutoFillConstants.CardExpiryDateDelimiters.join("\\"); + const expiryDateDelimitersPattern = "\\" + CardExpiryDateDelimiters.join("\\"); // assign the delimiter from the expected format string delimiter = @@ -1450,8 +1452,7 @@ export default class AutofillService implements AutofillServiceInterface { let expectedDateFormat = null; let dateFormatPatterns = null; - const expiryDateDelimitersPattern = - "\\" + CreditCardAutoFillConstants.CardExpiryDateDelimiters.join("\\"); + const expiryDateDelimitersPattern = "\\" + CardExpiryDateDelimiters.join("\\"); CreditCardAutoFillConstants.CardExpiryDateFormats.find((dateFormat) => { dateFormatPatterns = dateFormat; @@ -1489,6 +1490,8 @@ export default class AutofillService implements AutofillServiceInterface { return false; }); }); + // @TODO if expectedDateFormat is still null, and there is a `pattern` attribute, cycle + // through generated formatted values, checking against the provided regex pattern return [expectedDateFormat, dateFormatPatterns]; } diff --git a/apps/browser/src/vault/popup/components/vault/add-edit.component.ts b/apps/browser/src/vault/popup/components/vault/add-edit.component.ts index 02654f37efe..de8e5615e2f 100644 --- a/apps/browser/src/vault/popup/components/vault/add-edit.component.ts +++ b/apps/browser/src/vault/popup/components/vault/add-edit.component.ts @@ -12,6 +12,7 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service"; +import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -23,7 +24,6 @@ import { CollectionService } from "@bitwarden/common/vault/abstractions/collecti import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; -import { normalizeExpiryYearFormat } from "@bitwarden/common/vault/utils"; import { DialogService } from "@bitwarden/components"; import { PasswordRepromptService } from "@bitwarden/vault"; diff --git a/apps/web/src/app/vault/individual-vault/add-edit.component.ts b/apps/web/src/app/vault/individual-vault/add-edit.component.ts index d1b51b611f5..9826d9f2f5a 100644 --- a/apps/web/src/app/vault/individual-vault/add-edit.component.ts +++ b/apps/web/src/app/vault/individual-vault/add-edit.component.ts @@ -8,6 +8,7 @@ import { EventCollectionService } from "@bitwarden/common/abstractions/event/eve import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { isCardExpired } from "@bitwarden/common/autofill/utils"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ProductTierType } from "@bitwarden/common/billing/enums"; import { EventType } from "@bitwarden/common/enums"; @@ -24,7 +25,6 @@ import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folde import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { Launchable } from "@bitwarden/common/vault/interfaces/launchable"; -import { isCardExpired } from "@bitwarden/common/vault/utils"; import { DialogService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { PasswordRepromptService } from "@bitwarden/vault"; diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index 255d553a3ec..21a7b35ac51 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -12,6 +12,7 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli import { OrganizationUserStatusType, PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils"; import { EventType } from "@bitwarden/common/enums"; import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -36,7 +37,6 @@ import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view" import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { SecureNoteView } from "@bitwarden/common/vault/models/view/secure-note.view"; -import { normalizeExpiryYearFormat } from "@bitwarden/common/vault/utils"; import { DialogService } from "@bitwarden/components"; import { PasswordRepromptService } from "@bitwarden/vault"; diff --git a/libs/common/src/autofill/constants/index.ts b/libs/common/src/autofill/constants/index.ts index 15005691d29..4ccec81a447 100644 --- a/libs/common/src/autofill/constants/index.ts +++ b/libs/common/src/autofill/constants/index.ts @@ -109,3 +109,5 @@ export type ExtensionCommandType = (typeof ExtensionCommand)[keyof typeof Extens export const CLEAR_NOTIFICATION_LOGIN_DATA_DURATION = 60 * 1000; // 1 minute export const MAX_DEEP_QUERY_RECURSION_DEPTH = 4; + +export * from "./match-patterns"; diff --git a/libs/common/src/autofill/constants/match-patterns.ts b/libs/common/src/autofill/constants/match-patterns.ts new file mode 100644 index 00000000000..f756537d28d --- /dev/null +++ b/libs/common/src/autofill/constants/match-patterns.ts @@ -0,0 +1,26 @@ +export const CardExpiryDateDelimiters: string[] = ["/", "-", ".", " "]; + +// `CardExpiryDateDelimiters` is not intended solely for regex consumption, +// so we need to format it here +export const ExpiryDateDelimitersPattern = + "\\" + + CardExpiryDateDelimiters.join("\\") + // replace space character with the regex whitespace character class + .replace(" ", "s"); + +export const MonthPattern = "(([1]{1}[0-2]{1})|(0?[1-9]{1}))"; + +// Because we're dealing with expiry dates, we assume the year will be in current or next century (as of 2024) +export const ExpiryFullYearPattern = "2[0-1]{1}\\d{2}"; + +export const DelimiterPatternExpression = new RegExp(`[${ExpiryDateDelimitersPattern}]`, "g"); + +export const IrrelevantExpiryCharactersPatternExpression = new RegExp( + // "nor digits" to ensure numbers are removed from guidance pattern, which aren't covered by ^\w + `[^\\d${ExpiryDateDelimitersPattern}]`, + "g", +); + +export const MonthPatternExpression = new RegExp(`^${MonthPattern}$`); + +export const ExpiryFullYearPatternExpression = new RegExp(`^${ExpiryFullYearPattern}$`); diff --git a/libs/common/src/autofill/utils.spec.ts b/libs/common/src/autofill/utils.spec.ts new file mode 100644 index 00000000000..b09dc723b8e --- /dev/null +++ b/libs/common/src/autofill/utils.spec.ts @@ -0,0 +1,284 @@ +import { + normalizeExpiryYearFormat, + isCardExpired, + parseYearMonthExpiry, +} from "@bitwarden/common/autofill/utils"; +import { CardView } from "@bitwarden/common/vault/models/view/card.view"; + +function getExpiryYearValueFormats(currentCentury: string) { + return [ + [-12, `${currentCentury}12`], + [0, `${currentCentury}00`], + [2043, "2043"], // valid year with a length of four should be taken directly + [24, `${currentCentury}24`], + [3054, "3054"], // valid year with a length of four should be taken directly + [31423524543, `${currentCentury}43`], + [4, `${currentCentury}04`], + [null, null], + [undefined, null], + ["-12", `${currentCentury}12`], + ["", null], + ["0", `${currentCentury}00`], + ["00", `${currentCentury}00`], + ["000", `${currentCentury}00`], + ["0000", `${currentCentury}00`], + ["00000", `${currentCentury}00`], + ["0234234", `${currentCentury}34`], + ["04", `${currentCentury}04`], + ["2043", "2043"], // valid year with a length of four should be taken directly + ["24", `${currentCentury}24`], + ["3054", "3054"], // valid year with a length of four should be taken directly + ["31423524543", `${currentCentury}43`], + ["4", `${currentCentury}04`], + ["aaaa", null], + ["adgshsfhjsdrtyhsrth", null], + ["agdredg42grg35grrr. ea3534@#^145345ag$%^ -_#$rdg ", `${currentCentury}45`], + ]; +} + +describe("normalizeExpiryYearFormat", () => { + const currentCentury = `${new Date().getFullYear()}`.slice(0, 2); + + const expiryYearValueFormats = getExpiryYearValueFormats(currentCentury); + + expiryYearValueFormats.forEach(([inputValue, expectedValue]) => { + it(`should return '${expectedValue}' when '${inputValue}' is passed`, () => { + const formattedValue = normalizeExpiryYearFormat(inputValue); + + expect(formattedValue).toEqual(expectedValue); + }); + }); + + describe("in the year 3107", () => { + const theDistantFuture = new Date(Date.UTC(3107, 1, 1)); + jest.spyOn(Date, "now").mockReturnValue(theDistantFuture.valueOf()); + + beforeAll(() => { + jest.useFakeTimers({ advanceTimers: true }); + jest.setSystemTime(theDistantFuture); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + const currentCentury = `${new Date(Date.now()).getFullYear()}`.slice(0, 2); + expect(currentCentury).toBe("31"); + + const expiryYearValueFormats = getExpiryYearValueFormats(currentCentury); + + expiryYearValueFormats.forEach(([inputValue, expectedValue]) => { + it(`should return '${expectedValue}' when '${inputValue}' is passed`, () => { + const formattedValue = normalizeExpiryYearFormat(inputValue); + + expect(formattedValue).toEqual(expectedValue); + }); + }); + jest.clearAllTimers(); + }); +}); + +function getCardExpiryDateValues() { + const currentDate = new Date(); + + const currentYear = currentDate.getFullYear(); + + // `Date` months are zero-indexed, our expiry date month inputs are one-indexed + const currentMonth = currentDate.getMonth() + 1; + + return [ + [null, null, false], // no month, no year + [undefined, undefined, false], // no month, no year, invalid values + ["", "", false], // no month, no year, invalid values + ["12", "agdredg42grg35grrr. ea3534@#^145345ag$%^ -_#$rdg ", false], // invalid values + ["0", `${currentYear}`, true], // invalid month + ["0", `${currentYear - 1}`, true], // invalid 0 month + ["00", `${currentYear + 1}`, false], // invalid 0 month + [`${currentMonth}`, "0000", true], // current month, in the year 2000 + [null, `${currentYear}`.slice(-2), false], // no month, this year + [null, `${currentYear - 1}`.slice(-2), true], // no month, last year + ["1", null, false], // no year, January + ["1", `${currentYear - 1}`, true], // January last year + ["13", `${currentYear}`, false], // 12 + 1 is Feb. in the next year (Date is zero-indexed) + [`${currentMonth + 36}`, `${currentYear - 1}`, true], // even though the month value would put the date 3 years into the future when calculated with `Date`, an explicit year in the past indicates the card is expired + [`${currentMonth}`, `${currentYear}`, false], // this year, this month (not expired until the month is over) + [`${currentMonth}`, `${currentYear}`.slice(-2), false], // This month, this year (not expired until the month is over) + [`${currentMonth - 1}`, `${currentYear}`, true], // last month + [`${currentMonth - 1}`, `${currentYear + 1}`, false], // 11 months from now + ]; +} + +describe("isCardExpired", () => { + const expiryYearValueFormats = getCardExpiryDateValues(); + + expiryYearValueFormats.forEach( + ([inputMonth, inputYear, expectedValue]: [string | null, string | null, boolean]) => { + it(`should return ${expectedValue} when the card expiry month is ${inputMonth} and the card expiry year is ${inputYear}`, () => { + const testCardView = new CardView(); + testCardView.expMonth = inputMonth; + testCardView.expYear = inputYear; + + const cardIsExpired = isCardExpired(testCardView); + + expect(cardIsExpired).toBe(expectedValue); + }); + }, + ); +}); + +const combinedDateTestValues = [ + " 2024 / 05 ", + "05 2024", + "05 2024", // Tab whitespace character + "05 2024", // Em Quad + "05 2024", // Em Space + "05 2024", // En Quad + "05 2024", // En Space + "05 2024", // Figure Space + "05 2024", // Four-Per-Em Space + "05 2024", // Hair Space + "05 2024", // Ideographic Space + "05 2024", // Medium Mathematical Space + "05 2024", // No-Break Space + "05 2024", // ogham space mark + "05 2024", // Punctuation Space + "05 2024", // Six-Per-Em Space + "05 2024", // Thin Space + "05 2024", // Three-Per-Em Space + "05 24", + "05-2024", + "05-24", + "05.2024", + "05.24", + "05/2024", + "05/24", + "052024", + "0524", + "2024 05", + "2024 5", + "2024-05", + "2024-5", + "2024.05", + "2024.5", + "2024/05", + "2024/5", + "202405", + "20245", + "24 05", + "24 5", + "24-05", + "24-5", + "24.05", + "24.5", + "24/05", + "24/5", + "2405", + "5 2024", + "5 24", + "5-2024", + "5-24", + "5.2024", + "5.24", + "5/2024", + "5/24", + "52024", +]; +const expectedParsedValue = ["2024", "5"]; +describe("parseYearMonthExpiry", () => { + it('returns "null" expiration year and month values when a value of "" is passed', () => { + expect(parseYearMonthExpiry("")).toStrictEqual([null, null]); + }); + + it('returns "null" expiration year and month values when a value of "/" is passed', () => { + expect(parseYearMonthExpiry("/")).toStrictEqual([null, null]); + }); + + combinedDateTestValues.forEach((combinedDate) => { + it(`returns an expiration year value of "${expectedParsedValue[0]}" and month value of "${expectedParsedValue[1]}" when a value of "${combinedDate}" is passed`, () => { + expect(parseYearMonthExpiry(combinedDate)).toStrictEqual(expectedParsedValue); + }); + }); + + it('returns an expiration year value of "2002" and month value of "2" when a value of "022" is passed', () => { + expect(parseYearMonthExpiry("022")).toStrictEqual(["2002", "2"]); + }); + + it('returns an expiration year value of "2002" and month value of "2" when a value of "202" is passed', () => { + expect(parseYearMonthExpiry("202")).toStrictEqual(["2002", "2"]); + }); + + it('returns an expiration year value of "2002" and month value of "1" when a value of "1/2/3/4" is passed', () => { + expect(parseYearMonthExpiry("1/2/3/4")).toStrictEqual(["2002", "1"]); + }); + + it('returns valid expiration year and month values when a value of "198" is passed', () => { + // This static value will cause the test to fail in 2098 + const testValue = "198"; + const parsedValue = parseYearMonthExpiry(testValue); + + expect(parsedValue[0]).toHaveLength(4); + expect(parsedValue[1]).toMatch(/^[\d]{1,2}$/); + + expect(parsedValue).toStrictEqual(["2098", "1"]); + }); + + // Ambiguous input cases: we use try/catch for these cases as a workaround to accept either + // outcome (both are valid interpretations) in the event of any future code changes. + describe("ambiguous input cases", () => { + it('returns valid expiration year and month values when a value of "111" is passed', () => { + const testValue = "111"; + const parsedValue = parseYearMonthExpiry(testValue); + + expect(parsedValue[0]).toHaveLength(4); + expect(parsedValue[1]).toMatch(/^[\d]{1,2}$/); + + try { + expect(parsedValue).toStrictEqual(["2011", "1"]); + } catch { + expect(parsedValue).toStrictEqual(["2001", "11"]); + } + }); + + it('returns valid expiration year and month values when a value of "212" is passed', () => { + const testValue = "212"; + const parsedValue = parseYearMonthExpiry(testValue); + + expect(parsedValue[0]).toHaveLength(4); + expect(parsedValue[1]).toMatch(/^[\d]{1,2}$/); + + try { + expect(parsedValue).toStrictEqual(["2012", "2"]); + } catch { + expect(parsedValue).toStrictEqual(["2021", "2"]); + } + }); + + it('returns valid expiration year and month values when a value of "245" is passed', () => { + const testValue = "245"; + const parsedValue = parseYearMonthExpiry(testValue); + + expect(parsedValue[0]).toHaveLength(4); + expect(parsedValue[1]).toMatch(/^[\d]{1,2}$/); + + try { + expect(parsedValue).toStrictEqual(["2045", "2"]); + } catch { + expect(parsedValue).toStrictEqual(["2024", "5"]); + } + }); + + it('returns valid expiration year and month values when a value of "524" is passed', () => { + const testValue = "524"; + const parsedValue = parseYearMonthExpiry(testValue); + + expect(parsedValue[0]).toHaveLength(4); + expect(parsedValue[1]).toMatch(/^[\d]{1,2}$/); + + try { + expect(parsedValue).toStrictEqual(["2024", "5"]); + } catch { + expect(parsedValue).toStrictEqual(["2052", "4"]); + } + }); + }); +}); diff --git a/libs/common/src/autofill/utils.ts b/libs/common/src/autofill/utils.ts new file mode 100644 index 00000000000..86411691ea2 --- /dev/null +++ b/libs/common/src/autofill/utils.ts @@ -0,0 +1,307 @@ +import { + DelimiterPatternExpression, + ExpiryFullYearPattern, + ExpiryFullYearPatternExpression, + IrrelevantExpiryCharactersPatternExpression, + MonthPatternExpression, +} from "@bitwarden/common/autofill/constants"; +import { CardView } from "@bitwarden/common/vault/models/view/card.view"; + +type NonZeroIntegers = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; +type Year = `${NonZeroIntegers}${NonZeroIntegers}${0 | NonZeroIntegers}${0 | NonZeroIntegers}`; + +/** + * Takes a string or number value and returns a string value formatted as a valid 4-digit year + * + * @param {(string | number)} yearInput + * @return {*} {(Year | null)} + */ +export function normalizeExpiryYearFormat(yearInput: string | number): Year | null { + // The input[type="number"] is returning a number, convert it to a string + // An empty field returns null, avoid casting `"null"` to a string + const yearInputIsEmpty = yearInput == null || yearInput === ""; + let expirationYear = yearInputIsEmpty ? null : `${yearInput}`; + + // Exit early if year is already formatted correctly or empty + if (yearInputIsEmpty || /^[1-9]{1}\d{3}$/.test(expirationYear)) { + return expirationYear as Year; + } + + expirationYear = expirationYear + // For safety, because even input[type="number"] will allow decimals + .replace(/[^\d]/g, "") + // remove any leading zero padding (leave the last leading zero if it ends the string) + .replace(/^[0]+(?=.)/, ""); + + if (expirationYear === "") { + expirationYear = null; + } + + // given the context of payment card expiry, a year character length of 3, or over 4 + // is more likely to be a mistake than an intentional value for the far past or far future. + if (expirationYear && expirationYear.length !== 4) { + const paddedYear = ("00" + expirationYear).slice(-2); + const currentCentury = `${new Date().getFullYear()}`.slice(0, 2); + + expirationYear = currentCentury + paddedYear; + } + + return expirationYear as Year | null; +} + +/** + * Takes a cipher card view and returns "true" if the month and year affirmativey indicate + * the card is expired. + * + * @param {CardView} cipherCard + * @return {*} {boolean} + */ +export function isCardExpired(cipherCard: CardView): boolean { + if (cipherCard) { + const { expMonth = null, expYear = null } = cipherCard; + + const now = new Date(); + const normalizedYear = normalizeExpiryYearFormat(expYear); + + // If the card year is before the current year, don't bother checking the month + if (normalizedYear && parseInt(normalizedYear, 10) < now.getFullYear()) { + return true; + } + + if (normalizedYear && expMonth) { + const parsedMonthInteger = parseInt(expMonth, 10); + + const parsedMonth = isNaN(parsedMonthInteger) + ? 0 + : // Add a month floor of 0 to protect against an invalid low month value of "0" or negative integers + Math.max( + // `Date` months are zero-indexed + parsedMonthInteger - 1, + 0, + ); + + const parsedYear = parseInt(normalizedYear, 10); + + // First day of the next month minus one, to get last day of the card month + const cardExpiry = new Date(parsedYear, parsedMonth + 1, 0); + + return cardExpiry < now; + } + } + + return false; +} + +/** + * Attempt to split a string into date segments on the basis of expected formats and delimiter symbols. + * + * @param {string} combinedExpiryValue + * @return {*} {string[]} + */ +function splitCombinedDateValues(combinedExpiryValue: string): string[] { + let sanitizedValue = combinedExpiryValue + .replace(IrrelevantExpiryCharactersPatternExpression, "") + .trim(); + + // Do this after initial value replace to avoid identifying leading whitespace as delimiter + const parsedDelimiter = sanitizedValue.match(DelimiterPatternExpression)?.[0] || null; + + let dateParts = [sanitizedValue]; + + if (parsedDelimiter?.length) { + // If the parsed delimiter is a whitespace character, assign 's' (character class) instead + const delimiterPattern = /\s/.test(parsedDelimiter) ? "\\s" : "\\" + parsedDelimiter; + + sanitizedValue = sanitizedValue + // Remove all other delimiter characters not identified as the delimiter + .replace(new RegExp(`[^\\d${delimiterPattern}]`, "g"), "") + // Also de-dupe the delimiter character + .replace(new RegExp(`[${delimiterPattern}]{2,}`, "g"), parsedDelimiter); + + dateParts = sanitizedValue.split(parsedDelimiter); + } + + return ( + dateParts + // remove values that have no length + .filter((splitValue) => splitValue?.length) + ); +} + +/** + * Given an array of split card expiry date parts, + * returns an array of those values ordered by year then month + * + * @param {string[]} splitDateInput + * @return {*} {([string | null, string | null])} + */ +function parseDelimitedYearMonthExpiry([firstPart, secondPart]: string[]): [string, string] { + // Conditionals here are structured to avoid unnecessary evaluations and are ordered + // from more authoritative checks to checks yielding increasingly inferred conclusions + + // If a 4-digit value is found (when there are multiple parts), it can't be month + if (ExpiryFullYearPatternExpression.test(firstPart)) { + return [firstPart, secondPart]; + } + + // If a 4-digit value is found (when there are multiple parts), it can't be month + if (ExpiryFullYearPatternExpression.test(secondPart)) { + return [secondPart, firstPart]; + } + + // If it's a two digit value that doesn't match against month pattern, assume it's a year + if (/\d{2}/.test(firstPart) && !MonthPatternExpression.test(firstPart)) { + return [firstPart, secondPart]; + } + + // If it's a two digit value that doesn't match against month pattern, assume it's a year + if (/\d{2}/.test(secondPart) && !MonthPatternExpression.test(secondPart)) { + return [secondPart, firstPart]; + } + + // Values are too ambiguous (e.g. "12/09"). For the most part, + // a month-looking value likely is, at the time of writing (year 2024). + let parsedYear = firstPart; + let parsedMonth = secondPart; + + if (MonthPatternExpression.test(firstPart)) { + parsedYear = secondPart; + parsedMonth = firstPart; + } + + return [parsedYear, parsedMonth]; +} + +/** + * Given a single string of integers, attempts to identify card expiry date portions within + * and return values ordered by year then month + * + * @param {string} dateInput + * @return {*} {([string | null, string | null])} + */ +function parseNonDelimitedYearMonthExpiry(dateInput: string): [string | null, string | null] { + if (dateInput.length > 4) { + // e.g. + // "052024" + // "202405" + // "20245" + // "52024" + + // If the value is over 5-characters long, it likely has a full year format in it + const [parsedYear, parsedMonth] = dateInput + .split(new RegExp(`(?=${ExpiryFullYearPattern})|(?<=${ExpiryFullYearPattern})`, "g")) + .sort((current: string, next: string) => (current.length > next.length ? -1 : 1)); + + return [parsedYear, parsedMonth]; + } + + if (dateInput.length === 4) { + // e.g. + // "0524" + // "2405" + + // If the `sanitizedFirstPart` value is a length of 4, it must be split in half, since + // neither a year or month will be represented with three characters + const splitFirstPartFirstHalf = dateInput.slice(0, 2); + const splitFirstPartSecondHalf = dateInput.slice(-2); + + let parsedYear = splitFirstPartSecondHalf; + let parsedMonth = splitFirstPartFirstHalf; + + // If the first part doesn't match a month pattern, assume it's a year + if (!MonthPatternExpression.test(splitFirstPartFirstHalf)) { + parsedYear = splitFirstPartFirstHalf; + parsedMonth = splitFirstPartSecondHalf; + } + + return [parsedYear, parsedMonth]; + } + + // e.g. + // "245" + // "202" + // "212" + // "022" + // "111" + + // A valid year representation here must be two characters so try to find it first. + + let parsedYear = null; + let parsedMonth = null; + + // Split if there is a digit with a leading zero + const splitFirstPartOnLeadingZero = dateInput.split(/(?<=0[1-9]{1})|(?=0[1-9]{1})/); + + // Assume a leading zero indicates a month in ambiguous cases (e.g. "202"), since we're + // dealing with expiry dates and the next two-digit year with a leading zero will be 2100 + if (splitFirstPartOnLeadingZero.length > 1) { + parsedYear = splitFirstPartOnLeadingZero[0]; + parsedMonth = splitFirstPartOnLeadingZero[1]; + + if (splitFirstPartOnLeadingZero[0].startsWith("0")) { + parsedMonth = splitFirstPartOnLeadingZero[0]; + parsedYear = splitFirstPartOnLeadingZero[1]; + } + } else { + // Here, a year has to be two-digits, and a month can't be more than one, so assume the first two digits that are greater than the current year is the year representation. + parsedYear = dateInput.slice(0, 2); + parsedMonth = dateInput.slice(-1); + + const currentYear = new Date().getFullYear(); + const normalizedParsedYear = parseInt(normalizeExpiryYearFormat(parsedYear), 10); + const normalizedParsedYearAlternative = parseInt( + normalizeExpiryYearFormat(dateInput.slice(-2)), + 10, + ); + + if (normalizedParsedYear < currentYear && normalizedParsedYearAlternative >= currentYear) { + parsedYear = dateInput.slice(-2); + parsedMonth = dateInput.slice(0, 1); + } + } + + return [parsedYear, parsedMonth]; +} + +/** + * Attempt to parse year and month parts of a combined expiry date value. + * + * @param {string} combinedExpiryValue + * @return {*} {([string | null, string | null])} + */ +export function parseYearMonthExpiry(combinedExpiryValue: string): [Year | null, string | null] { + let parsedYear = null; + let parsedMonth = null; + + const dateParts = splitCombinedDateValues(combinedExpiryValue); + + if (dateParts.length < 1) { + return [null, null]; + } + + const sanitizedFirstPart = + dateParts[0]?.replace(IrrelevantExpiryCharactersPatternExpression, "") || ""; + const sanitizedSecondPart = + dateParts[1]?.replace(IrrelevantExpiryCharactersPatternExpression, "") || ""; + + // If there is only one date part, no delimiter was found in the passed value + if (dateParts.length === 1) { + [parsedYear, parsedMonth] = parseNonDelimitedYearMonthExpiry(sanitizedFirstPart); + } + // There are multiple date parts + else { + [parsedYear, parsedMonth] = parseDelimitedYearMonthExpiry([ + sanitizedFirstPart, + sanitizedSecondPart, + ]); + } + + const normalizedParsedYear = normalizeExpiryYearFormat(parsedYear); + const normalizedParsedMonth = parsedMonth?.replace(/^0+/, "").slice(0, 2); + + // Set "empty" values to null + parsedYear = normalizedParsedYear?.length ? normalizedParsedYear : null; + parsedMonth = normalizedParsedMonth?.length ? normalizedParsedMonth : null; + + return [parsedYear, parsedMonth]; +} diff --git a/libs/common/src/vault/models/view/card.view.ts b/libs/common/src/vault/models/view/card.view.ts index f3bf4e1fab2..fad10851e6a 100644 --- a/libs/common/src/vault/models/view/card.view.ts +++ b/libs/common/src/vault/models/view/card.view.ts @@ -1,8 +1,8 @@ import { Jsonify } from "type-fest"; +import { normalizeExpiryYearFormat } from "../../../autofill/utils"; import { CardLinkedId as LinkedId } from "../../enums"; import { linkedFieldOption } from "../../linked-field-option.decorator"; -import { normalizeExpiryYearFormat } from "../../utils"; import { ItemView } from "./item.view"; diff --git a/libs/common/src/vault/utils.spec.ts b/libs/common/src/vault/utils.spec.ts deleted file mode 100644 index 54ec66984e2..00000000000 --- a/libs/common/src/vault/utils.spec.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { CardView } from "@bitwarden/common/vault/models/view/card.view"; -import { normalizeExpiryYearFormat, isCardExpired } from "@bitwarden/common/vault/utils"; - -function getExpiryYearValueFormats(currentCentury: string) { - return [ - [-12, `${currentCentury}12`], - [0, `${currentCentury}00`], - [2043, "2043"], // valid year with a length of four should be taken directly - [24, `${currentCentury}24`], - [3054, "3054"], // valid year with a length of four should be taken directly - [31423524543, `${currentCentury}43`], - [4, `${currentCentury}04`], - [null, null], - [undefined, null], - ["-12", `${currentCentury}12`], - ["", null], - ["0", `${currentCentury}00`], - ["00", `${currentCentury}00`], - ["000", `${currentCentury}00`], - ["0000", `${currentCentury}00`], - ["00000", `${currentCentury}00`], - ["0234234", `${currentCentury}34`], - ["04", `${currentCentury}04`], - ["2043", "2043"], // valid year with a length of four should be taken directly - ["24", `${currentCentury}24`], - ["3054", "3054"], // valid year with a length of four should be taken directly - ["31423524543", `${currentCentury}43`], - ["4", `${currentCentury}04`], - ["aaaa", null], - ["adgshsfhjsdrtyhsrth", null], - ["agdredg42grg35grrr. ea3534@#^145345ag$%^ -_#$rdg ", `${currentCentury}45`], - ]; -} - -describe("normalizeExpiryYearFormat", () => { - const currentCentury = `${new Date().getFullYear()}`.slice(0, 2); - - const expiryYearValueFormats = getExpiryYearValueFormats(currentCentury); - - expiryYearValueFormats.forEach(([inputValue, expectedValue]) => { - it(`should return '${expectedValue}' when '${inputValue}' is passed`, () => { - const formattedValue = normalizeExpiryYearFormat(inputValue); - - expect(formattedValue).toEqual(expectedValue); - }); - }); - - describe("in the year 3107", () => { - const theDistantFuture = new Date(Date.UTC(3107, 1, 1)); - jest.spyOn(Date, "now").mockReturnValue(theDistantFuture.valueOf()); - - beforeAll(() => { - jest.useFakeTimers({ advanceTimers: true }); - jest.setSystemTime(theDistantFuture); - }); - - afterAll(() => { - jest.useRealTimers(); - }); - - const currentCentury = `${new Date(Date.now()).getFullYear()}`.slice(0, 2); - expect(currentCentury).toBe("31"); - - const expiryYearValueFormats = getExpiryYearValueFormats(currentCentury); - - expiryYearValueFormats.forEach(([inputValue, expectedValue]) => { - it(`should return '${expectedValue}' when '${inputValue}' is passed`, () => { - const formattedValue = normalizeExpiryYearFormat(inputValue); - - expect(formattedValue).toEqual(expectedValue); - }); - }); - jest.clearAllTimers(); - }); -}); - -function getCardExpiryDateValues() { - const currentDate = new Date(); - - const currentYear = currentDate.getFullYear(); - - // `Date` months are zero-indexed, our expiry date month inputs are one-indexed - const currentMonth = currentDate.getMonth() + 1; - - return [ - [null, null, false], // no month, no year - [undefined, undefined, false], // no month, no year, invalid values - ["", "", false], // no month, no year, invalid values - ["12", "agdredg42grg35grrr. ea3534@#^145345ag$%^ -_#$rdg ", false], // invalid values - ["0", `${currentYear - 1}`, true], // invalid 0 month - ["00", `${currentYear + 1}`, false], // invalid 0 month - [`${currentMonth}`, "0000", true], // current month, in the year 2000 - [null, `${currentYear}`.slice(-2), false], // no month, this year - [null, `${currentYear - 1}`.slice(-2), true], // no month, last year - ["1", null, false], // no year, January - ["1", `${currentYear - 1}`, true], // January last year - ["13", `${currentYear}`, false], // 12 + 1 is Feb. in the next year (Date is zero-indexed) - [`${currentMonth + 36}`, `${currentYear - 1}`, true], // even though the month value would put the date 3 years into the future when calculated with `Date`, an explicit year in the past indicates the card is expired - [`${currentMonth}`, `${currentYear}`, false], // this year, this month (not expired until the month is over) - [`${currentMonth}`, `${currentYear}`.slice(-2), false], // This month, this year (not expired until the month is over) - [`${currentMonth - 1}`, `${currentYear}`, true], // last month - [`${currentMonth - 1}`, `${currentYear + 1}`, false], // 11 months from now - ]; -} - -describe("isCardExpired", () => { - const expiryYearValueFormats = getCardExpiryDateValues(); - - expiryYearValueFormats.forEach( - ([inputMonth, inputYear, expectedValue]: [string | null, string | null, boolean]) => { - it(`should return ${expectedValue} when the card expiry month is ${inputMonth} and the card expiry year is ${inputYear}`, () => { - const testCardView = new CardView(); - testCardView.expMonth = inputMonth; - testCardView.expYear = inputYear; - - const cardIsExpired = isCardExpired(testCardView); - - expect(cardIsExpired).toBe(expectedValue); - }); - }, - ); -}); diff --git a/libs/common/src/vault/utils.ts b/libs/common/src/vault/utils.ts deleted file mode 100644 index 7d8784eda78..00000000000 --- a/libs/common/src/vault/utils.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { CardView } from "@bitwarden/common/vault/models/view/card.view"; - -type NonZeroIntegers = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; -type Year = `${NonZeroIntegers}${NonZeroIntegers}${0 | NonZeroIntegers}${0 | NonZeroIntegers}`; - -/** - * Takes a string or number value and returns a string value formatted as a valid 4-digit year - * - * @export - * @param {(string | number)} yearInput - * @return {*} {(Year | null)} - */ -export function normalizeExpiryYearFormat(yearInput: string | number): Year | null { - // The input[type="number"] is returning a number, convert it to a string - // An empty field returns null, avoid casting `"null"` to a string - const yearInputIsEmpty = yearInput == null || yearInput === ""; - let expirationYear = yearInputIsEmpty ? null : `${yearInput}`; - - // Exit early if year is already formatted correctly or empty - if (yearInputIsEmpty || /^[1-9]{1}\d{3}$/.test(expirationYear)) { - return expirationYear as Year; - } - - expirationYear = expirationYear - // For safety, because even input[type="number"] will allow decimals - .replace(/[^\d]/g, "") - // remove any leading zero padding (leave the last leading zero if it ends the string) - .replace(/^[0]+(?=.)/, ""); - - if (expirationYear === "") { - expirationYear = null; - } - - // given the context of payment card expiry, a year character length of 3, or over 4 - // is more likely to be a mistake than an intentional value for the far past or far future. - if (expirationYear && expirationYear.length !== 4) { - const paddedYear = ("00" + expirationYear).slice(-2); - const currentCentury = `${new Date().getFullYear()}`.slice(0, 2); - - expirationYear = currentCentury + paddedYear; - } - - return expirationYear as Year | null; -} - -/** - * Takes a cipher card view and returns "true" if the month and year affirmativey indicate - * the card is expired. - * - * @export - * @param {CardView} cipherCard - * @return {*} {boolean} - */ -export function isCardExpired(cipherCard: CardView): boolean { - if (cipherCard) { - const { expMonth = null, expYear = null } = cipherCard; - - const now = new Date(); - const normalizedYear = normalizeExpiryYearFormat(expYear); - - // If the card year is before the current year, don't bother checking the month - if (normalizedYear && parseInt(normalizedYear) < now.getFullYear()) { - return true; - } - - if (normalizedYear && expMonth) { - // `Date` months are zero-indexed - const parsedMonth = - parseInt(expMonth) - 1 || - // Add a month floor of 0 to protect against an invalid low month value of "0" - 0; - - const parsedYear = parseInt(normalizedYear); - - // First day of the next month minus one, to get last day of the card month - const cardExpiry = new Date(parsedYear, parsedMonth + 1, 0); - - return cardExpiry < now; - } - } - - return false; -} diff --git a/libs/importer/src/importers/base-importer.ts b/libs/importer/src/importers/base-importer.ts index 215210eda14..9cba62c5faf 100644 --- a/libs/importer/src/importers/base-importer.ts +++ b/libs/importer/src/importers/base-importer.ts @@ -1,5 +1,6 @@ import * as papa from "papaparse"; +import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service"; @@ -11,7 +12,6 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { SecureNoteView } from "@bitwarden/common/vault/models/view/secure-note.view"; -import { normalizeExpiryYearFormat } from "@bitwarden/common/vault/utils"; import { ImportResult } from "../models/import-result"; diff --git a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts index e1ef3dc0f37..bc4ff608805 100644 --- a/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts +++ b/libs/vault/src/cipher-form/components/card-details-section/card-details-section.component.ts @@ -5,11 +5,11 @@ import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils"; import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CardView } from "@bitwarden/common/vault/models/view/card.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { normalizeExpiryYearFormat } from "@bitwarden/common/vault/utils"; import { CardComponent, FormFieldModule, diff --git a/libs/vault/src/cipher-view/cipher-view.component.ts b/libs/vault/src/cipher-view/cipher-view.component.ts index cadf388e76d..e28f7f2a2bb 100644 --- a/libs/vault/src/cipher-view/cipher-view.component.ts +++ b/libs/vault/src/cipher-view/cipher-view.component.ts @@ -5,13 +5,13 @@ import { firstValueFrom, Observable, Subject, takeUntil } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { isCardExpired } from "@bitwarden/common/autofill/utils"; import { CollectionId } from "@bitwarden/common/types/guid"; import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; 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 { isCardExpired } from "@bitwarden/common/vault/utils"; import { CalloutModule, SearchModule } from "@bitwarden/components"; import { AdditionalOptionsComponent } from "./additional-options/additional-options.component"; From 0089ae0886c3556b4e9f181763badaa15b181cbe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:35:01 -0400 Subject: [PATCH 098/104] [deps] DevOps: Update gh minor (#11064) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-browser.yml | 4 ++-- .github/workflows/build-cli.yml | 4 ++-- .github/workflows/build-desktop.yml | 14 +++++++------- .github/workflows/build-web.yml | 2 +- .github/workflows/chromatic.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/release-desktop-beta.yml | 10 +++++----- .github/workflows/scan.yml | 4 ++-- .github/workflows/test.yml | 2 +- .github/workflows/version-bump.yml | 2 +- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 610769859fe..562567ffe77 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -114,7 +114,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -257,7 +257,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 76d86b45500..bccfc6d57ce 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -93,7 +93,7 @@ jobs: awk '{print tolower($0)}')" >> $GITHUB_ENV - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -171,7 +171,7 @@ jobs: choco install nasm --no-progress - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index ddb87320839..05039c3982b 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -143,7 +143,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -252,7 +252,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -458,7 +458,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -622,7 +622,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -839,7 +839,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -1045,7 +1045,7 @@ jobs: (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') - uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 with: channel-id: C074F5UESQ0 payload: | @@ -1084,7 +1084,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index d875078757c..54e993edb33 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -94,7 +94,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index c8dd3e77838..272b68139ac 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -38,7 +38,7 @@ jobs: echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: ${{ steps.retrieve-node-version.outputs.node_version }} @@ -57,7 +57,7 @@ jobs: run: npm run build-storybook:ci - name: Publish to Chromatic - uses: chromaui/action@b984808b772126a9f44b2b7737b131b68a2ede32 # v11.7.1 + uses: chromaui/action@c883154c39671e194613be2f09ff4d17bb95f1e6 # v11.10.3 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index bb495a5a26d..3f72d62214b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -48,7 +48,7 @@ jobs: echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index 5a6a3d52361..80b1ae092c6 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -130,7 +130,7 @@ jobs: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -220,7 +220,7 @@ jobs: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -409,7 +409,7 @@ jobs: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -543,7 +543,7 @@ jobs: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -756,7 +756,7 @@ jobs: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index 076bfb46e80..2320bae72f3 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -32,7 +32,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Scan with Checkmarx - uses: checkmarx/ast-github-action@1fe318de2993222574e6249750ba9000a4e2a6cd # 2.0.33 + uses: checkmarx/ast-github-action@9fda5a4a2c297608117a5a56af424502a9192e57 # 2.0.34 env: INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" with: @@ -47,7 +47,7 @@ jobs: --output-path . ${{ env.INCREMENTAL }} - name: Upload Checkmarx results to GitHub - uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 + uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 with: sarif_file: cx_result.sarif diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8d4067c1167..fbe0c0a798b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 71e7d3c10aa..fea68161bab 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -447,7 +447,7 @@ jobs: echo "EOF" >> $GITHUB_ENV - name: Generate GH App token - uses: actions/create-github-app-token@3378cda945da322a8db4b193e19d46352ebe2de5 # v1.10.4 + uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} From e3c75b3c1b4ec36c13b5fe2387ab1941eb6e56fb Mon Sep 17 00:00:00 2001 From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:07:29 +0100 Subject: [PATCH 099/104] Resolve the payment display (#11219) --- .../organizations/change-plan-dialog.component.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts index 63ac3afb930..42a987664f0 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts @@ -403,11 +403,13 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy { } get upgradeRequiresPaymentMethod() { - return ( - this.organization?.productTierType === ProductTierType.Free && - !this.showFree && - !this.billing?.paymentSource - ); + const isFreeTier = this.organization?.productTierType === ProductTierType.Free; + const shouldHideFree = !this.showFree; + const hasNoPaymentSource = this.deprecateStripeSourcesAPI + ? !this.paymentSource + : !this.billing?.paymentSource; + + return isFreeTier && shouldHideFree && hasNoPaymentSource; } get selectedSecretsManagerPlan() { From 3646214a0f8ea069fd01a982a0fdd86035c38646 Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Tue, 24 Sep 2024 14:13:27 -0400 Subject: [PATCH 100/104] Made allCiphers$ depend on the refresh subject$ (#11225) --- apps/web/src/app/vault/org-vault/vault.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 0a8e8769715..f378e171e78 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -318,8 +318,8 @@ export class VaultComponent implements OnInit, OnDestroy { shareReplay({ refCount: true, bufferSize: 1 }), ); - const allCiphers$ = organization$.pipe( - concatMap(async (organization) => { + const allCiphers$ = combineLatest([organization$, this.refresh$]).pipe( + switchMap(async ([organization]) => { // If user swaps organization reset the addAccessToggle if (!this.showAddAccessToggle || organization) { this.addAccessToggle(0); From bdcf920e624981612d39945e283beb66c2c1c14d Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:47:10 -0400 Subject: [PATCH 101/104] Remove references to device-trust-logging feature flag (#11183) --- .../src/auth/services/device-trust.service.implementation.ts | 4 ---- libs/common/src/enums/feature-flag.enum.ts | 2 -- 2 files changed, 6 deletions(-) diff --git a/libs/common/src/auth/services/device-trust.service.implementation.ts b/libs/common/src/auth/services/device-trust.service.implementation.ts index fe0f2cff0ab..c1cf871e257 100644 --- a/libs/common/src/auth/services/device-trust.service.implementation.ts +++ b/libs/common/src/auth/services/device-trust.service.implementation.ts @@ -2,7 +2,6 @@ import { firstValueFrom, map, Observable } from "rxjs"; import { UserDecryptionOptionsServiceAbstraction } from "@bitwarden/auth/common"; -import { FeatureFlag } from "../../enums/feature-flag.enum"; import { AppIdService } from "../../platform/abstractions/app-id.service"; import { ConfigService } from "../../platform/abstractions/config/config.service"; import { CryptoFunctionService } from "../../platform/abstractions/crypto-function.service"; @@ -334,9 +333,6 @@ export class DeviceTrustService implements DeviceTrustServiceAbstraction { } async recordDeviceTrustLoss(): Promise { - if (!(await this.configService.getFeatureFlag(FeatureFlag.DeviceTrustLogging))) { - return; - } const deviceIdentifier = await this.appIdService.getAppId(); await this.devicesApiService.postDeviceTrustLoss(deviceIdentifier); } diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index 3d426aee3b7..aeefa98b5dc 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -24,7 +24,6 @@ export enum FeatureFlag { VaultBulkManagementAction = "vault-bulk-management-action", AC2828_ProviderPortalMembersPage = "AC-2828_provider-portal-members-page", IdpAutoSubmitLogin = "idp-auto-submit-login", - DeviceTrustLogging = "pm-8285-device-trust-logging", AuthenticatorTwoFactorToken = "authenticator-2fa-token", UnauthenticatedExtensionUIRefresh = "unauth-ui-refresh", EnableUpgradePasswordManagerSub = "AC-2708-upgrade-password-manager-sub", @@ -69,7 +68,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.VaultBulkManagementAction]: FALSE, [FeatureFlag.AC2828_ProviderPortalMembersPage]: FALSE, [FeatureFlag.IdpAutoSubmitLogin]: FALSE, - [FeatureFlag.DeviceTrustLogging]: FALSE, [FeatureFlag.AuthenticatorTwoFactorToken]: FALSE, [FeatureFlag.UnauthenticatedExtensionUIRefresh]: FALSE, [FeatureFlag.EnableUpgradePasswordManagerSub]: FALSE, From 85b97d930481f2c35c4de14feefb1041277fa2a3 Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:02:39 -0400 Subject: [PATCH 102/104] Remove authenticator-token feature flag (#11182) --- .../auth/settings/two-factor-authenticator.component.ts | 8 -------- libs/common/src/enums/feature-flag.enum.ts | 2 -- 2 files changed, 10 deletions(-) diff --git a/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts b/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts index fdd595b7fcd..da5378f4790 100644 --- a/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts +++ b/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts @@ -11,7 +11,6 @@ import { DisableTwoFactorAuthenticatorRequest } from "@bitwarden/common/auth/mod import { UpdateTwoFactorAuthenticatorRequest } from "@bitwarden/common/auth/models/request/update-two-factor-authenticator.request"; import { TwoFactorAuthenticatorResponse } from "@bitwarden/common/auth/models/response/two-factor-authenticator.response"; import { AuthResponse } from "@bitwarden/common/auth/types/auth-response"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -127,13 +126,6 @@ export class TwoFactorAuthenticatorComponent } protected override async disableMethod() { - const twoFactorAuthenticatorTokenFeatureFlag = await this.configService.getFeatureFlag( - FeatureFlag.AuthenticatorTwoFactorToken, - ); - if (twoFactorAuthenticatorTokenFeatureFlag === false) { - return super.disableMethod(); - } - const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "disable" }, content: { key: "twoStepDisableDesc" }, diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index aeefa98b5dc..7ac473ff6ab 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -24,7 +24,6 @@ export enum FeatureFlag { VaultBulkManagementAction = "vault-bulk-management-action", AC2828_ProviderPortalMembersPage = "AC-2828_provider-portal-members-page", IdpAutoSubmitLogin = "idp-auto-submit-login", - AuthenticatorTwoFactorToken = "authenticator-2fa-token", UnauthenticatedExtensionUIRefresh = "unauth-ui-refresh", EnableUpgradePasswordManagerSub = "AC-2708-upgrade-password-manager-sub", GenerateIdentityFillScriptRefactor = "generate-identity-fill-script-refactor", @@ -68,7 +67,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.VaultBulkManagementAction]: FALSE, [FeatureFlag.AC2828_ProviderPortalMembersPage]: FALSE, [FeatureFlag.IdpAutoSubmitLogin]: FALSE, - [FeatureFlag.AuthenticatorTwoFactorToken]: FALSE, [FeatureFlag.UnauthenticatedExtensionUIRefresh]: FALSE, [FeatureFlag.EnableUpgradePasswordManagerSub]: FALSE, [FeatureFlag.GenerateIdentityFillScriptRefactor]: FALSE, From 4269489548d739dcff7829b21bba1baf119fc6c6 Mon Sep 17 00:00:00 2001 From: Jonathan Prusik Date: Tue, 24 Sep 2024 17:07:17 -0400 Subject: [PATCH 103/104] pin regedit dependency (#11228) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2058de0dc8..57b3aa028fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -164,7 +164,7 @@ "prettier": "3.3.3", "prettier-plugin-tailwindcss": "0.6.6", "process": "0.11.10", - "regedit": "^3.0.3", + "regedit": "3.0.3", "remark-gfm": "4.0.0", "rimraf": "6.0.1", "sass": "1.74.1", diff --git a/package.json b/package.json index aafc92bbd3d..b073cd27d87 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "prettier": "3.3.3", "prettier-plugin-tailwindcss": "0.6.6", "process": "0.11.10", - "regedit": "^3.0.3", + "regedit": "3.0.3", "remark-gfm": "4.0.0", "rimraf": "6.0.1", "sass": "1.74.1", From e6c3de9f47b3ffe3cb8a5fa9e24df04683e9eee4 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Tue, 24 Sep 2024 14:30:06 -0700 Subject: [PATCH 104/104] [PM-12609] Use shareReplay for allCiphers$ observable (#11229) --- apps/web/src/app/vault/org-vault/vault.component.ts | 1 + 1 file changed, 1 insertion(+) 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 f378e171e78..31f981b4898 100644 --- a/apps/web/src/app/vault/org-vault/vault.component.ts +++ b/apps/web/src/app/vault/org-vault/vault.component.ts @@ -343,6 +343,7 @@ export class VaultComponent implements OnInit, OnDestroy { await this.searchService.indexCiphers(ciphers, organization.id); return ciphers; }), + shareReplay({ refCount: true, bufferSize: 1 }), ); const allCipherMap$ = allCiphers$.pipe(