From 8522b6b87a6e2015afd08eb52f461fab0fc84bda Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Wed, 26 Nov 2025 16:27:48 -0500 Subject: [PATCH 01/37] Switched to used cipher list view for vault filters, and added perfomance logs for cipher list views (#17688) --- .../components/vault-filter.component.ts | 2 +- libs/common/src/vault/services/cipher.service.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts index 0326f8455a6..e40a32dc8b9 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts @@ -313,7 +313,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { const data$ = combineLatest([ this.restrictedItemTypesService.restricted$, - this.cipherService.cipherViews$(userId), + this.cipherService.cipherListViews$(userId), ]).pipe( map(([restrictedTypes, ciphers]) => { const restrictedForUser = restrictedTypes diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index 1e7e5302d41..72c1ca40913 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -141,6 +141,8 @@ export class CipherService implements CipherServiceAbstraction { * Usage of the {@link CipherViewLike} type is recommended to ensure both `CipherView` and `CipherListView` are supported. */ cipherListViews$ = perUserCache$((userId: UserId) => { + let decryptStartTime: number; + return this.configService.getFeatureFlag$(FeatureFlag.PM22134SdkCipherListView).pipe( switchMap((useSdk) => { if (!useSdk) { @@ -158,11 +160,23 @@ export class CipherService implements CipherServiceAbstraction { (cipherData) => new Cipher(cipherData, localData?.[cipherData.id as CipherId]), ), ), + tap(() => { + decryptStartTime = performance.now(); + }), switchMap(async (ciphers) => { const [decrypted, failures] = await this.decryptCiphersWithSdk(ciphers, userId, false); await this.setFailedDecryptedCiphers(failures, userId); return decrypted; }), + tap((decrypted) => { + this.logService.measure( + decryptStartTime, + "Vault", + "CipherService", + "listView decrypt complete", + [["Items", decrypted.length]], + ); + }), ); }), ); From 6f5491f7dcdbcf33d88f8f3896deaf02f71dfd5c Mon Sep 17 00:00:00 2001 From: John Harrington <84741727+harr1424@users.noreply.github.com> Date: Wed, 26 Nov 2025 15:08:59 -0700 Subject: [PATCH 02/37] PM-22143 Refactor TS enums to be const objects (Send specific enums) (#16399) --- .../add-edit/send-add-edit.component.ts | 7 ++- .../popup/send-v2/send-v2.component.spec.ts | 2 +- .../tools/popup/send-v2/send-v2.component.ts | 23 +++++--- apps/cli/src/tools/send/send.program.ts | 2 +- .../src/app/tools/send/send.component.ts | 17 +++--- libs/common/src/tools/send/enums/send-type.ts | 16 +++-- .../send-add-edit-dialog.component.ts | 21 +++---- .../send-details.component.spec.ts | 27 +++++++++ .../send-details/send-details.component.ts | 59 +++++++++++++++---- 9 files changed, 126 insertions(+), 48 deletions(-) create mode 100644 libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.spec.ts 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 3481ced35dc..8f30d00cc31 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 @@ -41,7 +41,12 @@ import { SendFilePopoutDialogContainerComponent } from "../send-file-popout-dial class QueryParams { constructor(params: Params) { this.sendId = params.sendId; - this.type = parseInt(params.type, 10); + const sendTypeValue = parseInt(params.type, 10); + if (sendTypeValue === SendType.Text || sendTypeValue === SendType.File) { + this.type = sendTypeValue; + } else { + throw new Error(`Invalid SendType: ${params.type}`); + } } /** diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts index 63ede7ba357..6d79f430a37 100644 --- a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts @@ -37,7 +37,7 @@ import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-heade import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; -import { SendV2Component, SendState } from "./send-v2.component"; +import { SendState, SendV2Component } from "./send-v2.component"; describe("SendV2Component", () => { let component: SendV2Component; diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.ts b/apps/browser/src/tools/popup/send-v2/send-v2.component.ts index e3baba53c42..89769bdd1ce 100644 --- a/apps/browser/src/tools/popup/send-v2/send-v2.component.ts +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.ts @@ -38,12 +38,16 @@ import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-heade import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; import { VaultFadeInOutSkeletonComponent } from "../../../vault/popup/components/vault-fade-in-out-skeleton/vault-fade-in-out-skeleton.component"; -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum SendState { - Empty, - NoResults, -} +/** A state of the Send list UI. */ +export const SendState = Object.freeze({ + /** No sends exist for the current filter (file or text). */ + Empty: "Empty", + /** Sends exist, but none match the current filter/search. */ + NoResults: "NoResults", +} as const); + +/** A state of the Send list UI. */ +export type SendState = (typeof SendState)[keyof typeof SendState]; // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -114,6 +118,11 @@ export class SendV2Component implements OnDestroy { protected sendsDisabled = false; + private readonly sendTypeTitles: Record = { + [SendType.File]: "fileSends", + [SendType.Text]: "textSends", + }; + constructor( protected sendItemsService: SendItemsService, protected sendListFiltersService: SendListFiltersService, @@ -130,7 +139,7 @@ export class SendV2Component implements OnDestroy { .pipe(takeUntilDestroyed()) .subscribe(([emptyList, noFilteredResults, currentFilter]) => { if (currentFilter?.sendType !== null) { - this.title = `${this.sendType[currentFilter.sendType].toLowerCase()}Sends`; + this.title = this.sendTypeTitles[currentFilter.sendType] ?? "allSends"; } else { this.title = "allSends"; } diff --git a/apps/cli/src/tools/send/send.program.ts b/apps/cli/src/tools/send/send.program.ts index 6c643e04cd0..33bf4518ccd 100644 --- a/apps/cli/src/tools/send/send.program.ts +++ b/apps/cli/src/tools/send/send.program.ts @@ -308,7 +308,7 @@ export class SendProgram extends BaseProgram { let sendFile = null; let sendText = null; let name = Utils.newGuid(); - let type = SendType.Text; + let type: SendType = SendType.Text; if (options.file != null) { data = path.resolve(data); if (!fs.existsSync(data)) { diff --git a/apps/desktop/src/app/tools/send/send.component.ts b/apps/desktop/src/app/tools/send/send.component.ts index 3605ca3d2dc..b58c3961bde 100644 --- a/apps/desktop/src/app/tools/send/send.component.ts +++ b/apps/desktop/src/app/tools/send/send.component.ts @@ -25,13 +25,16 @@ import { SearchBarService } from "../../layout/search/search-bar.service"; import { AddEditComponent } from "./add-edit.component"; -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -enum Action { - None = "", - Add = "add", - Edit = "edit", -} +const Action = Object.freeze({ + /** No action is currently active. */ + None: "", + /** The user is adding a new Send. */ + Add: "add", + /** The user is editing an existing Send. */ + Edit: "edit", +} as const); + +type Action = (typeof Action)[keyof typeof Action]; const BroadcasterSubscriptionId = "SendComponent"; diff --git a/libs/common/src/tools/send/enums/send-type.ts b/libs/common/src/tools/send/enums/send-type.ts index 5b03c71d22a..c2c5bdc6f6e 100644 --- a/libs/common/src/tools/send/enums/send-type.ts +++ b/libs/common/src/tools/send/enums/send-type.ts @@ -1,6 +1,10 @@ -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum SendType { - Text = 0, - File = 1, -} +/** A type of Send. */ +export const SendType = Object.freeze({ + /** Send contains plain text. */ + Text: 0, + /** Send contains a file. */ + File: 1, +} as const); + +/** A type of Send. */ +export type SendType = (typeof SendType)[keyof typeof SendType]; diff --git a/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts b/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts index 5b4e913f693..6f49c0ecce5 100644 --- a/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts +++ b/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts @@ -35,19 +35,16 @@ export interface SendItemDialogParams { disableForm?: boolean; } -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum SendItemDialogResult { - /** - * A Send was saved (created or updated). - */ - Saved = "saved", +/** A result of the Send add/edit dialog. */ +export const SendItemDialogResult = Object.freeze({ + /** The send item was created or updated. */ + Saved: "saved", + /** The send item was deleted. */ + Deleted: "deleted", +} as const); - /** - * A Send was deleted. - */ - Deleted = "deleted", -} +/** A result of the Send add/edit dialog. */ +export type SendItemDialogResult = (typeof SendItemDialogResult)[keyof typeof SendItemDialogResult]; /** * Component for adding or editing a send item. diff --git a/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.spec.ts b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.spec.ts new file mode 100644 index 00000000000..576842cd877 --- /dev/null +++ b/libs/tools/send/send-ui/src/send-form/components/send-details/send-details.component.spec.ts @@ -0,0 +1,27 @@ +import { DatePreset, isDatePreset, asDatePreset } from "./send-details.component"; + +describe("SendDetails DatePreset utilities", () => { + it("accepts all defined numeric presets", () => { + const presets: Array = [ + DatePreset.OneHour, + DatePreset.OneDay, + DatePreset.TwoDays, + DatePreset.ThreeDays, + DatePreset.SevenDays, + DatePreset.FourteenDays, + DatePreset.ThirtyDays, + ]; + presets.forEach((p) => { + expect(isDatePreset(p)).toBe(true); + expect(asDatePreset(p)).toBe(p); + }); + }); + + it("rejects invalid numbers and non-numeric values", () => { + const invalid: Array = [5, -1, 0.5, 0, 9999, "never", "foo", null, undefined, {}, []]; + invalid.forEach((v) => { + expect(isDatePreset(v)).toBe(false); + expect(asDatePreset(v)).toBeUndefined(); + }); + }); +}); 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 2996c18bf63..ec351bee923 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 @@ -29,24 +29,50 @@ import { SendOptionsComponent } from "../options/send-options.component"; import { SendFileDetailsComponent } from "./send-file-details.component"; import { SendTextDetailsComponent } from "./send-text-details.component"; -// Value = hours -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum DatePreset { - OneHour = 1, - OneDay = 24, - TwoDays = 48, - ThreeDays = 72, - SevenDays = 168, - FourteenDays = 336, - ThirtyDays = 720, -} +/** A preset duration (in hours) for deletion. */ +export const DatePreset = Object.freeze({ + /** One-hour duration. */ + OneHour: 1, + /** One-day duration (24 hours). */ + OneDay: 24, + /** Two-day duration (48 hours). */ + TwoDays: 48, + /** Three-day duration (72 hours). */ + ThreeDays: 72, + /** Seven-day duration (168 hours). */ + SevenDays: 168, + /** Fourteen-day duration (336 hours). */ + FourteenDays: 336, + /** Thirty-day duration (720 hours). */ + ThirtyDays: 720, +} as const); + +/** A preset duration (in hours) for deletion. */ +export type DatePreset = (typeof DatePreset)[keyof typeof DatePreset]; export interface DatePresetSelectOption { name: string; value: DatePreset | string; } +const namesByDatePreset = new Map( + Object.entries(DatePreset).map(([k, v]) => [v as DatePreset, k as keyof typeof DatePreset]), +); + +/** + * Runtime type guard to verify a value is a valid DatePreset. + */ +export function isDatePreset(value: unknown): value is DatePreset { + return namesByDatePreset.has(value as DatePreset); +} + +/** + * Safe converter to DatePreset (numeric preset), returns undefined for invalid inputs. + */ +export function asDatePreset(value: unknown): DatePreset | undefined { + return isDatePreset(value) ? (value as DatePreset) : undefined; +} + // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ @@ -153,11 +179,18 @@ export class SendDetailsComponent implements OnInit { const now = new Date(); const selectedValue = this.sendDetailsForm.controls.selectedDeletionDatePreset.value; + // The form allows for custom date strings, if such is used, return it without worrying about DatePreset validation if (typeof selectedValue === "string") { return selectedValue; } - const milliseconds = now.setTime(now.getTime() + (selectedValue as number) * 60 * 60 * 1000); + // Otherwise, treat it as a preset and validate at runtime + const preset = asDatePreset(selectedValue); + if (!isDatePreset(preset)) { + return new Date(now).toString(); + } + + const milliseconds = now.setTime(now.getTime() + preset * 60 * 60 * 1000); return new Date(milliseconds).toString(); } } From eb4fd4215336f1d9392f88e33e11a3545e1f7d58 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Thu, 27 Nov 2025 00:22:59 +0100 Subject: [PATCH 03/37] [PM-28446] Log package types (#17496) * User agent * Update to use header * Fix build on cli * Replace unsandboxed with unknown * Apply feedback * Prevent sending null values --- .../browser-platform-utils.service.ts | 19 +++++++++++++++++++ .../services/cli-platform-utils.service.ts | 4 ++++ apps/desktop/src/main/window.main.ts | 1 + .../electron-platform-utils.service.ts | 16 ++++++++++++++++ .../app/core/web-platform-utils.service.ts | 4 ++++ .../abstractions/platform-utils.service.ts | 1 + libs/common/src/services/api.service.ts | 5 +++++ 7 files changed, 50 insertions(+) diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts index 5a933d9715e..c3dd3adb8ce 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts @@ -329,6 +329,25 @@ export abstract class BrowserPlatformUtilsService implements PlatformUtilsServic return autofillCommand; } + async packageType(): Promise { + switch (this.getDevice()) { + case DeviceType.ChromeExtension: + return "Chrome Extension"; + case DeviceType.FirefoxExtension: + return "Firefox Extension"; + case DeviceType.OperaExtension: + return "Opera Extension"; + case DeviceType.EdgeExtension: + return "Edge Extension"; + case DeviceType.VivaldiExtension: + return "Vivaldi Extension"; + case DeviceType.SafariExtension: + return "Safari Extension"; + default: + return "Unknown Browser Extension"; + } + } + /** * Triggers the offscreen document API to copy the text to the clipboard. */ diff --git a/apps/cli/src/platform/services/cli-platform-utils.service.ts b/apps/cli/src/platform/services/cli-platform-utils.service.ts index 27f8e5268bd..acd2009a6d9 100644 --- a/apps/cli/src/platform/services/cli-platform-utils.service.ts +++ b/apps/cli/src/platform/services/cli-platform-utils.service.ts @@ -152,4 +152,8 @@ export class CliPlatformUtilsService implements PlatformUtilsService { getAutofillKeyboardShortcut(): Promise { return null; } + + async packageType(): Promise { + return null; + } } diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts index d148a1a35f8..0e234126ea3 100644 --- a/apps/desktop/src/main/window.main.ts +++ b/apps/desktop/src/main/window.main.ts @@ -185,6 +185,7 @@ export class WindowMain { await this.createWindow(); resolve(); + if (this.argvCallback != null) { this.argvCallback(process.argv); } diff --git a/apps/desktop/src/platform/services/electron-platform-utils.service.ts b/apps/desktop/src/platform/services/electron-platform-utils.service.ts index de63c6b28aa..9377ac567ec 100644 --- a/apps/desktop/src/platform/services/electron-platform-utils.service.ts +++ b/apps/desktop/src/platform/services/electron-platform-utils.service.ts @@ -151,4 +151,20 @@ export class ElectronPlatformUtilsService implements PlatformUtilsService { getAutofillKeyboardShortcut(): Promise { return null; } + + async packageType(): Promise { + if (ipc.platform.isMacAppStore) { + return "MacAppStore"; + } else if (ipc.platform.isWindowsStore) { + return "WindowsStore"; + } else if (ipc.platform.isAppImage) { + return "AppImage"; + } else if (ipc.platform.isSnapStore) { + return "Snap"; + } else if (ipc.platform.isFlatpak) { + return "Flatpak"; + } else { + return "Unknown"; + } + } } diff --git a/apps/web/src/app/core/web-platform-utils.service.ts b/apps/web/src/app/core/web-platform-utils.service.ts index dea4323bcc4..037ee0f9060 100644 --- a/apps/web/src/app/core/web-platform-utils.service.ts +++ b/apps/web/src/app/core/web-platform-utils.service.ts @@ -219,4 +219,8 @@ export class WebPlatformUtilsService implements PlatformUtilsService { getAutofillKeyboardShortcut(): Promise { return null; } + + packageType(): Promise { + return null; + } } diff --git a/libs/common/src/platform/abstractions/platform-utils.service.ts b/libs/common/src/platform/abstractions/platform-utils.service.ts index 4d126aeab88..0aabd7aa5a1 100644 --- a/libs/common/src/platform/abstractions/platform-utils.service.ts +++ b/libs/common/src/platform/abstractions/platform-utils.service.ts @@ -55,4 +55,5 @@ export abstract class PlatformUtilsService { abstract readFromClipboard(): Promise; abstract supportsSecureStorage(): boolean; abstract getAutofillKeyboardShortcut(): Promise; + abstract packageType(): Promise; } diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 633c7eedcc4..5f4d3de11b5 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -1325,6 +1325,11 @@ export class ApiService implements ApiServiceAbstraction { "Bitwarden-Client-Version", await this.platformUtilsService.getApplicationVersionNumber(), ); + + const packageType = await this.platformUtilsService.packageType(); + if (packageType != null) { + request.headers.set("Bitwarden-Package-Type", packageType); + } return this.nativeFetch(request); } From 4f36f7f360ad91a8ba4666a7bca155837da6ab84 Mon Sep 17 00:00:00 2001 From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> Date: Thu, 27 Nov 2025 07:47:01 +0100 Subject: [PATCH 04/37] Add Nx Console to vscode recommended extension list (#17683) Co-authored-by: Daniel James Smith --- clients.code-workspace | 1 + 1 file changed, 1 insertion(+) diff --git a/clients.code-workspace b/clients.code-workspace index f7d86d2a242..1dbef721fe6 100644 --- a/clients.code-workspace +++ b/clients.code-workspace @@ -82,6 +82,7 @@ "rust-lang.rust-analyzer", "tamasfe.even-better-toml", "vadimcn.vscode-lldb", + "nrwl.angular-console", ], }, } From 09a6600b34a8706e26767b0d590cdb23abbe0ad0 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 27 Nov 2025 14:03:16 +0000 Subject: [PATCH 05/37] Bumped client version(s) --- apps/browser/package.json | 2 +- apps/browser/src/manifest.json | 2 +- apps/browser/src/manifest.v3.json | 2 +- package-lock.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/browser/package.json b/apps/browser/package.json index a6a88b53db0..ff279dd64c6 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.11.1", + "version": "2025.11.2", "scripts": { "build": "npm run build:chrome", "build:bit": "npm run build:bit:chrome", diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 3d8f648daca..21a4e918535 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": "Bitwarden", - "version": "2025.11.1", + "version": "2025.11.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 2b2aa0f117b..1febac5aa95 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": "Bitwarden", - "version": "2025.11.1", + "version": "2025.11.2", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/package-lock.json b/package-lock.json index a939591e777..14255b95a7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -194,7 +194,7 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2025.11.1" + "version": "2025.11.2" }, "apps/cli": { "name": "@bitwarden/cli", From 22b4916934a5d2513626308f3f6e91efd58c2cf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 14:28:50 +0000 Subject: [PATCH 06/37] [deps] Platform: Update nx monorepo to v21.6.9 (#17703) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 154 +++++++++++++++++++++++----------------------- package.json | 12 ++-- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 14255b95a7d..a30df2ea5f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,11 +32,11 @@ "@microsoft/signalr": "8.0.7", "@microsoft/signalr-protocol-msgpack": "8.0.7", "@ng-select/ng-select": "14.9.0", - "@nx/devkit": "21.6.8", - "@nx/eslint": "21.6.8", - "@nx/jest": "21.6.8", - "@nx/js": "21.6.8", - "@nx/webpack": "21.6.8", + "@nx/devkit": "21.6.9", + "@nx/eslint": "21.6.9", + "@nx/jest": "21.6.9", + "@nx/js": "21.6.9", + "@nx/webpack": "21.6.9", "big-integer": "1.6.52", "braintree-web-drop-in": "1.46.0", "buffer": "6.0.3", @@ -159,7 +159,7 @@ "json5": "2.2.3", "lint-staged": "16.0.0", "mini-css-extract-plugin": "2.9.4", - "nx": "21.6.8", + "nx": "21.6.9", "postcss": "8.5.6", "postcss-loader": "8.2.0", "prettier": "3.6.2", @@ -9456,9 +9456,9 @@ } }, "node_modules/@nx/devkit": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.6.8.tgz", - "integrity": "sha512-N0cj0NqdxY2pcI0IJV+fAu362B6tppdv2ohSBNGacNeSqxfAlJxO5TFZePDmxX5nt0t9hAqT+iasfu4BSYGfZw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.6.9.tgz", + "integrity": "sha512-Si7Lo5OgiHz/xU/NL1v5LnynE5oGrQmYE3KXxZoSRWij/nxZKi0wEB0W6dT3MtQW8RY1y5mg45Ti0Ym+Clhi8Q==", "license": "MIT", "dependencies": { "ejs": "^3.1.7", @@ -9483,13 +9483,13 @@ } }, "node_modules/@nx/eslint": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.6.8.tgz", - "integrity": "sha512-dloTsg1n1zlAyP2Ohwiw9vhoUrF5XYo5pdmxAmnpE/P+e4ihWQfGtlu3JvEQNBp9Wwk4E7XkJVmVhJOm47PIww==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.6.9.tgz", + "integrity": "sha512-psd6GtWII5i1M15TTmdh8UZ/pBWlh6JtaVwlE5tk/GHlnCGXHEY+g3gKTsetjbuHjaocdwrfEy4TIB5J5Zh3HQ==", "license": "MIT", "dependencies": { - "@nx/devkit": "21.6.8", - "@nx/js": "21.6.8", + "@nx/devkit": "21.6.9", + "@nx/js": "21.6.9", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.9.2" @@ -9518,15 +9518,15 @@ } }, "node_modules/@nx/jest": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.6.8.tgz", - "integrity": "sha512-2RpDTbh6Q/sp0ryxJmi4oY8xOaR4Us6gc91BzTFYSrzG0cX4Q/lFTiIAbV8bXY1UTJ5HMgJobHAy5Sbcfo6TeQ==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.6.9.tgz", + "integrity": "sha512-8x/B3f616ti2BUXHhOQqewMyCxMMmy++Wh1YiKr5S922m7jog1oYsCzue+fmHsNijw9xMNAgsDjgy91I/iZZ0Q==", "license": "MIT", "dependencies": { "@jest/reporters": "^30.0.2", "@jest/test-result": "^30.0.2", - "@nx/devkit": "21.6.8", - "@nx/js": "21.6.8", + "@nx/devkit": "21.6.9", + "@nx/js": "21.6.9", "@phenomnomnominal/tsquery": "~5.0.1", "identity-obj-proxy": "3.0.0", "jest-config": "^30.0.2", @@ -10517,9 +10517,9 @@ } }, "node_modules/@nx/js": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.6.8.tgz", - "integrity": "sha512-I9Wu//28DXiSIFoW1IGbLRRfULITkYMOKGMnityQ71iJ8+9vi90a8xFyCWt4VzNxpMEreaoNynWJTf+I8UTGaw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.6.9.tgz", + "integrity": "sha512-KJnqe6W0Ly5AgpBOhygcVs5RssVKnKrISVp42CSirKx3nei6cus9VItwKBvBBAqmYw4AlrCe+/A2twTQCkeq1A==", "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", @@ -10529,8 +10529,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "21.6.8", - "@nx/workspace": "21.6.8", + "@nx/devkit": "21.6.9", + "@nx/workspace": "21.6.9", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -10669,9 +10669,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.6.8.tgz", - "integrity": "sha512-MG5bhSYhG49r+e0mLuztQVHz1sEy7cs8BvZJ56mm7JNQ1VfbaTyLAR7VcNw8O/1mJA8jYcg9fmxOIZOUnY1cEQ==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.6.9.tgz", + "integrity": "sha512-rN5cJAjKvyXfi+Zep7wvSNtGr35X1/qrm96K/Sf4sybvowyHmDdEMYxkR6BPNT8ct5JGMm35xPfx1yF/rJek3w==", "cpu": [ "arm64" ], @@ -10682,9 +10682,9 @@ ] }, "node_modules/@nx/nx-darwin-x64": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.6.8.tgz", - "integrity": "sha512-e9oXVTd6U6RFEc3k22PGoe5OSy40fyyytl+svSJQmK+5rxZalvAUna/mXtFcQC9m6No2daqqpfAZlyN5nG6WHw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.6.9.tgz", + "integrity": "sha512-rb/Dtum094nfJL8lYohne1duZr8uNQ4gvWTq/Cw/xowJwXGq3xzsSS2WTpDpRBMF45K+42fipGHNeHbCyYSF7g==", "cpu": [ "x64" ], @@ -10695,9 +10695,9 @@ ] }, "node_modules/@nx/nx-freebsd-x64": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.6.8.tgz", - "integrity": "sha512-gK3rsTXQj0hHCyaAvZmPZeCPkb3jzesgtkXuZf+7pCm5b4wiEA1i22ufp1UzwaTmWgbub/6NVMEDOGsVcay8mA==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.6.9.tgz", + "integrity": "sha512-Cd7QHeivvLBiQ6iRTsvprGk1YS+CaUCMw4A+3TOvHz608a/U3mEye8oRy2fyFTTL/lsH6dlihT3xi+HNyXKAyA==", "cpu": [ "x64" ], @@ -10708,9 +10708,9 @@ ] }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.6.8.tgz", - "integrity": "sha512-TXt3HTFhM4kuL9larxBuo3XpSngoA1JCtHavfYLRC3A8knACi7LwNQwnF5RWAcYgKMVE3/8IAhV8LuemXrPKKw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.6.9.tgz", + "integrity": "sha512-ASXay2jKhSU4tfY9Z2ByysqDQxYgTHCtoJ+XR5xRv9aoIos6oYeKAqQV/RLXpTklugu08nBtL/4IRw58x4oU4A==", "cpu": [ "arm" ], @@ -10721,9 +10721,9 @@ ] }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.6.8.tgz", - "integrity": "sha512-QwZREYIhqhDVEIf+KAv2VFipxMUoULXXS3qyLX3/q/4u8Y32fyM5wd+FXpv89cRCiveVsZp8io2W178R6lfKng==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.6.9.tgz", + "integrity": "sha512-1VS38xnAC8iH05A0nnbNn1hi9ypRnEPUfgLL3tPhAwQTWX2DQz4xR/j0NYNcCzL6yBe/JhdKlYoN/LI38lj2UA==", "cpu": [ "arm64" ], @@ -10734,9 +10734,9 @@ ] }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.6.8.tgz", - "integrity": "sha512-UZJyrZ6utU8g1W7E31iHDhWj1SjMidmDNyrVP4xK6IUrotx6qGrwfwWqzqvphhc1cA7w4Zz9N/rCCPQkdHzjLw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.6.9.tgz", + "integrity": "sha512-PScHPs0dp+Cc17RvY4Y5wlDXT6xdDlsyhna2JLawodVCyUVArtnbF7whn/VEZKesDD/vAf1avCt4oAjuYS8VXg==", "cpu": [ "arm64" ], @@ -10747,9 +10747,9 @@ ] }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.6.8.tgz", - "integrity": "sha512-HXINTg4P0/Yj76vsvqBAb7MNlLpkH1pl9JF2blXScOFXWzNoStd7b6xyrpCROdmi0Hk8y3UEwc8OIyLFIfixJg==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.6.9.tgz", + "integrity": "sha512-s8oX6/pLolHH3EyFJPcKITv+rzN/IZuidMCNkGfcr0jYVqrTZcJo8xUEwAQzf6u6J6urOm0bUK3BDuwJLEKESg==", "cpu": [ "x64" ], @@ -10760,9 +10760,9 @@ ] }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.6.8.tgz", - "integrity": "sha512-2YbXLhuSlElCtQTR1Ib94O3T4fX9uzSIkUMYGL3n04agG0HemXoxJa91TWwwOUMbEZffkhcPsJBOh2S5l47s9Q==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.6.9.tgz", + "integrity": "sha512-bojpGcscRrnet5N3waeHYnBHW0y6r5tSQ1phnwMjgoBFmWXw+0M+z/f2dfZcTtBmWc7Y/TnzaGb8EenC3a63cQ==", "cpu": [ "x64" ], @@ -10773,9 +10773,9 @@ ] }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.6.8.tgz", - "integrity": "sha512-/VSGtqa1oGHo5n24R39ZuGxMrGyf7pxFuCtL5hAzBHdTxFg/VZomPGd7BeV5VN5SbIw+fie+nTGkC5q3TOPGXw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.6.9.tgz", + "integrity": "sha512-cS1bdMiJBs4AcykJ3+vtAdw4RkZLLfXT20o+k07dEskRFADIa5yXdOs2j0qKoe7iCiORKCH+gI/YsPHCyHfV9Q==", "cpu": [ "arm64" ], @@ -10786,9 +10786,9 @@ ] }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.6.8.tgz", - "integrity": "sha512-xeBL7PcDqHH/Zw4d2A2qP7eLImzzcMO3hiKs5G42Wi92ACejAdUqpIduTL4RpArsXIHm5VEbE4KvHNii1mMU1A==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.6.9.tgz", + "integrity": "sha512-EX0ja8gWnmomiSbK9K58oATpTn/+KU6RKcrfzqA3yL5x/a+kEPSf66QOXGQjDpCGKWMoxN+6ex7zhpmqbqKxgg==", "cpu": [ "x64" ], @@ -10799,14 +10799,14 @@ ] }, "node_modules/@nx/webpack": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.6.8.tgz", - "integrity": "sha512-lVJJRqtNPbdSrbEws3/pty077kwlY3m7XDQZTzStCf9ZGE5tZR8LDe49DKlUZ6dLIO7RmHjW8laehXsvi9ZtHw==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.6.9.tgz", + "integrity": "sha512-2RWiZ4G/1VhEUTJtSH6zo9bvMxpRlV9AQGV3/NnP/dyH/owbZXrDuzd/hGW7s5CNE0RB3oN2dZG/ZEFJcGw55Q==", "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "21.6.8", - "@nx/js": "21.6.8", + "@nx/devkit": "21.6.9", + "@nx/js": "21.6.9", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -11273,16 +11273,16 @@ } }, "node_modules/@nx/workspace": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.6.8.tgz", - "integrity": "sha512-X2DgtqxFJwwte4GxancLZ2GFMc+9waRaLPL6goR/HAtIvKriqZAVMkywNMk1mnhrpo0M7UXmfbM51kf+nsS+bg==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.6.9.tgz", + "integrity": "sha512-tUucr8hrpdhFITMjEEF8vm1j0GSW0ecFTySViWnnVvYyyv7tbidK/76MV/iyV/SjSamOHm2zIXS9fCfXV4LpAQ==", "license": "MIT", "dependencies": { - "@nx/devkit": "21.6.8", + "@nx/devkit": "21.6.9", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "21.6.8", + "nx": "21.6.9", "picomatch": "4.0.2", "semver": "^7.6.3", "tslib": "^2.3.0", @@ -32086,9 +32086,9 @@ "license": "MIT" }, "node_modules/nx": { - "version": "21.6.8", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.6.8.tgz", - "integrity": "sha512-NilGEk1Cngs3Se9JW+f9cDeN6RBvmABhpEtgMvOK8RAAZszq6B380oCzKcQljhnrbQ6+v6j/Vb7hBPTCvXb0Ng==", + "version": "21.6.9", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.6.9.tgz", + "integrity": "sha512-RPuIb04QIOE2WLDcvKDjrAQlkI9+EnP8/9KyG/I296JA1lJhlIk7BH3F6Py7uLHD7B1adSBsCDf/tT6540Ng7A==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -32133,16 +32133,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.6.8", - "@nx/nx-darwin-x64": "21.6.8", - "@nx/nx-freebsd-x64": "21.6.8", - "@nx/nx-linux-arm-gnueabihf": "21.6.8", - "@nx/nx-linux-arm64-gnu": "21.6.8", - "@nx/nx-linux-arm64-musl": "21.6.8", - "@nx/nx-linux-x64-gnu": "21.6.8", - "@nx/nx-linux-x64-musl": "21.6.8", - "@nx/nx-win32-arm64-msvc": "21.6.8", - "@nx/nx-win32-x64-msvc": "21.6.8" + "@nx/nx-darwin-arm64": "21.6.9", + "@nx/nx-darwin-x64": "21.6.9", + "@nx/nx-freebsd-x64": "21.6.9", + "@nx/nx-linux-arm-gnueabihf": "21.6.9", + "@nx/nx-linux-arm64-gnu": "21.6.9", + "@nx/nx-linux-arm64-musl": "21.6.9", + "@nx/nx-linux-x64-gnu": "21.6.9", + "@nx/nx-linux-x64-musl": "21.6.9", + "@nx/nx-win32-arm64-msvc": "21.6.9", + "@nx/nx-win32-x64-msvc": "21.6.9" }, "peerDependencies": { "@swc-node/register": "^1.8.0", diff --git a/package.json b/package.json index 5bbc2a903d0..b7ac08b5ad9 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "json5": "2.2.3", "lint-staged": "16.0.0", "mini-css-extract-plugin": "2.9.4", - "nx": "21.6.8", + "nx": "21.6.9", "postcss": "8.5.6", "postcss-loader": "8.2.0", "prettier": "3.6.2", @@ -169,11 +169,11 @@ "@microsoft/signalr": "8.0.7", "@microsoft/signalr-protocol-msgpack": "8.0.7", "@ng-select/ng-select": "14.9.0", - "@nx/devkit": "21.6.8", - "@nx/eslint": "21.6.8", - "@nx/jest": "21.6.8", - "@nx/js": "21.6.8", - "@nx/webpack": "21.6.8", + "@nx/devkit": "21.6.9", + "@nx/eslint": "21.6.9", + "@nx/jest": "21.6.9", + "@nx/js": "21.6.9", + "@nx/webpack": "21.6.9", "big-integer": "1.6.52", "braintree-web-drop-in": "1.46.0", "buffer": "6.0.3", From d7dcdf2f03b0e89b13cca52dc28e8309958142c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 09:50:15 -0600 Subject: [PATCH 07/37] [deps] Tools: Update Rust crate clap to v4.5.53 (#17702) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- apps/desktop/desktop_native/Cargo.lock | 8 ++++---- .../bitwarden_chromium_import_helper/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index a1cdb9f26eb..f6380c747d8 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -639,9 +639,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -649,9 +649,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", diff --git a/apps/desktop/desktop_native/bitwarden_chromium_import_helper/Cargo.toml b/apps/desktop/desktop_native/bitwarden_chromium_import_helper/Cargo.toml index 6455142023a..ff641731661 100644 --- a/apps/desktop/desktop_native/bitwarden_chromium_import_helper/Cargo.toml +++ b/apps/desktop/desktop_native/bitwarden_chromium_import_helper/Cargo.toml @@ -11,7 +11,7 @@ publish.workspace = true aes-gcm = { workspace = true } chacha20poly1305 = { workspace = true } chromium_importer = { path = "../chromium_importer" } -clap = { version = "=4.5.51", features = ["derive"] } +clap = { version = "=4.5.53", features = ["derive"] } scopeguard = { workspace = true } sysinfo = { workspace = true } windows = { workspace = true, features = [ From 9264c131450f7bde69dd41c1149a7bc52f6ecdc4 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 06:24:03 +0100 Subject: [PATCH 08/37] Autosync the updated translations (#17710) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/fa/messages.json | 156 +++++++++---------- apps/desktop/src/locales/it/messages.json | 88 +++++------ apps/desktop/src/locales/pt_BR/messages.json | 150 +++++++++--------- apps/desktop/src/locales/zh_CN/messages.json | 2 +- 4 files changed, 198 insertions(+), 198 deletions(-) diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index caa241eb036..ac0e83dd44d 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -42,7 +42,7 @@ "message": "جستجوی گاوصندوق" }, "resetSearch": { - "message": "Reset search" + "message": "پاک کردن جستجو" }, "addItem": { "message": "افزودن مورد" @@ -70,7 +70,7 @@ } }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "شما اجازه ویرایش این آیتم را ندارید" }, "welcomeBack": { "message": "خوش آمدید" @@ -579,7 +579,7 @@ "message": "کپی کد تأیید (TOTP)" }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "کپی$FIELD$،$CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -706,10 +706,10 @@ "message": "پیوست ذخیره شد" }, "addAttachment": { - "message": "Add attachment" + "message": "افزودن پیوست" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "حداکثر حجم فایل ۵۰۰ مگابایت است" }, "file": { "message": "پرونده" @@ -775,7 +775,7 @@ "message": "استفاده از ورود تک مرحله‌ای" }, "yourOrganizationRequiresSingleSignOn": { - "message": "Your organization requires single sign-on." + "message": "سازمان شما ورود یکپارچه را الزامی کرده است." }, "submit": { "message": "ثبت" @@ -1039,7 +1039,7 @@ "message": "شما باید یا نشانی اینترنتی پایه سرور را اضافه کنید، یا حداقل یک محیط سفارشی تعریف کنید." }, "selfHostedEnvMustUseHttps": { - "message": "URLs must use HTTPS." + "message": "آدرس‌های وب باید از HTTPS استفاده کنند." }, "customEnvironment": { "message": "محیط سفارشی" @@ -1232,7 +1232,7 @@ "message": "کلمه عبور اصلی نامعتبر است" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "رمز عبور اصلی نامعتبر است. تأیید کنید که ایمیل شما صحیح است و حساب کاربری شما در $HOST$ ایجاد شده است.", "placeholders": { "host": { "content": "$1", @@ -1247,7 +1247,7 @@ "message": "ورود دو مرحله‌ای" }, "vaultTimeoutHeader": { - "message": "Vault timeout" + "message": "وقفه زمانی گاوصندوق" }, "vaultTimeout": { "message": "متوقف شدن گاو‌صندوق" @@ -1256,7 +1256,7 @@ "message": "پایان زمان" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "اقدام وقفه زمانی" }, "vaultTimeoutDesc": { "message": "انتخاب کنید که گاو‌صندوق شما چه زمانی عمل توقف زمانی گاوصندوق را انجام دهد." @@ -1321,7 +1321,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "نمایش آیکون‌های وب‌سایت و دریافت آدرس‌های تغییر رمز عبور" }, "enableMinToTray": { "message": "کوچک کردن به نماد سینی" @@ -1467,7 +1467,7 @@ "description": "Copy credit card security code (CVV)" }, "cardNumber": { - "message": "card number" + "message": "شماره کارت" }, "premiumMembership": { "message": "عضویت پرمیوم" @@ -1862,10 +1862,10 @@ "message": "در زمان شروع مجدد، با کلمه عبور اصلی قفل کن" }, "requireMasterPasswordOrPinOnAppRestart": { - "message": "Require master password or PIN on app restart" + "message": "درخواست رمز عبور اصلی یا پین هنگام راه‌اندازی مجدد برنامه" }, "requireMasterPasswordOnAppRestart": { - "message": "Require master password on app restart" + "message": "درخواست رمز عبور اصلی هنگام راه‌اندازی مجدد برنامه" }, "deleteAccount": { "message": "حذف حساب کاربری" @@ -2437,13 +2437,13 @@ "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روزرسانی کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه‌های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "پس از تغییر رمز عبور، باید با رمز عبور جدید خود وارد شوید. نشست‌های فعال در سایر دستگاه‌ها ظرف یک ساعت خارج خواهند شد." }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "برای تکمیل بازیابی حساب، رمز عبور اصلی خود را تغییر دهید." }, "updateMasterPasswordSubtitle": { - "message": "Your master password does not meet this organization’s requirements. Change your master password to continue." + "message": "رمز عبور اصلی شما با الزامات این سازمان مطابقت ندارد. برای ادامه، رمز عبور اصلی خود را تغییر دهید." }, "tdeDisabledMasterPasswordRequired": { "message": "سازمان شما رمزگذاری دستگاه‌های مورد اعتماد را غیرفعال کرده است. لطفاً برای دسترسی به گاوصندوق خود یک کلمه عبور اصلی تنظیم کنید." @@ -2533,10 +2533,10 @@ "message": "مهلت زمانی شما بیش از محدودیت‌های تعیین شده توسط سازمان‌تان است." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "الزامات سیاست سازمانی بر روی گزینه‌های وقفه زمانی شما اعمال شده است" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "سیاست‌های سازمان شما حداکثر زمان مجاز وقفه گاوصندوق را روی $HOURS$ ساعت و $MINUTES$ دقیقه تنظیم کرده است.", "placeholders": { "hours": { "content": "$1", @@ -2549,7 +2549,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "زمان وقفه از محدودیت تعیین شده توسط سازمان شما بیشتر است: حداکثر $HOURS$ ساعت و $MINUTES$ دقیقه", "placeholders": { "hours": { "content": "$1", @@ -2562,7 +2562,7 @@ } }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "حداقل زمان وقفه سفارشی ۱ دقیقه است." }, "inviteAccepted": { "message": "دعوتنامه پذیرفته شد" @@ -2679,7 +2679,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "فقط از گاوصندوق سازمانی مرتبط با $ORGANIZATION$ خروجی گرفته خواهد شد.", "placeholders": { "organization": { "content": "$1", @@ -2688,7 +2688,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "فقط از گاوصندوق سازمانی مرتبط با $ORGANIZATION$ خروجی گرفته خواهد شد. مجموعه‌های «آیتم‌های من» شامل نخواهند شد.", "placeholders": { "organization": { "content": "$1", @@ -3073,7 +3073,7 @@ } }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "درخواست ورود برای $EMAIL$ در $DEVICE$ تأیید شد", "placeholders": { "email": { "content": "$1", @@ -3086,21 +3086,21 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "شما یک تلاش ورود از دستگاهی دیگر را رد کردید. اگر این شما بودید، دوباره با آن دستگاه برای ورود تلاش کنید." }, "webApp": { - "message": "Web app" + "message": "نسخه وب" }, "mobile": { - "message": "Mobile", + "message": "موبایل", "description": "Mobile app" }, "extension": { - "message": "Extension", + "message": "افزونه", "description": "Browser extension/addon" }, "desktop": { - "message": "Desktop", + "message": "دسکتاپ", "description": "Desktop app" }, "cli": { @@ -3111,10 +3111,10 @@ "description": "Software Development Kit" }, "server": { - "message": "Server" + "message": "سرور" }, "loginRequest": { - "message": "Login request" + "message": "درخواست ورود" }, "deviceType": { "message": "نوع دستگاه" @@ -3258,10 +3258,10 @@ "message": "درخواست تأیید مدیر" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "امکان تکمیل ورود وجود ندارد" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "شما باید در یک دستگاه قابل اعتماد وارد شوید یا از مدیر خود بخواهید رمز عبوری به شما اختصاص دهد." }, "region": { "message": "منطقه" @@ -3528,10 +3528,10 @@ "message": "یک مجموعه انتخاب کنید" }, "importTargetHintCollection": { - "message": "Select this option if you want the imported file contents moved to a collection" + "message": "اگر می‌خواهید محتویات فایل وارد شده به یک مجموعه منتقل شود، این گزینه را انتخاب کنید" }, "importTargetHintFolder": { - "message": "Select this option if you want the imported file contents moved to a folder" + "message": "اگر می‌خواهید محتویات فایل وارد شده به یک پوشه منتقل شود، این گزینه را انتخاب کنید" }, "importUnassignedItemsError": { "message": "پرونده حاوی موارد اختصاص نیافته است." @@ -3628,10 +3628,10 @@ "message": "لطفاً برای ورود، از اطلاعات کاربری شرکت خود استفاده کنید." }, "importDirectlyFromBrowser": { - "message": "Import directly from browser" + "message": "وارد کردن مستقیم از مرورگر" }, "browserProfile": { - "message": "Browser Profile" + "message": "پروفایل مرورگر" }, "seeDetailedInstructions": { "message": "دستورالعمل‌های کامل را در سایت راهنمای ما مشاهده کنید در", @@ -3673,11 +3673,11 @@ "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "گزینه‌های پیشرفته", "description": "Advanced option placeholder for uri option component" }, "warningCapitalized": { - "message": "Warning", + "message": "هشدار", "description": "Warning (should maintain locale-relevant capitalization)" }, "success": { @@ -3876,10 +3876,10 @@ "message": "تغییر کلمه عبور در معرض خطر" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "این ورود در معرض خطر است و فاقد وب‌سایت می‌باشد. برای امنیت بیشتر، یک وب‌سایت اضافه کنید و رمز عبور را تغییر دهید." }, "missingWebsite": { - "message": "Missing website" + "message": "وب‌سایت وجود ندارد" }, "cannotRemoveViewOnlyCollections": { "message": "نمی‌توانید مجموعه‌هایی را که فقط دسترسی مشاهده دارند حذف کنید: $COLLECTIONS$", @@ -3977,10 +3977,10 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "aboutThisSetting": { - "message": "About this setting" + "message": "درباره این تنظیم" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "بیت‌واردن از URI های ورود ذخیره شده استفاده می‌کند تا تشخیص دهد کدام آیکون یا آدرس تغییر رمز عبور باید برای بهبود تجربه شما استفاده شود. هنگام استفاده از این سرویس، هیچ اطلاعاتی جمع‌آوری یا ذخیره نمی‌شود." }, "assignToCollections": { "message": "اختصاص به مجموعه‌ها" @@ -4117,111 +4117,111 @@ } }, "showMore": { - "message": "Show more" + "message": "نمایش بیشتر" }, "showLess": { - "message": "Show less" + "message": "نمایش کمتر" }, "enableAutotypeDescription": { - "message": "Bitwarden does not validate input locations, be sure you are in the right window and field before using the shortcut." + "message": "بیت‌واردن مکان‌های ورودی را اعتبارسنجی نمی‌کند؛ قبل از استفاده از میانبر، مطمئن شوید که در پنجره و فیلد صحیح قرار دارید." }, "typeShortcut": { - "message": "Type shortcut" + "message": "تایپ میانبر" }, "editAutotypeShortcutDescription": { - "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + "message": "شامل یک یا دو مورد از کلیدهای تغییردهنده زیر: Ctrl، Alt، Win یا Shift و یک حرف." }, "invalidShortcut": { - "message": "Invalid shortcut" + "message": "میانبر نامعتبر" }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "مسیرهای بیشتر", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "next": { - "message": "Next" + "message": "بعدی" }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "تأیید دامنه Key Connector" }, "confirm": { - "message": "Confirm" + "message": "تأیید" }, "enableAutotypeShortcutPreview": { - "message": "Enable autotype shortcut (Feature Preview)" + "message": "فعال‌سازی میانبر تایپ خودکار (پیش‌نمایش ویژگی)" }, "enableAutotypeShortcutDescription": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "برای جلوگیری از پر کردن داده‌ها در مکان اشتباه، قبل از استفاده از میانبر مطمئن شوید که در فیلد صحیح قرار دارید." }, "editShortcut": { - "message": "Edit shortcut" + "message": "ویرایش میانبر" }, "archiveNoun": { - "message": "Archive", + "message": "بایگانی", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "بایگانی کردن", "description": "Verb" }, "unArchive": { - "message": "Unarchive" + "message": "خارج کردن از بایگانی" }, "itemsInArchive": { - "message": "Items in archive" + "message": "آیتم‌های موجود در بایگانی" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "آیتمی در بایگانی وجود ندارد" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "آیتم‌های بایگانی‌شده در اینجا نمایش داده می‌شوند و از نتایج جستجوی عمومی و پیشنهاد ها پر کردن خودکار حذف خواهند شد." }, "itemWasSentToArchive": { - "message": "Item was sent to archive" + "message": "آیتم به بایگانی فرستاده شد" }, "itemWasUnarchived": { - "message": "Item was unarchived" + "message": "آیتم از بایگانی خارج شد" }, "archiveItem": { - "message": "Archive item" + "message": "بایگانی آیتم" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "آیتم‌های بایگانی‌شده از نتایج جستجوی عمومی و پیشنهاد ها پر کردن خودکار حذف می‌شوند. آیا مطمئن هستید که می‌خواهید این آیتم را بایگانی کنید؟" }, "zipPostalCodeLabel": { - "message": "ZIP / Postal code" + "message": "کد پستی" }, "cardNumberLabel": { - "message": "Card number" + "message": "شماره کارت" }, "upgradeNow": { - "message": "Upgrade now" + "message": "هم‌اکنون ارتقا دهید" }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "تولیدکننده رمز دوعاملی داخلی" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "ذخیره‌سازی امن فایل" }, "emergencyAccess": { - "message": "Emergency access" + "message": "دسترسی اضطراری" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "پایش نشت اطلاعات" }, "andMoreFeatures": { - "message": "And more!" + "message": "و بیشتر!" }, "planDescPremium": { - "message": "Complete online security" + "message": "امنیت آنلاین کامل" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "ارتقا به نسخه پرمیوم" }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "اقدام وقفه زمانی" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "وقفه زمانی نشست" } } diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 1656a301b42..8caf4982356 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -70,7 +70,7 @@ } }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Non hai i permessi per modificare questo elemento" }, "welcomeBack": { "message": "Bentornato" @@ -775,7 +775,7 @@ "message": "Usa il Single Sign-On" }, "yourOrganizationRequiresSingleSignOn": { - "message": "Your organization requires single sign-on." + "message": "La tua organizzazione richiede un accesso Single Sign-On (SSO)." }, "submit": { "message": "Invia" @@ -1039,7 +1039,7 @@ "message": "Devi aggiungere lo URL del server di base o almeno un ambiente personalizzato." }, "selfHostedEnvMustUseHttps": { - "message": "URLs must use HTTPS." + "message": "Gli indirizzi devono usare il protocollo HTTPS." }, "customEnvironment": { "message": "Ambiente personalizzato" @@ -1232,7 +1232,7 @@ "message": "Password principale errata" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Password principale errata. Verifica che l'email sia corretta e che l'account sia stato creato su $HOST$.", "placeholders": { "host": { "content": "$1", @@ -1321,7 +1321,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "showIconsChangePasswordUrls": { - "message": "Show website icons and retrieve change password URLs" + "message": "Mostra le icone dei siti e recupera gli URL di cambio password" }, "enableMinToTray": { "message": "Minimizza nell'area di notifica" @@ -1862,10 +1862,10 @@ "message": "Blocca con password principale al riavvio" }, "requireMasterPasswordOrPinOnAppRestart": { - "message": "Require master password or PIN on app restart" + "message": "Richiedi la password principale dopo il riavvio" }, "requireMasterPasswordOnAppRestart": { - "message": "Require master password on app restart" + "message": "Richiedi la password principale dopo il riavvio" }, "deleteAccount": { "message": "Elimina account" @@ -2562,7 +2562,7 @@ } }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Il timeout personalizzato minimo è di 1 minuto." }, "inviteAccepted": { "message": "Invito accettato" @@ -2679,7 +2679,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Solo la cassaforte dell'organizzazione associata a $ORGANIZATION$ sarà esportata.", "placeholders": { "organization": { "content": "$1", @@ -2688,7 +2688,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Solo la cassaforte dell'organizzazione associata a $ORGANIZATION$ sarà esportata. Eventuali raccolte di elementi non saranno incluse.", "placeholders": { "organization": { "content": "$1", @@ -3628,10 +3628,10 @@ "message": "Continua ad accedere utilizzando le tue credenziali aziendali." }, "importDirectlyFromBrowser": { - "message": "Import directly from browser" + "message": "Importa direttamente dal browser" }, "browserProfile": { - "message": "Browser Profile" + "message": "Profilo Browser" }, "seeDetailedInstructions": { "message": "Consulta le istruzioni dettagliate sul nostro sito di assistenza su", @@ -3876,10 +3876,10 @@ "message": "Modifica la password non sicura o esposta" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Questo login è a rischio e non contiene un sito web. Aggiungi un sito web e cambia la password per maggiore sicurezza." }, "missingWebsite": { - "message": "Missing website" + "message": "Sito Web mancante" }, "cannotRemoveViewOnlyCollections": { "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", @@ -3977,10 +3977,10 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "aboutThisSetting": { - "message": "About this setting" + "message": "Informazioni su questa opzione" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "Bitwarden userà gli URL memorizzati in ogni login per mostrare, se possibile, l'icona del sito Web e l'URL di modifica password per facilitare la modifica delle credenziali. Nessuna informazione è raccolta o archiviata per il funzionamento di questo servizio." }, "assignToCollections": { "message": "Assegna a una raccolta" @@ -4126,13 +4126,13 @@ "message": "Bitwarden non convalida i campi di input: assicurati di essere nella finestra e nel campo di testo corretti prima di usare la scorciatoia." }, "typeShortcut": { - "message": "Type shortcut" + "message": "Premi i tasti da impostare per la scorciatoia" }, "editAutotypeShortcutDescription": { - "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, or Shift, and a letter." + "message": "Includi uno o due dei seguenti modificatori: Ctrl, Alt, Win, o Shift, più una lettera." }, "invalidShortcut": { - "message": "Invalid shortcut" + "message": "Scorciatoia non valida" }, "moreBreadcrumbs": { "message": "Ulteriori segmenti", @@ -4148,80 +4148,80 @@ "message": "Conferma" }, "enableAutotypeShortcutPreview": { - "message": "Enable autotype shortcut (Feature Preview)" + "message": "Abilita la scorciatoia automatica (beta)" }, "enableAutotypeShortcutDescription": { - "message": "Be sure you are in the correct field before using the shortcut to avoid filling data into the wrong place." + "message": "Assicurati di essere nel campo corretto prima di usare la scorciatoia." }, "editShortcut": { - "message": "Edit shortcut" + "message": "Modifica scorciatoia" }, "archiveNoun": { - "message": "Archive", + "message": "Archivio", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "Archivia", "description": "Verb" }, "unArchive": { - "message": "Unarchive" + "message": "Rimuovi dall'Archivio" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Elementi archiviati" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Nessun elemento nell'archivio" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Gli elementi archiviati appariranno qui e saranno esclusi dai risultati di ricerca e dall'auto-riempimento." }, "itemWasSentToArchive": { - "message": "Item was sent to archive" + "message": "Elemento archiviato" }, "itemWasUnarchived": { - "message": "Item was unarchived" + "message": "Elemento rimosso dall'archivio" }, "archiveItem": { - "message": "Archive item" + "message": "Archivia elemento" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Gli elementi archiviati sono esclusi dai risultati di ricerca e dall'auto-riempimento. Vuoi davvero archiviare questo elemento?" }, "zipPostalCodeLabel": { - "message": "ZIP / Postal code" + "message": "CAP / codice postale" }, "cardNumberLabel": { - "message": "Card number" + "message": "Numero carta" }, "upgradeNow": { - "message": "Upgrade now" + "message": "Aggiorna ora" }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "App di autenticazione integrata" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Archiviazione sicura di file" }, "emergencyAccess": { - "message": "Emergency access" + "message": "Accesso di emergenza" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Monitoraggio delle violazioni" }, "andMoreFeatures": { - "message": "And more!" + "message": "E molto altro!" }, "planDescPremium": { - "message": "Complete online security" + "message": "Sicurezza online completa" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Aggiorna a Premium" }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Azione al timeout" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Timeout della sessione" } } diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 7871ac72533..288f8e42616 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -36,13 +36,13 @@ "message": "Pastas" }, "collections": { - "message": "Coleções" + "message": "Conjuntos" }, "searchVault": { - "message": "Pesquisar no cofre" + "message": "Buscar no cofre" }, "resetSearch": { - "message": "Apagar pesquisa" + "message": "Apagar busca" }, "addItem": { "message": "Adicionar item" @@ -268,7 +268,7 @@ "message": "Requer Premium" }, "premiumRequiredDesc": { - "message": "Uma assinatura Premium é necessária para usar esse recurso." + "message": "Um plano Premium é necessário para usar esse recurso." }, "errorOccurred": { "message": "Ocorreu um erro." @@ -681,16 +681,16 @@ "description": "Indicates that a policy limits the credential generator screen." }, "searchCollection": { - "message": "Pesquisar coleção" + "message": "Buscar no conjunto" }, "searchFolder": { - "message": "Pesquisar pasta" + "message": "Buscar na pasta" }, "searchFavorites": { - "message": "Pesquisar favoritos" + "message": "Buscar nos favoritos" }, "searchType": { - "message": "Pesquisar tipo", + "message": "Buscar tipo", "description": "Search item type" }, "newAttachment": { @@ -854,7 +854,7 @@ "message": "Solicitar dica" }, "requestPasswordHint": { - "message": "Dica da senha principal" + "message": "Solicitar dica da senha" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de e-mail da sua conta e sua dica da senha será enviada para você" @@ -1097,7 +1097,7 @@ "message": "Recurso indisponível" }, "loggedOut": { - "message": "Sessão encerrada" + "message": "Desconectado" }, "loggedOutDesc": { "message": "Você foi desconectado de sua conta." @@ -1121,7 +1121,7 @@ "message": "Você tem certeza que deseja sair?" }, "logOut": { - "message": "Sair" + "message": "Desconectar" }, "addNewLogin": { "message": "Nova credencial" @@ -1295,16 +1295,16 @@ "message": "4 horas" }, "onIdle": { - "message": "Quando o sistema ficar inativo" + "message": "Na inatividade do sistema" }, "onSleep": { - "message": "Quando o sistema hibernar" + "message": "Na hibernação do sistema" }, "onLocked": { - "message": "Quando o sistema for bloqueado" + "message": "No bloqueio do sistema" }, "onRestart": { - "message": "Ao reiniciar" + "message": "No reinício" }, "never": { "message": "Nunca" @@ -1470,22 +1470,22 @@ "message": "número do cartão" }, "premiumMembership": { - "message": "Assinatura Premium" + "message": "Plano Premium" }, "premiumManage": { - "message": "Gerenciar assinatura" + "message": "Gerenciar plano" }, "premiumManageAlert": { - "message": "Você pode gerenciar a sua assinatura no cofre web do bitwarden.com. Você deseja visitar o site agora?" + "message": "Você pode gerenciar o seu plano no cofre web do bitwarden.com. Você deseja visitar o site agora?" }, "premiumRefresh": { - "message": "Recarregar assinatura" + "message": "Recarregar plano" }, "premiumNotCurrentMember": { "message": "Você não é um membro Premium atualmente." }, "premiumSignUpAndGet": { - "message": "Inscreva-se para uma assinatura Premium e receba:" + "message": "Inscreva-se para um plano Premium e receba:" }, "premiumSignUpStorage": { "message": "1 GB de armazenamento criptografado para anexos de arquivos." @@ -1792,7 +1792,7 @@ "message": "Você não faz parte de uma organização. Organizações permitem-lhe compartilhar itens com segurança com outros usuários." }, "noCollectionsInList": { - "message": "Não há coleções para listar." + "message": "Não há conjuntos para listar." }, "ownership": { "message": "Propriedade" @@ -1898,10 +1898,10 @@ "message": "Sempre mostrar um ícone na barra de menu." }, "hideToMenuBar": { - "message": "Esconder na barra de menu" + "message": "Ocultar na barra de menu" }, "selectOneCollection": { - "message": "Você deve selecionar pelo menos uma coleção." + "message": "Você deve selecionar pelo menos um conjunto." }, "premiumUpdated": { "message": "Você fez upgrade para o Premium." @@ -1955,7 +1955,7 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Pesquisar na lixeira" + "message": "Buscar na lixeira" }, "permanentlyDeleteItem": { "message": "Apagar item para sempre" @@ -1973,7 +1973,7 @@ "message": "Apagar para sempre" }, "vaultTimeoutLogOutConfirmation": { - "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" + "message": "Ao desconectar-se, todo o seu acesso ao cofre será removido e será necessário autenticação on-line após o período do tempo limite. Tem certeza que quer usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Confirmação de ação do tempo limite" @@ -2205,7 +2205,7 @@ "message": "Devido ao método de instalação, o suporte à biometria não pôde ser ativado automaticamente. Você gostaria de abrir a documentação sobre como fazer isso manualmente?" }, "personalOwnershipSubmitError": { - "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as coleções disponíveis." + "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre os conjuntos disponíveis." }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { "message": "Sua senha nova não pode ser a mesma que a sua atual." @@ -2239,7 +2239,7 @@ "message": "Texto" }, "searchSends": { - "message": "Pesquisar Sends", + "message": "Buscar nos Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -2688,7 +2688,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. As coleções de itens não serão incluídos.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Os itens dos meus conjuntos não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -3261,13 +3261,13 @@ "message": "Incapaz de concluir a autenticação" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "Você precisa entrar com um dispositivo confiável ou solicitar ao administrador que lhe atribua uma senha." + "message": "Você precisa se conectar com um dispositivo confiado ou solicitar ao administrador que lhe atribua uma senha." }, "region": { "message": "Região" }, "ssoIdentifierRequired": { - "message": "Identificador de SSO da organização é necessário." + "message": "O identificador de SSO da organização é necessário." }, "eu": { "message": "União Europeia", @@ -3286,19 +3286,19 @@ "message": "Aprovação do administrador necessária" }, "adminApprovalRequestSentToAdmins": { - "message": "Seu pedido foi enviado para seu administrador." + "message": "Sua solicitação foi enviada para seu administrador." }, "troubleLoggingIn": { "message": "Problemas para acessar?" }, "loginApproved": { - "message": "Sessão aprovada" + "message": "Autenticação aprovada" }, "userEmailMissing": { "message": "E-mail do usuário ausente" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "E-mail de usuário ativo não encontrado. Desconectando." + "message": "E-mail do usuário ativo não encontrado. Desconectando você." }, "deviceTrusted": { "message": "Dispositivo confiado" @@ -3316,13 +3316,13 @@ "message": "Organização não foi confiada" }, "emergencyAccessTrustWarning": { - "message": "Para a segurança da sua conta, apenas confirme se você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida em sua conta" + "message": "Para a segurança da sua conta, apenas confirme se você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida na conta deles" }, "orgTrustWarning": { "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem uma recuperação de conta ativa e a frase biométrica exibida abaixo corresponde com a da organização." }, "orgTrustWarning1": { - "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A matrícula permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a impressão digital da organização." + "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A inscrição permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a da organização." }, "trustUser": { "message": "Confiar no usuário" @@ -3334,7 +3334,7 @@ "message": "obrigatório" }, "search": { - "message": "Pesquisar" + "message": "Buscar" }, "inputMinLength": { "message": "A entrada deve ter pelo menos $COUNT$ caracteres.", @@ -3373,7 +3373,7 @@ } }, "inputMaxValue": { - "message": "O valor de entrada não deve exceder $MAX$.", + "message": "O valor de entrada deve não exceder $MAX$.", "placeholders": { "max": { "content": "$1", @@ -3428,7 +3428,7 @@ "message": "Submenu" }, "toggleSideNavigation": { - "message": "Ativar/desativar navegação lateral" + "message": "Habilitar navegação lateral" }, "skipToContent": { "message": "Ir para o conteúdo" @@ -3440,10 +3440,10 @@ "message": "A chave de acesso não será copiada" }, "passkeyNotCopiedAlert": { - "message": "A senha não será copiada para o item clonado. Deseja continuar clonando este item?" + "message": "A chave de acesso não será copiada para o item clonado. Deseja continuar clonando este item?" }, "aliasDomain": { - "message": "Alias do domínio" + "message": "Domínio de alias" }, "importData": { "message": "Importar dados", @@ -3492,10 +3492,10 @@ "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "A autenticação de dois fatores é necessária para sua conta. Siga os passos abaixo para conseguir entrar." + "message": "A autenticação de duas etapas do Duo é necessária para sua conta. Siga os passos abaixo para conseguir se conectar." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Siga os passos abaixo para finalizar a autenticação." + "message": "Siga os passos abaixo para terminar de se conectar." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { "message": "Siga os passos abaixo para finalizar a autenticação com a sua chave de segurança." @@ -3525,13 +3525,13 @@ "message": "Selecione uma pasta" }, "selectImportCollection": { - "message": "Selecione uma coleção" + "message": "Selecione um conjunto" }, "importTargetHintCollection": { - "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma coleção" + "message": "Selecione esta opção caso queira importar os conteúdos do arquivo para um conjunto" }, "importTargetHintFolder": { - "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma pasta" + "message": "Selecione esta opção caso queira importar os conteúdos do arquivo para uma pasta" }, "importUnassignedItemsError": { "message": "Arquivo contém itens não atribuídos." @@ -3543,7 +3543,7 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Escolher arquivo" + "message": "Selecionar arquivo" }, "noFileChosen": { "message": "Nenhum arquivo escolhido" @@ -3604,7 +3604,7 @@ "message": "Importando sua conta..." }, "lastPassMFARequired": { - "message": "Requer autenticação multifatores do LastPass" + "message": "Requer autenticação de múltiplos fatores do LastPass" }, "lastPassMFADesc": { "message": "Digite sua senha única do app autenticador" @@ -3625,7 +3625,7 @@ "message": "Aguardando autenticação do SSO" }, "awaitingSSODesc": { - "message": "Continue autenticando-se usando as credenciais da sua empresa." + "message": "Continue conectando-se usando as credenciais da sua empresa." }, "importDirectlyFromBrowser": { "message": "Importar diretamente do navegador" @@ -3647,7 +3647,7 @@ "message": "Tente novamente ou procure um e-mail do LastPass para verificar que é você." }, "collection": { - "message": "Coleção" + "message": "Conjunto" }, "lastPassYubikeyDesc": { "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botão dela." @@ -3669,7 +3669,7 @@ "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "Mais sobre detecção de correspondências", + "message": "Mais sobre a detecção de correspondência", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { @@ -3699,13 +3699,13 @@ "message": "Chave de acesso removida" }, "errorAssigningTargetCollection": { - "message": "Erro ao atribuir coleção de destino." + "message": "Erro ao atribuir conjunto de destino." }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir pasta de destino." }, "viewItemsIn": { - "message": "Visualizar itens em $NAME$", + "message": "Ver itens em $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -3768,10 +3768,10 @@ "message": "O desbloqueio por biometria está indisponível no momento." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." + "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos do sistema." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." + "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos do sistema." }, "biometricsStatusHelptextNotEnabledLocally": { "message": "O desbloqueio por biometria está indisponível, pois a opção não foi ativada no aplicativo de computador de $EMAIL$.", @@ -3834,7 +3834,7 @@ "message": "assinar uma mensagem" }, "sshActionGitSign": { - "message": "assinar um commit no git" + "message": "assinar uma commit no git" }, "unknownApplication": { "message": "Um aplicativo" @@ -3852,7 +3852,7 @@ "message": "Chave SSH importada com sucesso" }, "fileSavedToDevice": { - "message": "Arquivo salvo no dispositivo. Gerencie a partir dos downloads do seu dispositivo." + "message": "Arquivo salvo no dispositivo. Gerencie a partir das transferências do seu dispositivo." }, "allowScreenshots": { "message": "Permitir captura de tela" @@ -3870,7 +3870,7 @@ "message": "Atualização de extensão necessária" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "A extensão de navegador que você está usando está desatualizada. Atualize-a ou desative a validação de integração de frase biométrica do navegador nas configurações do aplicativo da área de trabalho." + "message": "A extensão de navegador que você está usando está desatualizada. Atualize-a ou desative a validação da frase biométrica da integração do navegador nas configurações do aplicativo de computador." }, "changeAtRiskPassword": { "message": "Alterar senhas em risco" @@ -3882,7 +3882,7 @@ "message": "Site ausente" }, "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Apenas visualização: $COLLECTIONS$", + "message": "Você não pode remover conjuntos com permissões de Apenas ver: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -3983,25 +3983,25 @@ "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de mudança de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." }, "assignToCollections": { - "message": "Atribuir a coleções" + "message": "Atribuir a conjuntos" }, "assignToTheseCollections": { - "message": "Atribuir a estas coleções" + "message": "Atribuir a estes conjuntos" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Apenas membros da organização com acesso a essas coleções poderão ver o item." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver o item." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Apenas membros da organização com acesso a essas coleções poderão ver os itens." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver os itens." }, "noCollectionsAssigned": { - "message": "Nenhuma coleção foi atribuída" + "message": "Nenhum conjunto foi atribuído" }, "assign": { "message": "Atribuir" }, "bulkCollectionAssignmentDialogDescription": { - "message": "Apenas membros da organização com acesso a essas coleções poderão ver os itens." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver os itens." }, "bulkCollectionAssignmentWarning": { "message": "Você selecionou $TOTAL_COUNT$ itens. Você não pode atualizar $READONLY_COUNT$ dos itens, pois você não tem as permissões de edição.", @@ -4016,10 +4016,10 @@ } }, "selectCollectionsToAssign": { - "message": "Selecione coleções para atribuir" + "message": "Selecione conjuntos a atribuir" }, "personalItemsTransferWarning": { - "message": "$PERSONAL_ITEMS_COUNT$ serão permanentemente transferidas para a organização selecionada. Você deixará de ser o proprietário desses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ serão permanentemente transferidos para a organização selecionada. Você deixará de ser o proprietário desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4028,7 +4028,7 @@ } }, "personalItemsWithOrgTransferWarning": { - "message": "$PERSONAL_ITEMS_COUNT$ serão permanentemente transferidas para $ORG$. Você deixará de ser o proprietário desses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ serão permanentemente transferidos para $ORG$. Você deixará de ser o proprietário desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4053,7 +4053,7 @@ } }, "successfullyAssignedCollections": { - "message": "Coleções atribuídas com sucesso" + "message": "Conjuntos atribuídos com sucesso" }, "nothingSelected": { "message": "Você não selecionou nada." @@ -4126,10 +4126,10 @@ "message": "O Bitwarden não valida localizações de entrada, tenha certeza de estar na janela e campo corretos antes de utilizar o atalho." }, "typeShortcut": { - "message": "Digitar atalho" + "message": "Atalho de digitação" }, "editAutotypeShortcutDescription": { - "message": "Inclua um ou dois dos seguintes modificadores: Ctrl, Alt, Win, Shift e uma letra." + "message": "Inclua um ou dois dos seguintes modificadores: Ctrl, Alt, Win, ou Shift, e uma letra." }, "invalidShortcut": { "message": "Atalho inválido" @@ -4142,13 +4142,13 @@ "message": "Avançar" }, "confirmKeyConnectorDomain": { - "message": "Confirmar domínio do Conector de Chave" + "message": "Confirmar domínio do Key Connector" }, "confirm": { "message": "Confirmar" }, "enableAutotypeShortcutPreview": { - "message": "Ativar atalho da digitação automática (Feature Preview)" + "message": "Ativar atalho de digitação automática (Feature Preview)" }, "enableAutotypeShortcutDescription": { "message": "Certifique-se que está no campo correto antes de usar o atalho para evitar preencher dados no lugar errado." @@ -4174,7 +4174,7 @@ "message": "Nenhum item no arquivo" }, "noItemsInArchiveDesc": { - "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados de pesquisa gerais e das sugestões de preenchimento automático." + "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados gerais de busca e das sugestões de preenchimento automático." }, "itemWasSentToArchive": { "message": "O item foi enviado para o arquivo" @@ -4186,7 +4186,7 @@ "message": "Arquivar item" }, "archiveItemConfirmDesc": { - "message": "Itens arquivados são excluídos dos resultados da pesquisa geral e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" + "message": "Itens arquivados são excluídos dos resultados gerais de busca e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" }, "zipPostalCodeLabel": { "message": "CEP / Código postal" @@ -4207,7 +4207,7 @@ "message": "Acesso de emergência" }, "breachMonitoring": { - "message": "Monitoramento de brechas" + "message": "Monitoramento de vazamentos" }, "andMoreFeatures": { "message": "E mais!" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index b5e68b83bde..5e2b7f7ff7c 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -268,7 +268,7 @@ "message": "需要高级版" }, "premiumRequiredDesc": { - "message": "使用此功能需要高级会员资格。" + "message": "需要高级会员才能使用此功能。" }, "errorOccurred": { "message": "发生错误。" From 15dcec72adfc49859b5fae0f9bbc991a19226914 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 06:32:38 +0100 Subject: [PATCH 09/37] Autosync the updated translations (#17712) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 20 +- apps/browser/src/_locales/az/messages.json | 20 +- apps/browser/src/_locales/be/messages.json | 20 +- apps/browser/src/_locales/bg/messages.json | 22 +- apps/browser/src/_locales/bn/messages.json | 20 +- apps/browser/src/_locales/bs/messages.json | 20 +- apps/browser/src/_locales/ca/messages.json | 20 +- apps/browser/src/_locales/cs/messages.json | 20 +- apps/browser/src/_locales/cy/messages.json | 20 +- apps/browser/src/_locales/da/messages.json | 20 +- apps/browser/src/_locales/de/messages.json | 24 +- apps/browser/src/_locales/el/messages.json | 20 +- apps/browser/src/_locales/en_GB/messages.json | 20 +- apps/browser/src/_locales/en_IN/messages.json | 20 +- apps/browser/src/_locales/es/messages.json | 20 +- apps/browser/src/_locales/et/messages.json | 20 +- apps/browser/src/_locales/eu/messages.json | 20 +- apps/browser/src/_locales/fa/messages.json | 20 +- apps/browser/src/_locales/fi/messages.json | 20 +- apps/browser/src/_locales/fil/messages.json | 20 +- apps/browser/src/_locales/fr/messages.json | 22 +- apps/browser/src/_locales/gl/messages.json | 20 +- apps/browser/src/_locales/he/messages.json | 20 +- apps/browser/src/_locales/hi/messages.json | 20 +- apps/browser/src/_locales/hr/messages.json | 26 +- apps/browser/src/_locales/hu/messages.json | 20 +- apps/browser/src/_locales/id/messages.json | 20 +- apps/browser/src/_locales/it/messages.json | 92 +-- apps/browser/src/_locales/ja/messages.json | 20 +- apps/browser/src/_locales/ka/messages.json | 20 +- apps/browser/src/_locales/km/messages.json | 20 +- apps/browser/src/_locales/kn/messages.json | 20 +- apps/browser/src/_locales/ko/messages.json | 20 +- apps/browser/src/_locales/lt/messages.json | 20 +- apps/browser/src/_locales/lv/messages.json | 20 +- apps/browser/src/_locales/ml/messages.json | 20 +- apps/browser/src/_locales/mr/messages.json | 20 +- apps/browser/src/_locales/my/messages.json | 20 +- apps/browser/src/_locales/nb/messages.json | 20 +- apps/browser/src/_locales/ne/messages.json | 20 +- apps/browser/src/_locales/nl/messages.json | 20 +- apps/browser/src/_locales/nn/messages.json | 20 +- apps/browser/src/_locales/or/messages.json | 20 +- apps/browser/src/_locales/pl/messages.json | 108 +-- apps/browser/src/_locales/pt_BR/messages.json | 660 +++++++++--------- apps/browser/src/_locales/pt_PT/messages.json | 20 +- apps/browser/src/_locales/ro/messages.json | 20 +- apps/browser/src/_locales/ru/messages.json | 20 +- apps/browser/src/_locales/si/messages.json | 20 +- apps/browser/src/_locales/sk/messages.json | 20 +- apps/browser/src/_locales/sl/messages.json | 20 +- apps/browser/src/_locales/sr/messages.json | 20 +- apps/browser/src/_locales/sv/messages.json | 20 +- apps/browser/src/_locales/ta/messages.json | 20 +- apps/browser/src/_locales/te/messages.json | 20 +- apps/browser/src/_locales/th/messages.json | 20 +- apps/browser/src/_locales/tr/messages.json | 20 +- apps/browser/src/_locales/uk/messages.json | 20 +- apps/browser/src/_locales/vi/messages.json | 20 +- apps/browser/src/_locales/zh_CN/messages.json | 28 +- apps/browser/src/_locales/zh_TW/messages.json | 20 +- apps/browser/store/locales/pt_BR/copy.resx | 62 +- 62 files changed, 1418 insertions(+), 686 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 505a8404233..03d5eb0a9f6 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "تعديل" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "سنة الإنتهاء" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "تاريخ الانتهاء" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 086b66380b5..7dbd1ba3e7c 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Arxivlənmiş elementlər ümumi axtarış nəticələrindən və avto-doldurma təkliflərindən xaric ediləcək. Bu elementi arxivləmək istədiyinizə əminsiniz?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Düzəliş et" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Hamısına bax" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "Daha azına bax" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Son istifadə ili" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Bitmə vaxtı" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Ödənişsiz təşkilatlar qoşmaları istifadə edə bilməz" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "\"Premium\"a yüksəlt" }, - "upgradeCompleteSecurity": { - "message": "Tam təhlükəsizlik üçün yüksəldin" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium, güvəndə qalmağınız, səmərəli çalışmağınız və nəzarətə sahib olmağınız üçün daha çox alət verir." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Premium-u kəşf et" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 16a6d739962..89651f0038e 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Рэдагаваць" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Год завяршэння" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Тэрмін дзеяння" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 3dba65d6aa7..b40f4b91cb4 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Архивираните елементи са изключени от общите резултати при търсене и от предложенията за автоматично попълване. Наистина ли искате да архивирате този елемент?" }, + "upgradeToUseArchive": { + "message": "За да се възползвате от архивирането, трябва да ползвате платен абонамент." + }, "edit": { "message": "Редактиране" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Показване на всички" }, + "showAll": { + "message": "Показване на всички" + }, "viewLess": { "message": "Преглед на по-малко" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Година на изтичане" }, + "monthly": { + "message": "месец" + }, "expiration": { "message": "Изтичане" }, @@ -2437,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Тази страница пречи на работата на Битуорден. Вмъкнатото меню на Битуорден е временно изключено, като мярка за сигурност." }, "setMasterPassword": { "message": "Задаване на главна парола" @@ -4902,6 +4911,9 @@ "premium": { "message": "Премиум" }, + "unlockFeaturesWithPremium": { + "message": "Отключете докладите, аварийния достъп и още функционалности свързани със сигурността, с платения план." + }, "freeOrgsCannotUseAttachments": { "message": "Безплатните организации не могат да използват прикачени файлове" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Надградете до Платения план" }, - "upgradeCompleteSecurity": { - "message": "Надградете, за да се възползвате от пълна защита" + "unlockAdvancedSecurity": { + "message": "Отключване на разширените функционалности по сигурността" }, - "premiumGivesMoreTools": { - "message": "Платеният план предоставя повече инструменти за защита, ефективна работа и контрол." + "unlockAdvancedSecurityDesc": { + "message": "Платеният абонамент предоставя повече инструменти за защита и управление" }, "explorePremium": { "message": "Разгледайте платения план" diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index d2519cb13e3..4f8e7054305 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "সম্পাদনা" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "মেয়াদোত্তীর্ণ বছর" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "মেয়াদোত্তীর্ণতা" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 917180579f2..9d5631c47e2 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index a9ebdf139d7..255263a6da7 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edita" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Any de venciment" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Caducitat" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index ca5d4b09f28..eff2c6c0ea7 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archivované položky jsou vyloučeny z obecných výsledků vyhledávání a z návrhů automatického vyplňování. Jste si jisti, že chcete tuto položku archivovat?" }, + "upgradeToUseArchive": { + "message": "Pro použití funkce Archiv je potřebné prémiové členství." + }, "edit": { "message": "Upravit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Zobrazit vše" }, + "showAll": { + "message": "Zobrazit vše" + }, "viewLess": { "message": "Zobrazit méně" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Rok expirace" }, + "monthly": { + "message": "měsíčně" + }, "expiration": { "message": "Expirace" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Odemkněte hlášení, nouzový přístup a další bezpečnostní funkce s předplatným Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Volné organizace nemohou používat přílohy" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Aktualizovat na Premium" }, - "upgradeCompleteSecurity": { - "message": "Aktualizujte pro úplné zabezpečení" + "unlockAdvancedSecurity": { + "message": "Odemknout pokročilé bezpečnostní funkce" }, - "premiumGivesMoreTools": { - "message": "Verze Premium Vám poskytne více nástrojů k zabezpečení, efektivní práci a udržení kontroly." + "unlockAdvancedSecurityDesc": { + "message": "Prémiové předplatné Vám dává více nástrojů k bezpečí a kontrole" }, "explorePremium": { "message": "Objevit Premium" diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 1f83ff72f62..99fcdffcc97 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Golygu" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Blwyddyn dod i ben" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Dod i ben" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 96aa81ce876..865e6ff7dda 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Redigér" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Udløbsår" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Udløb" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Gratis organisationer kan ikke bruge vedhæftninger" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index b32c9a68c06..86f49bb875e 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archivierte Einträge werden von allgemeinen Suchergebnissen sowie Vorschlägen zum automatischen Ausfüllen ausgeschlossen. Bist du sicher, dass du diesen Eintrag archivieren möchtest?" }, + "upgradeToUseArchive": { + "message": "Für die Nutzung des Archivs ist eine Premium-Mitgliedschaft erforderlich." + }, "edit": { "message": "Bearbeiten" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Alles anzeigen" }, + "showAll": { + "message": "Alles anzeigen" + }, "viewLess": { "message": "Weniger anzeigen" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Ablaufjahr" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Gültig bis" }, @@ -2437,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Diese Seite beeinträchtigt die Nutzung von Bitwarden. Das Bitwarden Inline-Menü wurde aus Sicherheitsgründen vorübergehend deaktiviert." }, "setMasterPassword": { "message": "Master-Passwort festlegen" @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Schalte mit Premium Berichte, Notfallzugriff und weitere Sicherheitsfunktionen frei." + }, "freeOrgsCannotUseAttachments": { "message": "Kostenlose Organisationen können Anhänge nicht verwenden" }, @@ -5812,14 +5824,14 @@ "upgradeToPremium": { "message": "Upgrade auf Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade für umfassende Sicherheit" + "unlockAdvancedSecurity": { + "message": "Erweiterte Sicherheitsfunktionen freischalten" }, - "premiumGivesMoreTools": { - "message": "Premium gibt dir mehr Werkzeuge, um sicher zu bleiben, effizient zu arbeiten und die Kontrolle zu behalten." + "unlockAdvancedSecurityDesc": { + "message": "Mit einem Premium-Abonnement erhältst du mehr Werkzeuge für mehr Sicherheit und Kontrolle" }, "explorePremium": { - "message": "Premium erkunden" + "message": "Premium entdecken" }, "loadingVault": { "message": "Tresor wird geladen" diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index f4c3c0d53a5..476a6165a8e 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Επεξεργασία" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Έτος λήξης" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Λήξη" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Οι δωρεάν οργανισμοί δεν μπορούν να χρησιμοποιήσουν συνημμένα" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 96c3323faef..103d45f0685 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organisations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index b9f777148e3..2713381986c 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organisations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 92dbe15fad2..e19bd11ba28 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Editar" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Año de expiración" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiración" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Las organizaciones gratis no pueden usar archivos adjuntos" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index bb029bf7777..7a9737f71ff 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Muuda" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Aegumise aasta" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Aegumine" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 06a4f8ea48d..b61213da989 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Editatu" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Iraungitze urtea" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Iraungitze data" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 33f4a02277d..550de006cf6 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "ویرایش" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "سال انقضاء" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "انقضاء" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "پرمیوم" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "سازمان‌های رایگان نمی‌توانند از پرونده‌های پیوست استفاده کنند" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 9953782f504..bdf2ebd641c 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Muokkaa" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Näytä kaikki" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Erääntymisvuosi" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Voimassaolo päättyy" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Ilmaiset organisaatiot eivät voi käyttää liitteitä" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 687863550a7..31284265b2e 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "I-edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Taon ng Pag-expire" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Pag-expire" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 87c1a20a38a..dadcd0c041e 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Les éléments archivés sont exclus des résultats de recherche généraux et des suggestions de remplissage automatique. Êtes-vous sûr de vouloir archiver cet élément ?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Modifier" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Tout afficher" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "Afficher moins" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Année d'expiration" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -2437,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Cette page interfère avec l'expérience Bitwarden. Le menu en ligne de Bitwarden a été temporairement désactivé en tant que mesure de sécurité." }, "setMasterPassword": { "message": "Définir le mot de passe principal" @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Déverrouillez la journalisation, l'accès d'urgence et plus de fonctionnalités de sécurité avec Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Les organisations gratuites ne peuvent pas utiliser de pièces jointes" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Mettre à niveau vers Premium" }, - "upgradeCompleteSecurity": { - "message": "Mettre à niveau pour une sécurité complète" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium vous donne plus d'outils pour rester en sécurité, travailler efficacement et garder le contrôle." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explorer Premium" diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 9b35af1aad4..bd657b9d4b7 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Editar" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Ano de vencemento" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Vencemento" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Prémium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "As organizacións gratuitas non poden empregar anexos" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 7d1700cbbdc..2e9243206b9 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "פריטים בארכיון מוחרגים מתוצאות חיפוש כללי והצעות למילוי אוטומטי. האם אתה בטוח שברצונך להעביר פריט זה לארכיון?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "ערוך" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "הצג הכל" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "הצג פחות" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "שנת תפוגה" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "תוקף" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "פרימיום" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "ארגונים חינמיים לא יכולים להשתמש בצרופות" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "שדרג לפרימיום" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 0af38bf6964..58db7ac8ad6 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "संपादन करें" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration Year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "समय सीमा समाप्ति" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 9bb5ca08843..8a5a09aec9c 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Arhivirane stavke biti će izuzete iz rezultata općih pretraga i preporuka auto-ispune. Sigurno želiš arhivirati?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Uredi" }, @@ -594,8 +597,11 @@ "viewAll": { "message": "Vidi sve" }, + "showAll": { + "message": "Show all" + }, "viewLess": { - "message": "View less" + "message": "Vidi manje" }, "viewLogin": { "message": "Prikaži prijavu" @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Godina isteka" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Istek" }, @@ -2437,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Ova stranica ometa Bitwarden iskustvo. Kao sigurnosna mjera, Bitwarden inline izbornik je privremeno onemogućen." }, "setMasterPassword": { "message": "Postavi glavnu lozinku" @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Besplatne organizacije ne mogu koristiti privitke" }, @@ -5812,14 +5824,14 @@ "upgradeToPremium": { "message": " Nadogradi na Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { - "message": "Explore Premium" + "message": "Provjeri Premium" }, "loadingVault": { "message": "Učitavanje trezora" diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 9b6a5d756d5..bacda584ba1 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Az archivált elemek ki vannak zárva az általános keresési eredményekből és az automatikus kitöltési javaslatokból. Biztosan archiválni szeretnénk ezt az elemet?" }, + "upgradeToUseArchive": { + "message": "Az Archívum használatához prémium tagság szükséges." + }, "edit": { "message": "Szerkesztés" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Összes megtekintése" }, + "showAll": { + "message": "Összes megjelenítése" + }, "viewLess": { "message": "kevesebb megjelenítése" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Lejárati év" }, + "monthly": { + "message": "hónap" + }, "expiration": { "message": "Lejárat" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Prémium" }, + "unlockFeaturesWithPremium": { + "message": "A Prémium segítségével feloldhatjuk a jelentés készítést, a vészhelyzeti hozzáférést és a további biztonsági funkciókat." + }, "freeOrgsCannotUseAttachments": { "message": "Az ingyenes szervezetek nem használhatnak mellékleteket." }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Áttérés Prémium csomagra" }, - "upgradeCompleteSecurity": { - "message": "Áttérés a teljes biztonságért" + "unlockAdvancedSecurity": { + "message": "Fejlett biztonsági funkciók feloldása" }, - "premiumGivesMoreTools": { - "message": "A Premium több eszközt ad a biztonság megőrzéséhez, a hatékony munkavégzéshez és az irányítás megőrzéséhez." + "unlockAdvancedSecurityDesc": { + "message": "A prémium előfizetés több eszközt biztosít a biztonság és az irányítás megőrzéséhez." }, "explorePremium": { "message": "Premium felfedezése" diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 85fdfbf9afe..88147f804d1 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Tahun Kedaluwarsa" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Masa Berlaku" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Organisasi gratis tidak dapat menggunakan lampiran" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index a76bb05d15a..d4d032737b8 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -32,7 +32,7 @@ "message": "Usa il Single Sign-On" }, "yourOrganizationRequiresSingleSignOn": { - "message": "Your organization requires single sign-on." + "message": "La tua organizzazione richiede un accesso Single Sign-On (SSO)." }, "welcomeBack": { "message": "Bentornato/a" @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Gli elementi archiviati sono esclusi dai risultati di ricerca e suggerimenti di autoriempimento. Vuoi davvero archiviare questo elemento?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Modifica" }, @@ -592,10 +595,13 @@ "message": "Visualizza" }, "viewAll": { - "message": "View all" + "message": "Mostra tutto" + }, + "showAll": { + "message": "Show all" }, "viewLess": { - "message": "View less" + "message": "Vedi meno" }, "viewLogin": { "message": "Visualizza login" @@ -800,10 +806,10 @@ "message": "Al blocco del computer" }, "onIdle": { - "message": "On system idle" + "message": "Quando il sistema è inattivo" }, "onSleep": { - "message": "On system sleep" + "message": "Quando il sistema è sospeso" }, "onRestart": { "message": "Al riavvio del browser" @@ -1044,10 +1050,10 @@ "message": "Elemento salvato" }, "savedWebsite": { - "message": "Saved website" + "message": "Sito Web salvato" }, "savedWebsites": { - "message": "Saved websites ( $COUNT$ )", + "message": "Siti Web salvati ( $COUNT$)", "placeholders": { "count": { "content": "$1", @@ -1645,7 +1651,7 @@ "message": "Devi aggiungere lo URL del server di base o almeno un ambiente personalizzato." }, "selfHostedEnvMustUseHttps": { - "message": "URLs must use HTTPS." + "message": "Gli indirizzi devono usare il protocollo HTTPS." }, "customEnvironment": { "message": "Ambiente personalizzato" @@ -1701,28 +1707,28 @@ "message": "Disattiva il riempimento automatico" }, "confirmAutofill": { - "message": "Confirm autofill" + "message": "Conferma il riempimento automatico" }, "confirmAutofillDesc": { - "message": "This site doesn't match your saved login details. Before you fill in your login credentials, make sure it's a trusted site." + "message": "Questo sito non corrisponde ai tuoi dati di accesso salvati. Prima di compilare le credenziali di accesso, assicurati che si tratti di un sito affidabile." }, "showInlineMenuLabel": { "message": "Mostra suggerimenti di riempimento automatico nei campi del modulo" }, "howDoesBitwardenProtectFromPhishing": { - "message": "How does Bitwarden protect your data from phishing?" + "message": "In che modo Bitwarden ti protegge dai pericoli del phising?" }, "currentWebsite": { - "message": "Current website" + "message": "Sito web corrente" }, "autofillAndAddWebsite": { - "message": "Autofill and add this website" + "message": "Compila e aggiungi questo sito" }, "autofillWithoutAdding": { - "message": "Autofill without adding" + "message": "Compila senza salvare" }, "doNotAutofill": { - "message": "Do not autofill" + "message": "Non compilare con il riempimento automatico" }, "showInlineMenuIdentitiesLabel": { "message": "Mostra identità come consigli" @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Anno di scadenza" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Scadenza" }, @@ -2437,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Questa pagina sta interferendo con Bitwarden. Il menu in linea di Bitwarden è stato temporaneamente disabilitato come misura di sicurezza." }, "setMasterPassword": { "message": "Imposta password principale" @@ -3289,7 +3298,7 @@ "message": "Errore di decifrazione" }, "errorGettingAutoFillData": { - "message": "Error getting autofill data" + "message": "Errore: impossibile accedere ai dati per il riempimento automatico" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden non può decifrare gli elementi elencati di seguito." @@ -4063,13 +4072,13 @@ "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "cannotAutofill": { - "message": "Cannot autofill" + "message": "Impossibile usare il riempimento automatico" }, "cannotAutofillExactMatch": { - "message": "Default matching is set to 'Exact Match'. The current website does not exactly match the saved login details for this item." + "message": "La corrispondenza predefinita è impostata su 'Corrispondenza esatta'. Il sito Web corrente non corrisponde esattamente ai dettagli di accesso salvati per questo elemento." }, "okay": { - "message": "Okay" + "message": "OK" }, "toggleSideNavigation": { "message": "Attiva/Disattiva navigazione laterale" @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Sblocca reportistica, accesso d'emergenza e altre funzionalità di sicurezza con Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Le organizzazioni gratis non possono utilizzare gli allegati" }, @@ -4987,7 +4999,7 @@ } }, "defaultLabelWithValue": { - "message": "Default ( $VALUE$ )", + "message": "Predefinito ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -5786,58 +5798,58 @@ "message": "Conferma dominio Key Connector" }, "atRiskLoginsSecured": { - "message": "Great job securing your at-risk logins!" + "message": "Ottimo lavoro, i tuoi dati di accesso sono al sicuro!" }, "upgradeNow": { - "message": "Upgrade now" + "message": "Aggiorna ora" }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "App di autenticazione integrata" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Archiviazione sicura di file" }, "emergencyAccess": { - "message": "Emergency access" + "message": "Accesso di emergenza" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Monitoraggio delle violazioni" }, "andMoreFeatures": { - "message": "And more!" + "message": "E molto altro!" }, "planDescPremium": { - "message": "Complete online security" + "message": "Sicurezza online completa" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Aggiorna a Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { - "message": "Explore Premium" + "message": "Scopri Premium" }, "loadingVault": { - "message": "Loading vault" + "message": "Caricamento cassaforte" }, "vaultLoaded": { - "message": "Vault loaded" + "message": "Cassaforte caricata" }, "settingDisabledByPolicy": { "message": "Questa impostazione è disabilitata dalle restrizioni della tua organizzazione.", "description": "This hint text is displayed when a user setting is disabled due to an organization policy." }, "zipPostalCodeLabel": { - "message": "ZIP / Postal code" + "message": "CAP" }, "cardNumberLabel": { - "message": "Card number" + "message": "Numero di carta" }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Azione al timeout" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 1294335481c..c13b139e13a 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "編集" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "有効期限年" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "有効期限" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "プレミアム" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "無料の組織は添付ファイルを使用できません" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "プレミアムにアップグレード" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 52e9fbc5229..a54a0f2c657 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "ჩასწორება" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "ვადა" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "პრემიუმი" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 7c4dbaf85dc..f829937ac51 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index d2ca68a0108..bd2be23828c 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "ಎಡಿಟ್" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "ಮುಕ್ತಾಯ ವರ್ಷ" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "ಮುಕ್ತಾಯ" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index c583e173d91..1ad08accfc9 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "보관된 항목은 일반 검색 결과와 자동 완성 제안에서 제외됩니다. 이 항목을 보관하시겠습니까?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "편집" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "만료 연도" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "만료" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "프리미엄" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "무료 조직에서는 첨부 파일을 사용할 수 없습니다." }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 45ee71f75dd..46ffb24e3df 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Keisti" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Galiojimo pabaigos metai" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Galiojimo pabaiga" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "„Premium“" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Nemokamos organizacijos negali naudoti priedų" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index d7e4b5eea9c..754781dc4f7 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Arhivētie vienumi netiek iekļauti vispārējās meklēšanas iznākumos un automātiskās aizpildes ieteikumos. Vai tiešām ahrivēt šo vienumu?" }, + "upgradeToUseArchive": { + "message": "Ir nepieciešama Premium dalība, lai izmantotu arhīvu." + }, "edit": { "message": "Labot" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Apskatīt visu" }, + "showAll": { + "message": "Rādīt visu" + }, "viewLess": { "message": "Skatīt mazāk" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Derīguma gads" }, + "monthly": { + "message": "mēnesī" + }, "expiration": { "message": "Derīgums" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Iegūsti piekļuvi atskaitēm, ārkārtas piekļuvei un citām drošības iespējām ar Premium!" + }, "freeOrgsCannotUseAttachments": { "message": "Bezmaksas apvienības nevar izmantot pielikumus" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Uzlabot uz Premium" }, - "upgradeCompleteSecurity": { - "message": "Uzlabo pilnīgas drošības iegūšanai" + "unlockAdvancedSecurity": { + "message": "Atslēdz papildu drošības iespējas" }, - "premiumGivesMoreTools": { - "message": "Premium sniedz vairāk rīku drošībai, darba ražīgumam un pārraudzībai." + "unlockAdvancedSecurityDesc": { + "message": "Premium abonements sniedz vairāk rīku drošības uzturēšanai un pārraudzībai" }, "explorePremium": { "message": "Izpētīt Premium" diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 6c022f0043f..2f7f8d30e74 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "തിരുത്തുക" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "കാലാവതി കഴിയുന്ന വർഷം" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "കാലഹരണപ്പെടൽ" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index d34d1c87971..70f8fe5393c 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 7c4dbaf85dc..f829937ac51 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 11bd78ed56c..0eba9c953a3 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Rediger" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Utløpsår" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Utløp" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 7c4dbaf85dc..f829937ac51 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 8817e04b163..601aac16f94 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Gearchiveerde items worden uitgesloten van algemene zoekresultaten en automatische invulsuggesties. Weet je zeker dat je dit item wilt archiveren?" }, + "upgradeToUseArchive": { + "message": "Je hebt een Premium-abonnement nodig om te kunnen archiveren." + }, "edit": { "message": "Bewerken" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Alles weergeven" }, + "showAll": { + "message": "Alles weergeven" + }, "viewLess": { "message": "Minder weergeven" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Vervaljaar" }, + "monthly": { + "message": "maand" + }, "expiration": { "message": "Vervaldatum" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Ontgrendel tapporteren, noodtoegang en meer beveiligingsfuncties met Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Gratis organisaties kunnen geen bijlagen gebruiken" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Opwaarderen naar Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade voor volledige beveiliging" + "unlockAdvancedSecurity": { + "message": "Geavanceerde beveiligingsfuncties ontgrendelen" }, - "premiumGivesMoreTools": { - "message": "Premium geeft je meer tools om veilig te blijven, efficiënt te werken en in controle te blijven." + "unlockAdvancedSecurityDesc": { + "message": "Een Premium-abonnement geeft je meer tools om veilig en in controle te blijven" }, "explorePremium": { "message": "Premium verkennen" diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 7c4dbaf85dc..f829937ac51 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 7c4dbaf85dc..f829937ac51 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 41f679aba50..9741f94da36 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -32,7 +32,7 @@ "message": "Użyj logowania jednokrotnego" }, "yourOrganizationRequiresSingleSignOn": { - "message": "Your organization requires single sign-on." + "message": "Twoja organizacja wymaga logowania jednokrotnego." }, "welcomeBack": { "message": "Witaj ponownie" @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Zarchiwizowane elementy są wykluczone z wyników wyszukiwania i sugestii autouzupełniania. Czy na pewno chcesz archiwizować element?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edytuj" }, @@ -592,10 +595,13 @@ "message": "Pokaż" }, "viewAll": { - "message": "View all" + "message": "Pokaż wszystko" + }, + "showAll": { + "message": "Show all" }, "viewLess": { - "message": "View less" + "message": "Pokaż mniej" }, "viewLogin": { "message": "Pokaż dane logowania" @@ -743,7 +749,7 @@ "message": "Hasło główne jest nieprawidłowe" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Invalid master password. Confirm your email is correct and your account was created on $HOST$.", + "message": "Nieprawidłowe hasło główne. Sprawdź, czy Twój adres e-mail jest poprawny i czy Twoje konto zostało utworzone na $HOST$.", "placeholders": { "host": { "content": "$1", @@ -800,10 +806,10 @@ "message": "Po zablokowaniu urządzenia" }, "onIdle": { - "message": "On system idle" + "message": "Podczas bezczynności systemu" }, "onSleep": { - "message": "On system sleep" + "message": "Podczas uśpienia systemu" }, "onRestart": { "message": "Po uruchomieniu przeglądarki" @@ -1044,10 +1050,10 @@ "message": "Element został zapisany" }, "savedWebsite": { - "message": "Saved website" + "message": "Zapisana witryna" }, "savedWebsites": { - "message": "Saved websites ( $COUNT$ )", + "message": "Zapisane witryny ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -1573,7 +1579,7 @@ "message": "Odczytywanie klucza dostępu..." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed" + "message": "Uwierzytelnienie za pomocą klucza nie powiodło się" }, "useADifferentLogInMethod": { "message": "Użyj innej metody logowania" @@ -1645,7 +1651,7 @@ "message": "Musisz dodać podstawowy adres URL serwera lub co najmniej jedno niestandardowe środowisko." }, "selfHostedEnvMustUseHttps": { - "message": "URLs must use HTTPS." + "message": "Adresy URL muszą używać protokołu HTTPS." }, "customEnvironment": { "message": "Niestandardowe środowisko" @@ -1701,28 +1707,28 @@ "message": "Wyłącz autouzupełnianie" }, "confirmAutofill": { - "message": "Confirm autofill" + "message": "Potwierdź autouzupełnianie" }, "confirmAutofillDesc": { - "message": "This site doesn't match your saved login details. Before you fill in your login credentials, make sure it's a trusted site." + "message": "Ta witryna nie pasuje do Twoich zapisanych danych logowania. Zanim wpiszesz dane logowania, upewnij się, że jest to zaufana witryna." }, "showInlineMenuLabel": { "message": "Pokaż sugestie autouzupełniania na polach formularza" }, "howDoesBitwardenProtectFromPhishing": { - "message": "How does Bitwarden protect your data from phishing?" + "message": "W jaki sposób Bitwarden chroni Twoje dane przed phishingiem?" }, "currentWebsite": { - "message": "Current website" + "message": "Aktualna witryna" }, "autofillAndAddWebsite": { - "message": "Autofill and add this website" + "message": "Wypełnij automatycznie i dodaj tę witrynę" }, "autofillWithoutAdding": { - "message": "Autofill without adding" + "message": "Automatyczne uzupełnianie bez dodawania" }, "doNotAutofill": { - "message": "Do not autofill" + "message": "Nie wypełniaj automatycznie" }, "showInlineMenuIdentitiesLabel": { "message": "Pokaż tożsamości w sugestiach" @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Rok wygaśnięcia" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Data wygaśnięcia" }, @@ -2437,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Ta strona zakłóca działanie Bitwarden. Menu Bitwarden zostało tymczasowo wyłączone ze względów bezpieczeństwa." }, "setMasterPassword": { "message": "Ustaw hasło główne" @@ -3289,7 +3298,7 @@ "message": "Błąd odszyfrowywania" }, "errorGettingAutoFillData": { - "message": "Error getting autofill data" + "message": "Błąd podczas pobierania danych autouzupełniania" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden nie mógł odszyfrować poniższych elementów sejfu." @@ -4063,13 +4072,13 @@ "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "cannotAutofill": { - "message": "Cannot autofill" + "message": "Nie można automatycznie wypełnić" }, "cannotAutofillExactMatch": { - "message": "Default matching is set to 'Exact Match'. The current website does not exactly match the saved login details for this item." + "message": "Domyślnie dopasowanie jest ustawione na „Dokładne dopasowanie”. Aktualna strona internetowa nie jest dokładnie taka sama jak zapisane dane logowania dla tego elementu." }, "okay": { - "message": "Okay" + "message": "Ok" }, "toggleSideNavigation": { "message": "Przełącz nawigację boczną" @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Darmowe organizacje nie mogą używać załączników" }, @@ -4987,7 +4999,7 @@ } }, "defaultLabelWithValue": { - "message": "Default ( $VALUE$ )", + "message": "Domyślne ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -5650,30 +5662,30 @@ "message": "Witaj w sejfie!" }, "phishingPageTitleV2": { - "message": "Phishing attempt detected" + "message": "Wykryto próbę phishingu" }, "phishingPageSummary": { - "message": "The site you are attempting to visit is a known malicious site and a security risk." + "message": "Witryna, którą próbujesz odwiedzić, jest znaną złośliwą witryną i zagrożeniem bezpieczeństwa." }, "phishingPageCloseTabV2": { "message": "Zamknij kartę" }, "phishingPageContinueV2": { - "message": "Continue to this site (not recommended)" + "message": "Przejdź do tej witryny (niezalecane)" }, "phishingPageExplanation1": { - "message": "This site was found in ", + "message": "Ta witryna została znaleziona w ", "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." }, "phishingPageExplanation2": { - "message": ", an open-source list of known phishing sites used for stealing personal and sensitive information.", + "message": ", lista znanych witryn phishingowych, które służą do kradzieży danych osobowych i poufnych.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." }, "phishingPageLearnMore": { - "message": "Learn more about phishing detection" + "message": "Dowiedz się więcej o wykrywaniu phishingu" }, "protectedBy": { - "message": "Protected by $PRODUCT$", + "message": "Chronione przez $PRODUCT$", "placeholders": { "product": { "content": "$1", @@ -5786,49 +5798,49 @@ "message": "Potwierdź domenę Key Connector" }, "atRiskLoginsSecured": { - "message": "Great job securing your at-risk logins!" + "message": "Świetna robota z zabezpieczeniem Twoich zagrożonych danych logowania!" }, "upgradeNow": { - "message": "Upgrade now" + "message": "Zaktualizuj teraz" }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "Wbudowany uwierzytelniacz" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Bezpieczne przechowywanie plików" }, "emergencyAccess": { - "message": "Emergency access" + "message": "Dostęp awaryjny" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Monitorowanie naruszeń" }, "andMoreFeatures": { - "message": "And more!" + "message": "I jeszcze więcej!" }, "planDescPremium": { - "message": "Complete online security" + "message": "Pełne bezpieczeństwo w Internecie" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Ulepsz do Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { - "message": "Explore Premium" + "message": "Poznaj Premium" }, "loadingVault": { - "message": "Loading vault" + "message": "Ładowanie sejfu" }, "vaultLoaded": { - "message": "Vault loaded" + "message": "Sejf załadowany" }, "settingDisabledByPolicy": { - "message": "This setting is disabled by your organization's policy.", + "message": "To ustawienie jest wyłączone zgodnie z zasadami polityki Twojej organizacji.", "description": "This hint text is displayed when a user setting is disabled due to an organization policy." }, "zipPostalCodeLabel": { @@ -5838,6 +5850,6 @@ "message": "Numer karty" }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Akcja przekroczenia limitu czasu" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 9e5d2331744..a7675274eae 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -10,11 +10,11 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Em qual lugar for, o Bitwarden protege suas senhas, chaves de acesso, e informações confidenciais", + "message": "Onde quer que você esteja, o Bitwarden protege suas senhas, chaves de acesso e informações sensíveis", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro." + "message": "Conecte-se ou crie uma conta para acessar o seu cofre seguro." }, "inviteAccepted": { "message": "Convite aceito" @@ -26,7 +26,7 @@ "message": "Novo no Bitwarden?" }, "logInWithPasskey": { - "message": "Entrar com chave de acesso" + "message": "Conectar-se com chave de acesso" }, "useSingleSignOn": { "message": "Usar autenticação única" @@ -38,10 +38,10 @@ "message": "Boas-vindas de volta" }, "setAStrongPassword": { - "message": "Defina uma senha forte" + "message": "Configure uma senha forte" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Termine de criar a sua conta definindo uma senha" + "message": "Termine de criar a sua conta configurando uma senha" }, "enterpriseSingleSignOn": { "message": "Autenticação única empresarial" @@ -65,7 +65,7 @@ "message": "A senha principal é a senha que você usa para acessar o seu cofre. É muito importante que você não esqueça sua senha principal. Não há maneira de recuperar a senha caso você se esqueça." }, "masterPassHintDesc": { - "message": "Uma dica de senha principal pode ajudá-lo(a) a lembrá-lo(a) caso você esqueça." + "message": "Uma dica de senha principal pode ajudá-lo(a) a lembrá-la caso você esqueça." }, "masterPassHintText": { "message": "Se você esquecer sua senha, a dica de senha pode ser enviada ao seu e-mail. $CURRENT$/$MAXIMUM$ caracteres máximos.", @@ -108,7 +108,7 @@ } }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Termine de juntar-se à organização definindo uma senha principal." + "message": "Termine de juntar-se à organização configurando uma senha principal." }, "tab": { "message": "Aba" @@ -117,7 +117,7 @@ "message": "Cofre" }, "myVault": { - "message": "Meu Cofre" + "message": "Meu cofre" }, "allVaults": { "message": "Todos os cofres" @@ -129,10 +129,10 @@ "message": "Configurações" }, "currentTab": { - "message": "Aba Atual" + "message": "Aba atual" }, "copyPassword": { - "message": "Copiar Senha" + "message": "Copiar senha" }, "copyPassphrase": { "message": "Copiar frase secreta" @@ -144,7 +144,7 @@ "message": "Copiar URI" }, "copyUsername": { - "message": "Copiar Nome de Usuário" + "message": "Copiar nome de usuário" }, "copyNumber": { "message": "Copiar número" @@ -200,10 +200,10 @@ "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { - "message": "Autopreencher" + "message": "Preenchimento automático" }, "autoFillLogin": { - "message": "Preencher login automaticamente" + "message": "Preencher credencial automaticamente" }, "autoFillCard": { "message": "Preencher cartão automaticamente" @@ -212,7 +212,7 @@ "message": "Preencher identidade automaticamente" }, "fillVerificationCode": { - "message": "Preencher o código de verificação" + "message": "Preencher código de verificação" }, "fillVerificationCodeAria": { "message": "Preencher código de verificação", @@ -228,7 +228,7 @@ "message": "Nenhuma credencial correspondente" }, "noCards": { - "message": "Sem cartões" + "message": "Nenhum cartão" }, "noIdentities": { "message": "Nenhuma identidade" @@ -246,7 +246,7 @@ "message": "Desbloqueie seu cofre" }, "loginToVaultMenu": { - "message": "Acesse o seu cofre" + "message": "Conecte-se ao seu cofre" }, "autoFillInfo": { "message": "Não há credenciais disponíveis para preencher automaticamente na aba atual do navegador." @@ -264,13 +264,13 @@ "message": "Solicitar dica" }, "requestPasswordHint": { - "message": "Dica da senha principal" + "message": "Solicitar dica da senha" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de e-mail da sua conta e dica da sua senha será enviada para você" }, "getMasterPasswordHint": { - "message": "Obter dica da senha principal" + "message": "Receber dica da senha principal" }, "continue": { "message": "Continuar" @@ -319,14 +319,14 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "A sua frase biométrica", + "message": "A frase biométrica da sua conta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Login em Duas Etapas" + "message": "Autenticação em duas etapas" }, "logOut": { - "message": "Sair" + "message": "Desconectar" }, "aboutBitwarden": { "message": "Sobre o Bitwarden" @@ -338,7 +338,7 @@ "message": "Mais do Bitwarden" }, "continueToBitwardenDotCom": { - "message": "Continuar para bitwarden.com?" + "message": "Continuar em bitwarden.com?" }, "bitwardenForBusiness": { "message": "Bitwarden para Negócios" @@ -362,10 +362,10 @@ "message": "Crie experiências de autenticação seguras, simples, livres de senhas tradicionais, com o Passwordless.dev. Saiba mais no site bitwarden.com." }, "freeBitwardenFamilies": { - "message": "Bitwarden Families grátis" + "message": "Bitwarden Famílias grátis" }, "freeBitwardenFamiliesPageDesc": { - "message": "Você é elegível para o plano Bitwarden Families grátis. Resgate esta oferta hoje no aplicativo web." + "message": "Você é elegível para o plano Bitwarden Famílias grátis. Resgate esta oferta hoje no aplicativo web." }, "version": { "message": "Versão" @@ -377,13 +377,13 @@ "message": "Mover" }, "addFolder": { - "message": "Adicionar Pasta" + "message": "Adicionar pasta" }, "name": { "message": "Nome" }, "editFolder": { - "message": "Editar Pasta" + "message": "Editar pasta" }, "editFolderWithName": { "message": "Editar pasta: $FOLDERNAME$", @@ -413,25 +413,25 @@ "message": "Tem certeza que quer apagar esta pasta para sempre?" }, "deleteFolder": { - "message": "Excluir Pasta" + "message": "Apagar pasta" }, "folders": { "message": "Pastas" }, "noFolders": { - "message": "Não existem pastas para listar." + "message": "Não há pastas para listar." }, "helpFeedback": { - "message": "Ajuda & Feedback" + "message": "Ajuda e retorno" }, "helpCenter": { "message": "Central de ajuda do Bitwarden" }, "communityForums": { - "message": "Explore os fóruns da comunidade do Bitwarden" + "message": "Explorar os fóruns da comunidade do Bitwarden" }, "contactSupport": { - "message": "Contate o suporte do Bitwarden" + "message": "Entrar em contato com o suporte do Bitwarden" }, "sync": { "message": "Sincronizar" @@ -440,7 +440,7 @@ "message": "Sincronizar cofre agora" }, "lastSync": { - "message": "Última Sincronização:" + "message": "Última sincronização:" }, "passGen": { "message": "Gerador de senhas" @@ -462,7 +462,7 @@ "message": "Selecionar" }, "generatePassword": { - "message": "Gerar Senha" + "message": "Gerar senha" }, "generatePassphrase": { "message": "Gerar frase secreta" @@ -480,7 +480,7 @@ "message": "E-mail gerado" }, "regeneratePassword": { - "message": "Gerar nova senha" + "message": "Regerar senha" }, "options": { "message": "Opções" @@ -527,7 +527,7 @@ "message": "Separador de palavras" }, "capitalize": { - "message": "Iniciais em Maiúsculas", + "message": "Iniciais maiúsculas", "description": "Make the first letter of a work uppercase." }, "includeNumber": { @@ -548,10 +548,10 @@ "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { - "message": "Pesquisar no Cofre" + "message": "Buscar no cofre" }, "resetSearch": { - "message": "Redefinir pesquisa" + "message": "Apagar busca" }, "archiveNoun": { "message": "Arquivo", @@ -571,7 +571,7 @@ "message": "Nenhum item no arquivo" }, "noItemsInArchiveDesc": { - "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados de pesquisa gerais e das sugestões de preenchimento automático." + "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados gerais de busca e das sugestões de preenchimento automático." }, "itemWasSentToArchive": { "message": "O item foi enviado para o arquivo" @@ -583,7 +583,10 @@ "message": "Arquivar item" }, "archiveItemConfirmDesc": { - "message": "Itens arquivados são excluídos dos resultados da pesquisa geral e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" + "message": "Itens arquivados são excluídos dos resultados gerais de busca e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" + }, + "upgradeToUseArchive": { + "message": "Um plano Premium é necessário para usar o arquivamento." }, "edit": { "message": "Editar" @@ -594,6 +597,9 @@ "viewAll": { "message": "Ver tudo" }, + "showAll": { + "message": "Mostrar tudo" + }, "viewLess": { "message": "Ver menos" }, @@ -607,7 +613,7 @@ "message": "Informações do item" }, "username": { - "message": "Nome de Usuário" + "message": "Nome de usuário" }, "password": { "message": "Senha" @@ -616,10 +622,10 @@ "message": "Segredo do autenticador" }, "passphrase": { - "message": "Frase Secreta" + "message": "Frase secreta" }, "favorite": { - "message": "Favorito" + "message": "Favoritar" }, "unfavorite": { "message": "Desfavoritar" @@ -631,13 +637,13 @@ "message": "Item removido dos favoritos" }, "notes": { - "message": "Notas" + "message": "Anotações" }, "privateNote": { "message": "Anotação privada" }, "note": { - "message": "Nota" + "message": "Anotação" }, "editItem": { "message": "Editar item" @@ -697,10 +703,10 @@ "message": "Outras opções" }, "rateExtension": { - "message": "Avaliar a Extensão" + "message": "Avalie a extensão" }, "browserNotSupportClipboard": { - "message": "O seu navegador web não suporta cópia para a área de transferência. Em alternativa, copie manualmente." + "message": "O seu navegador web não suporta copiar para a área de transferência. Em vez disso, copie manualmente." }, "verifyYourIdentity": { "message": "Verifique a sua identidade" @@ -712,7 +718,7 @@ "message": "Continuar acessando" }, "yourVaultIsLocked": { - "message": "Seu cofre está trancado. Verifique sua identidade para continuar." + "message": "Seu cofre está bloqueado. Verifique sua identidade para continuar." }, "yourVaultIsLockedV2": { "message": "Seu cofre está bloqueado" @@ -727,7 +733,7 @@ "message": "Desbloquear" }, "loggedInAsOn": { - "message": "Entrou como $EMAIL$ em $HOSTNAME$.", + "message": "Conectado como $EMAIL$ em $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -758,7 +764,7 @@ "message": "Tempo limite" }, "lockNow": { - "message": "Bloquear Agora" + "message": "Bloquear agora" }, "lockAll": { "message": "Bloquear tudo" @@ -797,16 +803,16 @@ "message": "4 horas" }, "onLocked": { - "message": "Ao bloquear o sistema" + "message": "No bloqueio do sistema" }, "onIdle": { - "message": "Quando o sistema ficar inativo" + "message": "Na inatividade do sistema" }, "onSleep": { - "message": "Quando o sistema hibernar" + "message": "Na hibernação do sistema" }, "onRestart": { - "message": "Ao reiniciar o navegador" + "message": "No reinício do navegador" }, "never": { "message": "Nunca" @@ -839,7 +845,7 @@ "message": "A senha principal é necessária." }, "confirmMasterPasswordRequired": { - "message": "É necessário digitar a senha principal novamente." + "message": "É necessário redigitar a senha principal." }, "masterPasswordMinlength": { "message": "A senha principal deve ter pelo menos $VALUE$ caracteres.", @@ -855,7 +861,7 @@ "message": "A confirmação da senha principal não corresponde." }, "newAccountCreated": { - "message": "A sua nova conta foi criada! Agora você pode iniciar a sessão." + "message": "A sua nova conta foi criada! Agora você pode conectar-se." }, "newAccountCreated2": { "message": "Sua nova conta foi criada!" @@ -864,7 +870,7 @@ "message": "Você foi conectado!" }, "youSuccessfullyLoggedIn": { - "message": "Você entrou na sua conta com sucesso" + "message": "Você conectou-se à sua conta com sucesso" }, "youMayCloseThisWindow": { "message": "Você pode fechar esta janela" @@ -876,13 +882,13 @@ "message": "O código de verificação é necessário." }, "webauthnCancelOrTimeout": { - "message": "A autenticação foi cancelada ou demorou muito. Por favor tente novamente." + "message": "A autenticação foi cancelada ou demorou muito. Tente novamente." }, "invalidVerificationCode": { "message": "Código de verificação inválido" }, "valueCopied": { - "message": " copiado", + "message": "$VALUE$ copiado(a)", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -919,7 +925,7 @@ "message": "Copiar chave do autenticador (TOTP)" }, "loggedOut": { - "message": "Sessão encerrada" + "message": "Desconectado" }, "loggedOutDesc": { "message": "Você foi desconectado de sua conta." @@ -928,13 +934,13 @@ "message": "A sua sessão expirou." }, "logIn": { - "message": "Entrar" + "message": "Conectar-se" }, "logInToBitwarden": { - "message": "Entre no Bitwarden" + "message": "Conecte-se ao Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Digite o código enviado por e-mail" + "message": "Digite o código enviado ao seu e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { "message": "Digite o código do seu autenticador" @@ -943,19 +949,19 @@ "message": "Pressione sua YubiKey para autenticar-se" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "A autenticação de dois fatores do Duo é necessária para sua conta. Siga os passos abaixo para conseguir entrar." + "message": "A autenticação de duas etapas do Duo é necessária para sua conta. Siga os passos abaixo para conseguir se conectar." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Siga os passos abaixo para finalizar a autenticação." + "message": "Siga os passos abaixo para terminar de se conectar." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Siga os passos abaixo para finalizar a autenticação com a sua chave de segurança." + "message": "Siga os passos abaixo para finalizar de se conectar com a sua chave de segurança." }, "restartRegistration": { "message": "Reiniciar cadastro" }, "expiredLink": { - "message": "Link expirado" + "message": "Link vencido" }, "pleaseRestartRegistrationOrTryLoggingIn": { "message": "Reinicie o cadastro ou tente conectar-se." @@ -964,7 +970,7 @@ "message": "Você pode já ter uma conta" }, "logOutConfirmation": { - "message": "Você tem certeza que deseja sair?" + "message": "Tem certeza que quer se desconectar?" }, "yes": { "message": "Sim" @@ -991,13 +997,13 @@ "message": "Torne sua conta mais segura configurando a autenticação em duas etapas no aplicativo web do Bitwarden." }, "twoStepLoginConfirmationTitle": { - "message": "Continuar para o aplicativo web?" + "message": "Continuar no aplicativo web?" }, "editedFolder": { "message": "Pasta salva" }, "deleteFolderConfirmation": { - "message": "Você tem certeza que deseja excluir esta pasta?" + "message": "Tem certeza que deseja apagar esta pasta?" }, "deletedFolder": { "message": "Pasta apagada" @@ -1009,16 +1015,16 @@ "message": "Assista o nosso tutorial de introdução e saiba como tirar o máximo de proveito da extensão de navegador." }, "syncingComplete": { - "message": "Sincronização completa" + "message": "Sincronização concluída" }, "syncingFailed": { - "message": "A Sincronização falhou" + "message": "A sincronização falhou" }, "passwordCopied": { "message": "Senha copiada" }, "uri": { - "message": "URL" + "message": "URI" }, "uriPosition": { "message": "URI $POSITION$", @@ -1056,7 +1062,7 @@ } }, "deleteItemConfirmation": { - "message": "Você tem certeza que deseja enviar este item para a lixeira?" + "message": "Tem certeza que quer enviar este item para a lixeira?" }, "deletedItem": { "message": "Item enviado para a lixeira" @@ -1068,19 +1074,19 @@ "message": "Você tem certeza que deseja substituir a senha atual?" }, "overwriteUsername": { - "message": "Sobrescrever nome de usuário" + "message": "Substituir nome de usuário" }, "overwriteUsernameConfirmation": { "message": "Tem certeza que deseja substituir o nome de usuário atual?" }, "searchFolder": { - "message": "Pesquisar pasta" + "message": "Buscar na pasta" }, "searchCollection": { - "message": "Pesquisar coleção" + "message": "Buscar no conjunto" }, "searchType": { - "message": "Pesquisar tipo" + "message": "Buscar tipo" }, "noneFolder": { "message": "Sem pasta", @@ -1114,7 +1120,7 @@ "message": "Mostrar identidades na página da aba" }, "showIdentitiesCurrentTabDesc": { - "message": "Liste as identidades na página da aba para facilitar o preenchimento automático." + "message": "Listar as identidades na página da aba para facilitar o preenchimento automático." }, "clickToAutofillOnVault": { "message": "Clique em itens na tela do Cofre para preencher automaticamente" @@ -1248,10 +1254,10 @@ "description": "Detailed error message shown when saving login details fails." }, "changePasswordWarning": { - "message": "Ao alterar sua senha, você precisará entrar com a sua senha nova. Sessões ativas em outros dispositivos serão desconectados dentro de uma hora." + "message": "Ao alterar sua senha, você precisará se conectar com a sua senha nova. Sessões ativas em outros dispositivos serão desconectadas dentro de uma hora." }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Mude a sua senha principal para completar a recuperação de conta." + "message": "Altere a sua senha principal para concluir a recuperação da conta." }, "enableChangedPasswordNotification": { "message": "Pedir para atualizar credencial existente" @@ -1266,7 +1272,7 @@ "message": "Pedir para salvar e usar chaves de acesso" }, "usePasskeysDesc": { - "message": "Pedir para salvar novas chaves de acesso ou entrar com as mesmas armazenadas no seu cofre. Aplica-se a todas as contas conectadas." + "message": "Pedir para salvar novas chaves de acesso ou se conectar com as mesmas armazenadas no seu cofre. Aplica-se a todas as contas conectadas." }, "notificationChangeDesc": { "message": "Você quer atualizar esta senha no Bitwarden?" @@ -1293,7 +1299,7 @@ "message": "Use um clique secundário para acessar a geração de senha e as credenciais correspondentes para o site. Aplica-se a todas as contas conectadas." }, "defaultUriMatchDetection": { - "message": "Detecção de correspondência de URI padrão", + "message": "Detecção de correspondência padrão de URI", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { @@ -1320,7 +1326,7 @@ "message": "Exportar de" }, "exportVault": { - "message": "Exportar Cofre" + "message": "Exportar cofre" }, "fileFormat": { "message": "Formato do arquivo" @@ -1338,7 +1344,7 @@ "message": "Use a chave de criptografia da sua conta, derivada do nome de usuário e senha principal da sua conta, para criptografar a exportação e restringir a importação para apenas a conta atual do Bitwarden." }, "passwordProtectedOptionDescription": { - "message": "Defina uma senha para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografar." + "message": "Configure uma senha de arquivo para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografá-la." }, "exportTypeHeading": { "message": "Tipo da exportação" @@ -1347,21 +1353,21 @@ "message": "Restrita à conta" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "\"Senha do arquivo\" e \"Confirmação de senha\" não correspondem." + "message": "\"Senha do arquivo\" e \"Confirmar senha do arquivo\" não correspondem." }, "warning": { - "message": "AVISO", + "message": "ALERTA", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { - "message": "Aviso", + "message": "Atenção", "description": "Warning (should maintain locale-relevant capitalization)" }, "confirmVaultExport": { "message": "Confirmar exportação do cofre" }, "exportWarningDesc": { - "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua o arquivo imediatamente após terminar de usá-lo." + "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague o arquivo imediatamente após terminar de usá-lo." }, "encExportKeyWarningDesc": { "message": "Esta exportação criptografa seus dados usando a chave de criptografia da sua conta. Se você rotacionar a chave de criptografia da sua conta, você deve exportar novamente, já que você não será capaz de descriptografar este arquivo de exportação." @@ -1370,7 +1376,7 @@ "message": "As chaves de criptografia são únicas para cada conta de usuário do Bitwarden, então você não pode importar um arquivo de exportação criptografado para uma conta diferente." }, "exportMasterPassword": { - "message": "Insira a sua senha principal para exportar os dados do seu cofre." + "message": "Digite a sua senha principal para exportar os dados do seu cofre." }, "shared": { "message": "Compartilhado" @@ -1398,7 +1404,7 @@ "message": "Escolha uma organização para a qual deseja mover este item. Mudar para uma organização transfere a propriedade do item para essa organização. Você não será mais o proprietário direto deste item depois que ele for movido." }, "learnMore": { - "message": "Saber mais" + "message": "Saiba mais" }, "authenticatorKeyTotp": { "message": "Chave do autenticador (TOTP)" @@ -1413,10 +1419,10 @@ "message": "Anexos" }, "deleteAttachment": { - "message": "Excluir anexo" + "message": "Apagar anexo" }, "deleteAttachmentConfirmation": { - "message": "Tem a certeza de que deseja excluir este anexo?" + "message": "Tem a certeza de que deseja apagar este anexo?" }, "deletedAttachment": { "message": "Anexo apagado" @@ -1425,7 +1431,7 @@ "message": "Adicionar novo anexo" }, "noAttachments": { - "message": "Sem anexos." + "message": "Nenhum anexo." }, "attachmentSaved": { "message": "Anexo salvo" @@ -1437,7 +1443,7 @@ "message": "Arquivo para compartilhar" }, "selectFile": { - "message": "Selecione um arquivo." + "message": "Selecione um arquivo" }, "maxFileSize": { "message": "O tamanho máximo do arquivo é de 500 MB." @@ -1455,19 +1461,19 @@ "message": "Gerenciar plano" }, "premiumManageAlert": { - "message": "Você pode gerenciar a sua assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?" + "message": "Você pode gerenciar o seu plano no cofre web do bitwarden.com. Você deseja visitar o site agora?" }, "premiumRefresh": { - "message": "Recarregar assinatura" + "message": "Recarregar plano" }, "premiumNotCurrentMember": { "message": "Você não é um membro Premium atualmente." }, "premiumSignUpAndGet": { - "message": "Inscreva-se para uma assinatura Premium e receba:" + "message": "Inscreva-se para um plano Premium e receba:" }, "ppremiumSignUpStorage": { - "message": "1 GB de armazenamento de arquivos encriptados." + "message": "1 GB de armazenamento criptografado para anexo de arquivos." }, "premiumSignUpEmergency": { "message": "Acesso de emergência." @@ -1476,7 +1482,7 @@ "message": "Opções de autenticação em duas etapas proprietárias como YubiKey e Duo." }, "ppremiumSignUpReports": { - "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro." + "message": "Relatórios de higiene de senha, saúde da conta, e vazamentos de dados para manter o seu cofre seguro." }, "ppremiumSignUpTotp": { "message": "Gerador de códigos de verificação TOTP (2FA) para credenciais no seu cofre." @@ -1485,7 +1491,7 @@ "message": "Prioridade no suporte ao cliente." }, "ppremiumSignUpFuture": { - "message": "Todas as recursos do Premium no futuro. Mais em breve!" + "message": "Todos as recursos do Premium no futuro. Mais em breve!" }, "premiumPurchase": { "message": "Comprar Premium" @@ -1503,7 +1509,7 @@ "message": "Faça upgrade para o Premium e receba:" }, "premiumPrice": { - "message": "Tudo por apenas %price% /ano!", + "message": "Tudo por apenas $PRICE$ por ano!", "placeholders": { "price": { "content": "$1", @@ -1521,7 +1527,7 @@ } }, "refreshComplete": { - "message": "Atualização completa" + "message": "Recarregamento concluído" }, "enableAutoTotpCopy": { "message": "Copiar TOTP automaticamente" @@ -1533,7 +1539,7 @@ "message": "Pedir biometria ao abrir" }, "authenticationTimeout": { - "message": "Tempo de autenticação esgotado" + "message": "Tempo limite da autenticação atingido" }, "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Reinicie o processo de autenticação." @@ -1558,7 +1564,7 @@ "message": "Usar seu código de recuperação" }, "insertU2f": { - "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele." + "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ela tiver um botão, toque nele." }, "openInNewTab": { "message": "Abrir em uma nova aba" @@ -1576,7 +1582,7 @@ "message": "Falha na autenticação da chave de acesso" }, "useADifferentLogInMethod": { - "message": "Usar um método de entrada diferente" + "message": "Usar um método de autenticação diferente" }, "awaitingSecurityKeyInteraction": { "message": "Aguardando interação com a chave de segurança..." @@ -1585,10 +1591,10 @@ "message": "Autenticação indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem a verificação de duas etapas ativada, no entanto, nenhum dos provedores de verificação de duas etapas configurados são suportados por este navegador web." + "message": "Esta conta tem a autenticação de duas etapas ativada, no entanto, nenhum dos provedores configurados são suportados por este navegador web." }, "noTwoStepProviders2": { - "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicativo de autenticação)." + "message": "Use um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como um aplicativo autenticator)." }, "twoStepOptions": { "message": "Opções de autenticação em duas etapas" @@ -1610,14 +1616,14 @@ "message": "Chave de segurança Yubico OTP" }, "yubiKeyDesc": { - "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO." + "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com os dispositivos YubiKey 4, 4 Nano, 4C, e NEO." }, "duoDescV2": { "message": "Digite um código gerado pelo Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.", + "message": "Verifique com o Duo Security para a sua organização usando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { @@ -1636,13 +1642,13 @@ "message": "Ambiente auto-hospedado" }, "selfHostedBaseUrlHint": { - "message": "Especifique o0 URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" + "message": "Especifique o URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { "message": "Para configuração avançada, você pode especificar a URL de base de cada serviço independentemente." }, "selfHostedEnvFormInvalid": { - "message": "Você deve adicionar um URL do servidor de base ou pelo menos um ambiente personalizado." + "message": "Você deve adicionar um URL de base de um servidor ou pelo menos um ambiente personalizado." }, "selfHostedEnvMustUseHttps": { "message": "URLs devem usar HTTPS." @@ -1651,7 +1657,7 @@ "message": "Ambiente personalizado" }, "baseUrl": { - "message": "URL do Servidor" + "message": "URL do servidor" }, "selfHostBaseUrl": { "message": "URL do servidor auto-hospedado", @@ -1737,7 +1743,7 @@ "message": "Aplica-se a todas as contas conectadas." }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "Desative o gerenciador de senhas integrado do seu navegador para evitar conflitos." + "message": "Desative o gerenciador de senhas embutido no seu navegador para evitar conflitos." }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { "message": "Edite as configurações do navegador." @@ -1773,7 +1779,7 @@ "message": "Saiba mais sobre preenchimento automático" }, "defaultAutoFillOnPageLoad": { - "message": "Configuração de autopreenchimento padrão para itens de credenciais" + "message": "Configuração padrão de preenchimento automático para credenciais" }, "defaultAutoFillOnPageLoadDesc": { "message": "Você pode desativar o preenchimento automático no carregamento da página para credenciais individuais na tela de Editar do item." @@ -1794,7 +1800,7 @@ "message": "Abrir cofre na barra lateral" }, "commandAutofillLoginDesc": { - "message": "Preencher automaticamente o último login utilizado para o site atual" + "message": "Preencher automaticamente a última credencial utilizada para o site atual" }, "commandAutofillCardDesc": { "message": "Preencher automaticamente o último cartão utilizado para o site atual" @@ -1803,7 +1809,7 @@ "message": "Preencher automaticamente a última identidade usada para o site atual" }, "commandGeneratePasswordDesc": { - "message": "Gerar e copiar uma nova senha aleatória para a área de transferência." + "message": "Gere e copie uma nova senha aleatória para a área de transferência" }, "commandLockVaultDesc": { "message": "Bloquear o cofre" @@ -1821,7 +1827,7 @@ "message": "Novo campo personalizado" }, "dragToSort": { - "message": "Arrastar para ordenar" + "message": "Arraste para ordenar" }, "dragToReorder": { "message": "Arraste para reorganizar" @@ -1830,7 +1836,7 @@ "message": "Texto" }, "cfTypeHidden": { - "message": "Ocultado" + "message": "Oculto" }, "cfTypeBoolean": { "message": "Booleano" @@ -1847,7 +1853,7 @@ "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Ao clicar fora da janela de pop-up para verificar seu e-mail para o seu código de verificação fará com que este pop-up feche. Você deseja abrir este pop-up em uma nova janela para que ele não seja fechado?" + "message": "Ao clicar fora da janela de pop-up para conferir seu e-mail pelo seu código de verificação, este pop-up fechará. Você deseja abrir este pop-up em uma nova janela para que ele não seja fechado?" }, "showIconsChangePasswordUrls": { "message": "Mostrar ícones de sites e obter URLs de alteração de senha" @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Ano de vencimento" }, + "monthly": { + "message": "mês" + }, "expiration": { "message": "Vencimento" }, @@ -1913,7 +1922,7 @@ "message": "número do cartão" }, "ex": { - "message": "ex." + "message": "p. ex." }, "title": { "message": "Título" @@ -1979,10 +1988,10 @@ "message": "Endereço 3" }, "cityTown": { - "message": "Cidade / Localidade" + "message": "Cidade ou localidade" }, "stateProvince": { - "message": "Estado / Província" + "message": "Estado ou província" }, "zipPostalCode": { "message": "CEP / Código postal" @@ -2071,23 +2080,23 @@ "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "Visualizar credencial", + "message": "Ver credencial", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "Visualizar cartão", + "message": "Ver cartão", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "Visualizar identidade", + "message": "Ver identidade", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "Visualizar anotação", + "message": "Ver anotação", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "Visualizar chave SSH", + "message": "Ver chave SSH", "description": "Header for view SSH key item type" }, "passwordHistory": { @@ -2106,10 +2115,10 @@ "message": "Voltar" }, "collections": { - "message": "Coleções" + "message": "Conjuntos" }, "nCollections": { - "message": "$COUNT$ coleções", + "message": "$COUNT$ conjuntos", "placeholders": { "count": { "content": "$1", @@ -2124,7 +2133,7 @@ "message": "Abrir em uma nova janela" }, "refresh": { - "message": "Atualizar" + "message": "Recarregar" }, "cards": { "message": "Cartões" @@ -2146,10 +2155,10 @@ "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Verifique se a senha foi exposta." + "message": "Confira se a senha foi exposta." }, "passwordExposed": { - "message": "Esta senha foi exposta $VALUE$ vez(es) em violações de dados. Você deve alterá-la.", + "message": "Esta senha foi exposta $VALUE$ vez(es) em vazamentos de dados. Você deve alterá-la.", "placeholders": { "value": { "content": "$1", @@ -2158,7 +2167,7 @@ } }, "passwordSafe": { - "message": "Esta senha não foi encontrada em violações de dados conhecidas. Deve ser seguro de usar." + "message": "Esta senha não foi encontrada em vazamentos de dados conhecidos. Deve ser segura de usar." }, "baseDomain": { "message": "Domínio de base", @@ -2216,7 +2225,7 @@ "message": "Todos os itens" }, "noPasswordsInList": { - "message": "Não existem senhas para listar." + "message": "Não há senhas para listar." }, "clearHistory": { "message": "Limpar histórico" @@ -2246,19 +2255,19 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Definir suas opções de bloqueio para \"Nunca\" armazena a chave de criptografia do seu cofre no seu dispositivo. Se você usar esta opção, você deve garantir que irá manter o seu dispositivo devidamente protegido." + "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Configurar suas opções de bloqueio para \"Nunca\" armazena a chave de criptografia do seu cofre no seu dispositivo. Se você usar esta opção, você deve garantir que irá manter o seu dispositivo devidamente protegido." }, "noOrganizationsList": { - "message": "Você pertence a nenhuma organização. As organizações permitem que você compartilhe itens em segurança com outros usuários." + "message": "Você não pertence a nenhuma organização. As organizações permitem que você compartilhe itens em segurança com outros usuários." }, "noCollectionsInList": { - "message": "Não há coleções para listar." + "message": "Não há conjuntos para listar." }, "ownership": { "message": "Propriedade" }, "whoOwnsThisItem": { - "message": "Quem possui este item?" + "message": "Quem é o proprietário deste item?" }, "strong": { "message": "Forte", @@ -2273,17 +2282,17 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Senha principal Fraca" + "message": "Senha principal fraca" }, "weakMasterPasswordDesc": { - "message": "A senha principal que você selecionou está fraca. Você deve usar uma senha principal forte (ou uma frase-passe) para proteger a sua conta Bitwarden adequadamente. Tem certeza que deseja usar esta senha principal?" + "message": "A senha principal que você selecionou está fraca. Você deve usar uma senha principal forte (ou uma frase secreta) para proteger a sua conta Bitwarden adequadamente. Tem certeza que deseja usar esta senha principal?" }, "pin": { "message": "PIN", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "Desbloquear com o PIN" + "message": "Desbloquear com PIN" }, "setYourPinTitle": { "message": "Configurar PIN" @@ -2292,10 +2301,10 @@ "message": "Configurar 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." + "message": "Configure o seu código PIN para desbloquear o Bitwarden. Suas configurações de PIN serão reconfiguradas se você desconectar a sua conta do aplicativo." }, "setPinCode": { - "message": "Você pode usar este PIN para desbloquear o Bitwarden. O seu PIN será redefinido se você sair da sua conta no aplicativo." + "message": "Você pode usar este PIN para desbloquear o Bitwarden. O seu PIN será reconfigurado se você desconectar a sua conta do aplicativo." }, "pinRequired": { "message": "O código PIN é necessário." @@ -2307,13 +2316,13 @@ "message": "Muitas tentativas de entrada de PIN inválidas. Desconectando." }, "unlockWithBiometrics": { - "message": "Desbloquear com a biometria" + "message": "Desbloquear com biometria" }, "unlockWithMasterPassword": { "message": "Desbloquear com senha principal" }, "awaitDesktop": { - "message": "Aguardando confirmação do desktop" + "message": "Aguardando confirmação do computador" }, "awaitDesktopDesc": { "message": "Confirme o uso de biometria no aplicativo do Bitwarden Desktop para ativar a biometria para o navegador." @@ -2325,7 +2334,7 @@ "message": "Exigir senha principal ao reiniciar o navegador" }, "selectOneCollection": { - "message": "Você deve selecionar pelo menos uma coleção." + "message": "Você deve selecionar pelo menos um conjunto." }, "cloneItem": { "message": "Clonar item" @@ -2343,16 +2352,16 @@ "message": "Usar este e-mail" }, "useThisPassword": { - "message": "Use esta senha" + "message": "Usar esta senha" }, "useThisPassphrase": { - "message": "Use esta frase secreta" + "message": "Usar esta frase secreta" }, "useThisUsername": { - "message": "Use este nome de usuário" + "message": "Usar este nome de usuário" }, "securePasswordGenerated": { - "message": "Senha segura gerada! Não se esqueça de atualizar também sua senha no site." + "message": "Senha segura gerada! Não se esqueça de atualizar sua senha no site também." }, "useGeneratorHelpTextPartOne": { "message": "Use o gerador", @@ -2380,13 +2389,13 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Pesquisar na lixeira" + "message": "Buscar na lixeira" }, "permanentlyDeleteItem": { "message": "Apagar item para sempre" }, "permanentlyDeleteItemConfirmation": { - "message": "Você tem certeza que deseja excluir permanentemente esse item?" + "message": "Tem certeza que deseja apagar esse item para sempre?" }, "permanentlyDeletedItem": { "message": "Item apagado para sempre" @@ -2401,7 +2410,7 @@ "message": "Já tem uma conta?" }, "vaultTimeoutLogOutConfirmation": { - "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" + "message": "Desconectar-se irá remover todo o acesso ao seu cofre e requirirá autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Confirmação da ação do tempo limite" @@ -2437,10 +2446,10 @@ } }, "topLayerHijackWarning": { - "message": "This page is interfering with the Bitwarden experience. The Bitwarden inline menu has been temporarily disabled as a safety measure." + "message": "Esta página está interferindo com a experiência do Bitwarden. O menu inline do Bitwarden foi temporariamente desativado como uma medida de segurança." }, "setMasterPassword": { - "message": "Definir senha principal" + "message": "Configurar senha principal" }, "currentMasterPass": { "message": "Senha principal atual" @@ -2524,7 +2533,7 @@ "message": "Sua senha nova não pode ser a mesma que a sua atual." }, "hintEqualsPassword": { - "message": "Sua dica de senha não pode ser o mesmo que sua senha." + "message": "A dica da sua senha não pode ser a mesma coisa que sua senha." }, "ok": { "message": "Ok" @@ -2539,7 +2548,7 @@ "message": "Verificação de sincronização do Desktop" }, "desktopIntegrationVerificationText": { - "message": "Por favor, verifique se o aplicativo desktop mostra esta impressão digital: " + "message": "Verifique se o aplicativo de computador mostra esta frase biométrica: " }, "desktopIntegrationDisabledTitle": { "message": "A integração com o navegador não foi configurada" @@ -2548,40 +2557,40 @@ "message": "A integração com o navegador não foi configurada no aplicativo do Bitwarden Desktop. Configure ela nas configurações do aplicativo de computador." }, "startDesktopTitle": { - "message": "Iniciar o aplicativo Bitwarden Desktop" + "message": "Abrir o aplicativo Bitwarden Desktop" }, "startDesktopDesc": { - "message": "O aplicativo do Bitwarden para desktop precisa ser iniciado antes que o desbloqueio com biometria possa ser usado." + "message": "O aplicativo Bitwarden para computador precisa ser aberto antes que o desbloqueio com biometria possa ser usado." }, "errorEnableBiometricTitle": { "message": "Não é possível ativar a biometria" }, "errorEnableBiometricDesc": { - "message": "A ação foi cancelada pelo aplicativo desktop" + "message": "A ação foi cancelada pelo aplicativo de computador" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "O aplicativo desktop invalidou o canal de comunicação seguro. Por favor, tente esta operação novamente" + "message": "O aplicativo de computador invalidou o canal de comunicação seguro. Tente esta operação novamente" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Comunicação com o desktop interrompida" + "message": "Comunicação com o computador interrompida" }, "nativeMessagingWrongUserDesc": { - "message": "O aplicativo desktop está conectado em uma conta diferente. Por favor, certifique-se de que ambos os aplicativos estejam conectados na mesma conta." + "message": "O aplicativo de computador está conectado em uma conta diferente. Certifique-se de que ambos os aplicativos estejam conectados na mesma conta." }, "nativeMessagingWrongUserTitle": { - "message": "A conta não confere" + "message": "Não correspondência da conta" }, "nativeMessagingWrongUserKeyTitle": { "message": "Não correspondência da chave biométrica" }, "nativeMessagingWrongUserKeyDesc": { - "message": "O desbloqueio biométrico falhou. A chave secreta da biometria falhou ao desbloquear o cofre. Tente configurar a biometrica biométricos novamente." + "message": "O desbloqueio biométrico falhou. A chave secreta da biometria falhou ao desbloquear o cofre. Tente configurar a biometria novamente." }, "biometricsNotEnabledTitle": { "message": "Biometria não configurada" }, "biometricsNotEnabledDesc": { - "message": "A biometria com o navegador requer que a biometria de desktop seja ativada nas configurações primeiro." + "message": "A biometria com o navegador requer que a biometria do desktop seja configurada nas configurações primeiro." }, "biometricsNotSupportedTitle": { "message": "Biometria não suportada" @@ -2611,16 +2620,16 @@ "message": "Permissão não fornecida" }, "nativeMessaginPermissionErrorDesc": { - "message": "Sem a permissão para se comunicar com o Aplicativo Bitwarden Desktop, não podemos fornecer dados biométricos na extensão do navegador. Por favor, tente novamente." + "message": "Sem a permissão para se comunicar com o aplicativo do Bitwarden Desktop, não podemos fornecer a biometria na extensão do navegador. Tente novamente." }, "nativeMessaginPermissionSidebarTitle": { "message": "Erro ao solicitar permissão" }, "nativeMessaginPermissionSidebarDesc": { - "message": "Esta ação não pode ser feita na barra lateral. Por favor, tente novamente no pop-up ou popout." + "message": "Esta ação não pode ser feita na barra lateral. Tente novamente no pop-up." }, "personalOwnershipSubmitError": { - "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as coleções disponíveis." + "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre os conjuntos disponíveis." }, "personalOwnershipPolicyInEffect": { "message": "Uma política de organização está afetando suas opções de propriedade." @@ -2629,7 +2638,7 @@ "message": "Uma política da organização bloqueou a importação de itens em seu cofre pessoal." }, "restrictCardTypeImport": { - "message": "Não é possível importar tipos de item de cartão" + "message": "Não é possível importar itens do tipo de cartão" }, "restrictCardTypeImportDesc": { "message": "Uma política definida por 1 ou mais organizações impedem que você importe cartões em seus cofres." @@ -2651,10 +2660,10 @@ "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios. Você deve atualizar a página para que as alterações entrem em vigor." }, "excludedDomainsDescAlt": { - "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios, em todas as contas. Você deve atualizar a página para que as alterações entrem em vigor." + "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios, em todas as contas. Você deve recarregar a página para que as alterações entrem em vigor." }, "blockedDomainsDesc": { - "message": "O preenchimento automático e outros recursos não serão oferecidos para estes sites. Atualize a página para que as mudanças surtam efeito." + "message": "O preenchimento automático e outros recursos relacionados não serão oferecidos para estes sites. Recarregue a página para que as mudanças surtam efeito." }, "autofillBlockedNoticeV2": { "message": "O preenchimento automático está bloqueado para este site." @@ -2685,7 +2694,7 @@ "message": "Senhas em risco" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ solicita que altere uma senha, pois ela está vulnerável.", + "message": "$ORGANIZATION$ está solicitando que altere uma senha, pois ela está em risco.", "placeholders": { "organization": { "content": "$1", @@ -2694,7 +2703,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ solicita que altere $COUNT$ senhas, pois elas estão vulneráveis.", + "message": "$ORGANIZATION$ está solicitando que altere $COUNT$ senhas, pois elas estão em risco.", "placeholders": { "organization": { "content": "$1", @@ -2707,7 +2716,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Suas organizações estão solicitando que altere $COUNT$ senhas porque elas estão vulneráveis.", + "message": "Suas organizações estão solicitando que altere $COUNT$ senhas porque elas estão em risco.", "placeholders": { "count": { "content": "$1", @@ -2716,7 +2725,7 @@ } }, "atRiskChangePrompt": { - "message": "Sua senha para este site está em risco. $ORGANIZATION$ solicitou alterá-la.", + "message": "Sua senha para este site está em risco. $ORGANIZATION$ solicitou que você altere ela.", "placeholders": { "organization": { "content": "$1", @@ -2787,10 +2796,10 @@ "message": "Ativar preenchimento automático" }, "turnedOnAutofill": { - "message": "Desativar preenchimento automático" + "message": "Preenchimento automático ativado" }, "dismiss": { - "message": "Dispensar" + "message": "Descartar" }, "websiteItemLabel": { "message": "Site $number$ (URI)", @@ -2814,7 +2823,7 @@ "message": "Alterações de domínios bloqueados salvas" }, "excludedDomainsSavedSuccess": { - "message": "Mudanças de domínios excluídos salvas" + "message": "Alterações de domínios excluídos salvas" }, "limitSendViews": { "message": "Limitar visualizações" @@ -2862,7 +2871,7 @@ "message": "Ocultar texto por padrão" }, "expired": { - "message": "Expirado" + "message": "Vencido" }, "passwordProtected": { "message": "Protegido por senha" @@ -2875,10 +2884,10 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remover Senha" + "message": "Remover senha" }, "delete": { - "message": "Excluir" + "message": "Apagar" }, "removedPassword": { "message": "Senha removida" @@ -2898,11 +2907,11 @@ "message": "Você tem certeza que deseja remover a senha?" }, "deleteSend": { - "message": "Excluir Send", + "message": "Apagar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Você tem certeza que deseja excluir este Send?", + "message": "Você tem certeza que deseja apagar este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { @@ -2954,7 +2963,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Devido a uma política corporativa, você só pode excluir um Send existente.", + "message": "Devido a uma política corporativa, você só pode apagar um Send existente.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { @@ -2966,7 +2975,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "O Send estará disponível para qualquer pessoa com o link pela próxima hora.", + "message": "O Send estará disponível para qualquer pessoa com o link pela próxima 1 hora.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { @@ -2980,7 +2989,7 @@ } }, "sendExpiresInDaysSingle": { - "message": "O Send estará disponível para qualquer pessoa com o link pelo próximo dia.", + "message": "O Send estará disponível para qualquer pessoa com o link pelo próximo 1 dia.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { @@ -3002,7 +3011,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { - "message": "Mostrar extensão?", + "message": "Criar janela da extensão?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { @@ -3019,7 +3028,7 @@ "message": "Para escolher um arquivo usando o Safari, abra uma nova janela clicando neste banner." }, "popOut": { - "message": "Separar da janela" + "message": "Mover para janela" }, "sendFileCalloutHeader": { "message": "Antes de começar" @@ -3028,28 +3037,28 @@ "message": "A data de validade fornecida não é válida." }, "deletionDateIsInvalid": { - "message": "A data de exclusão fornecida não é válida." + "message": "A data de apagamento fornecida não é válida." }, "expirationDateAndTimeRequired": { - "message": "Uma data e hora de expiração são obrigatórias." + "message": "Uma data e hora de validade são obrigatórias." }, "deletionDateAndTimeRequired": { - "message": "Uma data e hora de exclusão são obrigatórias." + "message": "Uma data e hora de apagamento são obrigatórias." }, "dateParsingError": { - "message": "Ocorreu um erro ao salvar as suas datas de exclusão e validade." + "message": "Ocorreu um erro ao salvar as suas datas de apagamento e validade." }, "hideYourEmail": { "message": "Oculte seu endereço de e-mail dos visualizadores." }, "passwordPrompt": { - "message": "Solicitação nova de senha principal" + "message": "Resolicitar senha principal" }, "passwordConfirmation": { "message": "Confirmação de senha principal" }, "passwordConfirmationDesc": { - "message": "Esta ação está protegida. Para continuar, por favor, reinsira a sua senha principal para verificar sua identidade." + "message": "Esta ação está protegida. Para continuar, digite a sua senha principal novamente para verificar sua identidade." }, "emailVerificationRequired": { "message": "Verificação de e-mail necessária" @@ -3061,7 +3070,7 @@ "message": "Você precisa verificar o seu e-mail para usar este recurso. Você pode verificar seu e-mail no cofre web." }, "masterPasswordSuccessfullySet": { - "message": "Senha principal definida com sucesso" + "message": "Senha principal configurada com sucesso" }, "updatedMasterPassword": { "message": "Senha principal atualizada" @@ -3070,19 +3079,19 @@ "message": "Atualizar senha principal" }, "updateMasterPasswordWarning": { - "message": "Sua senha principal foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la agora. O processo desconectará você da sessão atual, exigindo que você entre novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." + "message": "Sua senha principal foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la agora. O processo desconectará você da sessão atual, exigindo que você se conecte novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "updateWeakMasterPasswordWarning": { - "message": "A sua senha principal não atende a uma ou mais das políticas da sua organização. Para acessar o cofre, você deve atualizar a sua senha principal agora. O processo desconectará você da sessão atual, exigindo que você entre novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." + "message": "A sua senha principal não atende a uma ou mais das políticas da sua organização. Para acessar o cofre, você deve atualizar a sua senha principal agora. O processo desconectará você da sessão atual, exigindo que você se conecte novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "tdeDisabledMasterPasswordRequired": { - "message": "Sua organização desativou a criptografia confiável do dispositivo. Defina uma senha principal para acessar o seu cofre." + "message": "Sua organização desativou a criptografia de dispositivo confiado. Configure uma senha principal para acessar o seu cofre." }, "resetPasswordPolicyAutoEnroll": { "message": "Inscrição automática" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na redefinição de senha. A inscrição permitirá que os administradores da organização alterem sua senha principal." + "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na reconfiguração de senha. A inscrição permitirá que os administradores da organização alterem sua senha principal." }, "selectFolder": { "message": "Selecionar pasta..." @@ -3092,11 +3101,11 @@ "description": "Used as a message within the notification bar when no folders are found" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "As permissões da sua organização foram atualizadas, exigindo que você defina uma senha principal.", + "message": "As permissões da sua organização foram atualizadas, exigindo que você configure uma senha principal.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "Sua organização requer que você defina uma senha principal.", + "message": "Sua organização requer que você configure uma senha principal.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { @@ -3119,10 +3128,10 @@ "message": "Minutos" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Os requisitos de política empresarial foram aplicados às opções de tempo limite" + "message": "Os requisitos de política empresarial foram aplicados às suas opções de tempo limite" }, "vaultTimeoutPolicyInEffect": { - "message": "As políticas da sua organização definiram o tempo máximo de limite para o cofre como $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "message": "As políticas da sua organização configuraram o seu máximo permitido do tempo limite do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { "hours": { "content": "$1", @@ -3161,7 +3170,7 @@ } }, "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$.", + "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. \nO tempo limite máximo permitido para o cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre está configurada como $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -3178,7 +3187,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "As políticas da sua organização definiram a ação tempo limite do seu cofre para $ACTION$.", + "message": "As políticas da sua organização configuraram a ação do tempo limite do seu cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -3187,7 +3196,7 @@ } }, "vaultTimeoutTooLarge": { - "message": "O tempo limite do seu cofre excede as restrições estabelecidas por sua organização." + "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." }, "vaultExportDisabled": { "message": "Exportação de cofre indisponível" @@ -3196,10 +3205,10 @@ "message": "Uma ou mais políticas da organização impedem que você exporte seu cofre individual." }, "copyCustomFieldNameInvalidElement": { - "message": "Não foi possível identificar um elemento de formulário válido. Em vez disso, tente inspecionar o HTML." + "message": "Não é possível identificar um elemento de formulário válido. Em vez disso, tente inspecionar o HTML." }, "copyCustomFieldNameNotUnique": { - "message": "Nenhum identificador exclusivo encontrado." + "message": "Nenhum identificador único encontrado." }, "removeMasterPasswordForOrganizationUserKeyConnector": { "message": "Uma senha principal não é mais necessária para os membros da seguinte organização. Confirme o domínio abaixo com o administrador da sua organização." @@ -3208,7 +3217,7 @@ "message": "Nome da organização" }, "keyConnectorDomain": { - "message": "Domínio do Conector de Chave" + "message": "Domínio do Key Connector" }, "leaveOrganization": { "message": "Sair da organização" @@ -3229,7 +3238,7 @@ "message": "Habilitar contagem de caracteres" }, "sessionTimeout": { - "message": "Sua sessão expirou. Volte e tente entrar novamente." + "message": "Sua sessão expirou. Volte e tente se conectar novamente." }, "exportingPersonalVaultTitle": { "message": "Exportando cofre individual" @@ -3274,7 +3283,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Os itens da minhas coleções não serão incluídos.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Os itens dos meus conjuntos não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -3286,7 +3295,7 @@ "message": "Erro" }, "decryptionError": { - "message": "Erro ao descriptografar" + "message": "Erro de descriptografia" }, "errorGettingAutoFillData": { "message": "Erro ao obter dados de preenchimento automático" @@ -3295,7 +3304,7 @@ "message": "O Bitwarden não conseguiu descriptografar o(s) item(ns) do cofre listado abaixo." }, "contactCSToAvoidDataLossPart1": { - "message": "Contate o sucesso do cliente", + "message": "Contate o costumer success", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -3353,7 +3362,7 @@ "message": "E-mail pega-tudo" }, "catchallEmailDesc": { - "message": "Use o pega-tudo configurado na caixa de entrada do seu domínio." + "message": "Use a caixa de entrada pega-tudo configurada no seu domínio." }, "random": { "message": "Aleatório" @@ -3368,10 +3377,10 @@ "message": "Serviço" }, "forwardedEmail": { - "message": "Alias do e-mail encaminhado" + "message": "Alias de encaminhamento de e-mail" }, "forwardedEmailDesc": { - "message": "Gere um alias de e-mail com um serviço de encaminhamento externo." + "message": "Gere um alias de e-mail com um serviço externo de encaminhamento." }, "forwarderDomainName": { "message": "Domínio de e-mail", @@ -3382,7 +3391,7 @@ "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { - "message": "Erro $SERVICENAME$: $ERRORMESSAGE$", + "message": "Erro do $SERVICENAME$: $ERRORMESSAGE$", "description": "Reports an error returned by a forwarding service to the user.", "placeholders": { "servicename": { @@ -3410,7 +3419,7 @@ } }, "forwaderInvalidToken": { - "message": "Token de API $SERVICENAME$ inválido", + "message": "Token de API do $SERVICENAME$ inválido", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -3420,7 +3429,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Token de API $SERVICENAME$ inválido: $ERRORMESSAGE$", + "message": "Token de API da $SERVICENAME$ inválido: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3468,7 +3477,7 @@ } }, "forwarderNoDomain": { - "message": "Domínio $SERVICENAME$ inválido.", + "message": "Domínio inválido do $SERVICENAME$.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -3478,7 +3487,7 @@ } }, "forwarderNoUrl": { - "message": "URL $SERVICENAME$ inválida.", + "message": "URL inválido do $SERVICENAME$.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -3488,7 +3497,7 @@ } }, "forwarderUnknownError": { - "message": "Ocorreu um erro $SERVICENAME$ desconhecido.", + "message": "Ocorreu um erro desconhecido do $SERVICENAME$.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -3518,10 +3527,10 @@ "message": "Chave da API" }, "ssoKeyConnectorError": { - "message": "Erro do conector de chave: certifique-se de que o conector de chave está disponível e funcionando corretamente." + "message": "Erro de Key Connector: certifique-se de que a Key Connector está disponível e funcionando corretamente." }, "premiumSubcriptionRequired": { - "message": "Assinatura Premium necessária" + "message": "Plano Premium necessário" }, "organizationIsDisabled": { "message": "Organização suspensa." @@ -3530,7 +3539,7 @@ "message": "Itens em organizações suspensas não podem ser acessados. Entre em contato com o proprietário da sua Organização para obter assistência." }, "loggingInTo": { - "message": "Entrando em $DOMAIN$", + "message": "Conectando-se a $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -3548,7 +3557,7 @@ "message": "Terceiros" }, "thirdPartyServerMessage": { - "message": "Conectado à implementação de servidores terceiros, $SERVERNAME$. Verifique bugs usando o servidor oficial ou reporte-os ao servidor de terceiros.", + "message": "Conectado à uma implementação de terceiros do servidor, $SERVERNAME$. Verifique bugs usando o servidor oficial ou reporte-os ao servidor de terceiros.", "placeholders": { "servername": { "content": "$1", @@ -3566,7 +3575,7 @@ } }, "loginWithMasterPassword": { - "message": "Entrar com a senha principal" + "message": "Conectar-se com senha principal" }, "newAroundHere": { "message": "Novo por aqui?" @@ -3575,7 +3584,7 @@ "message": "Lembrar e-mail" }, "loginWithDevice": { - "message": "Entrar com dispositivo" + "message": "Conectar-se com dispositivo" }, "fingerprintPhraseHeader": { "message": "Frase biométrica" @@ -3630,7 +3639,7 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente entrar com o dispositivo novamente." + "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente se conectar com o dispositivo novamente." }, "device": { "message": "Dispositivo" @@ -3705,7 +3714,7 @@ "message": "Atalho de teclado para preenchimento automático" }, "autofillLoginShortcutNotSet": { - "message": "O atalho do preenchimento automático não está definido. Altere isso nas configurações do navegador." + "message": "O atalho do preenchimento automático não está configurado. Altere isso nas configurações do navegador." }, "autofillLoginShortcutText": { "message": "O atalho de preenchimento automático é $COMMAND$. Gerencie todos os atalhos nas configurações do navegador.", @@ -3844,10 +3853,10 @@ "message": "Não é possível concluir a autenticação" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "Você precisa entrar com um dispositivo confiável ou solicitar ao administrador que lhe atribua uma senha." + "message": "Você precisa se conectar com um dispositivo confiado ou solicitar ao administrador que lhe atribua uma senha." }, "ssoIdentifierRequired": { - "message": "Identificador de SSO da organização é necessário." + "message": "O identificador de SSO da organização é necessário." }, "creatingAccountOn": { "message": "Criando conta em" @@ -3865,7 +3874,7 @@ "message": "Nenhum e-mail?" }, "goBack": { - "message": "Voltar" + "message": "Volte" }, "toEditYourEmailAddress": { "message": "para editar o seu endereço de e-mail." @@ -3902,7 +3911,7 @@ "message": "E-mail do usuário ausente" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "E-mail de usuário ativo não encontrado. Desconectando." + "message": "E-mail do usuário ativo não encontrado. Desconectando você." }, "deviceTrusted": { "message": "Dispositivo confiado" @@ -3920,13 +3929,13 @@ "message": "Organização não foi confiada" }, "emergencyAccessTrustWarning": { - "message": "Para a segurança da sua conta, apenas confirme se você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida em sua conta" + "message": "Para a segurança da sua conta, apenas confirme que você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida na conta deles" }, "orgTrustWarning": { - "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem uma recuperação de conta ativa e a frase biométrica exibida abaixo corresponde com a da organização." + "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem a recuperação de conta ativa, e a frase biométrica exibida abaixo corresponde com a da organização." }, "orgTrustWarning1": { - "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A inscrição permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a impressão digital da organização." + "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A inscrição permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a da organização." }, "trustUser": { "message": "Confiar no usuário" @@ -3946,7 +3955,7 @@ "message": "obrigatório" }, "search": { - "message": "Pesquisar" + "message": "Buscar" }, "inputMinLength": { "message": "A entrada deve ter pelo menos $COUNT$ caracteres.", @@ -3994,7 +4003,7 @@ } }, "multipleInputEmails": { - "message": "Um ou mais e-mails são inválidos" + "message": "1 ou mais e-mails são inválidos" }, "inputTrimValidator": { "message": "A entrada não pode conter somente espaços em branco.", @@ -4013,7 +4022,7 @@ } }, "singleFieldNeedsAttention": { - "message": "Um campo precisa da sua atenção." + "message": "1 campo precisa de sua atenção." }, "multipleFieldsNeedAttention": { "message": "$COUNT$ campos precisam da sua atenção.", @@ -4056,7 +4065,7 @@ "description": "Toggling an expand/collapse state." }, "aliasDomain": { - "message": "Alias do domínio" + "message": "Domínio de alias" }, "autofillOnPageLoadSetToDefault": { "message": "O preenchimento automático ao carregar a página está usando a configuração padrão.", @@ -4102,7 +4111,7 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Desbloqueie sua conta, abre em uma nova janela", + "message": "Desbloquear sua conta, abre em uma nova janela", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { @@ -4130,7 +4139,7 @@ "description": "Button text to display in overlay when there are no matching items" }, "addNewVaultItem": { - "message": "Adicionar novo item do cofre", + "message": "Adicionar novo item no cofre", "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { @@ -4146,7 +4155,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Adicione um novo item de cartão no cofre, abre em uma nova janela", + "message": "Adicionar um novo item de cartão no cofre, abre em uma nova janela", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -4199,10 +4208,10 @@ "message": "Tentar novamente" }, "verificationRequiredForActionSetPinToContinue": { - "message": "Verificação necessária para esta ação. Defina um PIN para continuar." + "message": "Verificação necessária para esta ação. Configure um PIN para continuar." }, "setPin": { - "message": "Definir PIN" + "message": "Configurar PIN" }, "verifyWithBiometrics": { "message": "Verificar com biometria" @@ -4211,13 +4220,13 @@ "message": "Aguardando confirmação" }, "couldNotCompleteBiometrics": { - "message": "Não foi possível completar a biometria." + "message": "Não foi possível concluir a biometria." }, "needADifferentMethod": { "message": "Precisa de um método diferente?" }, "useMasterPassword": { - "message": "Usar a senha principal" + "message": "Usar senha principal" }, "usePin": { "message": "Usar PIN" @@ -4250,10 +4259,10 @@ "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, "popoutExtension": { - "message": "Mostrar extensão" + "message": "Criar janela da extensão" }, "launchDuo": { - "message": "Abrir o Duo" + "message": "Abrir Duo" }, "importFormatError": { "message": "Os dados não estão formatados corretamente. Verifique o seu arquivo de importação e tente novamente." @@ -4277,13 +4286,13 @@ "message": "Selecione uma pasta" }, "selectImportCollection": { - "message": "Selecione uma coleção" + "message": "Selecione um conjunto" }, "importTargetHintCollection": { - "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma coleção" + "message": "Selecione esta opção caso queira importar os conteúdos do arquivo para um conjunto" }, "importTargetHintFolder": { - "message": "Selecione esta opção caso queira importar os conteúdos de arquivos para uma pasta" + "message": "Selecione esta opção caso queira importar os conteúdos do arquivo para uma pasta" }, "importUnassignedItemsError": { "message": "Arquivo contém itens não atribuídos." @@ -4295,7 +4304,7 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Escolher arquivo" + "message": "Selecionar arquivo" }, "noFileChosen": { "message": "Nenhum arquivo escolhido" @@ -4341,7 +4350,7 @@ "message": "A chave de acesso não será copiada para o item clonado. Deseja continuar clonando este item?" }, "logInWithPasskeyQuestion": { - "message": "Entrar com chave de acesso?" + "message": "Conectar-se com chave de acesso?" }, "passkeyAlreadyExists": { "message": "Uma chave de acesso já existe para este aplicativo." @@ -4356,7 +4365,7 @@ "message": "Sem credenciais correspondentes para este site" }, "searchSavePasskeyNewLogin": { - "message": "Salvar ou pesquisar chave de acesso como uma nova credencial" + "message": "Buscar ou salvar chave de acesso como nova credencial" }, "confirm": { "message": "Confirmar" @@ -4365,19 +4374,19 @@ "message": "Salvar chave de acesso" }, "savePasskeyNewLogin": { - "message": "Salvar chave de acesso como uma nova credencial" + "message": "Salvar chave de acesso como nova credencial" }, "chooseCipherForPasskeySave": { "message": "Escolha uma credencial para salvar essa chave de acesso" }, "chooseCipherForPasskeyAuth": { - "message": "Escolha uma chave para conectar-se" + "message": "Escolha uma chave de acesso para conectar-se" }, "passkeyItem": { "message": "Item de chave de acesso" }, "overwritePasskey": { - "message": "Sobrescrever chave de acesso?" + "message": "Substituir chave de acesso?" }, "overwritePasskeyAlert": { "message": "Este item já contém uma chave de acesso. Tem certeza que deseja substituir a atual?" @@ -4419,7 +4428,7 @@ "message": "Importando sua conta..." }, "lastPassMFARequired": { - "message": "Requer autenticação multifatorial do LastPass" + "message": "Autenticação multifatorial do LastPass é necessária" }, "lastPassMFADesc": { "message": "Digite sua senha única do app autenticador" @@ -4431,7 +4440,7 @@ "message": "Código" }, "lastPassMasterPassword": { - "message": "Senha principal do LastPass" + "message": "Senha mestra do LastPass" }, "lastPassAuthRequired": { "message": "Autenticação do LastPass necessária" @@ -4440,7 +4449,7 @@ "message": "Aguardando autenticação do SSO" }, "awaitingSSODesc": { - "message": "Continue autenticando-se usando as credenciais da sua empresa." + "message": "Continue conectando-se usando as credenciais da sua empresa." }, "seeDetailedInstructions": { "message": "Veja instruções detalhadas no nosso site de ajuda em", @@ -4456,7 +4465,7 @@ "message": "Tente novamente ou procure um e-mail do LastPass para verificar que é você." }, "collection": { - "message": "Coleção" + "message": "Conjunto" }, "lastPassYubikeyDesc": { "message": "Insira a YubiKey associada com a sua conta do LastPass na porta USB do seu computador, e depois toque no botão dela." @@ -4465,10 +4474,10 @@ "message": "Trocar de conta" }, "switchAccounts": { - "message": "Alternar conta" + "message": "Trocar de conta" }, "switchToAccount": { - "message": "Mudar para conta" + "message": "Trocar para a conta" }, "activeAccount": { "message": "Conta ativa" @@ -4480,7 +4489,7 @@ "message": "Contas disponíveis" }, "accountLimitReached": { - "message": "Limite de contas atingido. Saia de uma conta para adicionar outra." + "message": "Limite de contas atingido. Desconecte uma conta para adicionar outra." }, "active": { "message": "ativo" @@ -4498,7 +4507,7 @@ "message": "hospedado em" }, "useDeviceOrHardwareKey": { - "message": "Use o seu dispositivo ou chave de hardware" + "message": "Use a sua chave de dispositivo ou hardware" }, "justOnce": { "message": "Somente uma vez" @@ -4532,7 +4541,7 @@ "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "Mais sobre detecção de correspondências", + "message": "Mais sobre a detecção de correspondência", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { @@ -4544,7 +4553,7 @@ "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Continuar para o Centro de Ajuda?", + "message": "Continuar no Centro de Ajuda?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { @@ -4552,7 +4561,7 @@ "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": "Você pode ver e definir atalhos de extensão nas configurações do seu navegador.", + "message": "Você pode ver e configurar atalhos de extensão nas configurações do seu navegador.", "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": { @@ -4560,7 +4569,7 @@ "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "Você pode ver e definir atalhos de extensão nas configurações do seu navegador.", + "message": "Você pode ver e configurar atalhos de extensão nas configurações do seu navegador.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { @@ -4576,11 +4585,11 @@ "description": "Label for the setting that allows overriding the default browser autofill settings" }, "privacyPermissionAdditionNotGrantedTitle": { - "message": "Não é possível definir o Bitwarden como o gerenciador de senhas padrão", + "message": "Não é possível configurar o Bitwarden como o gerenciador de senhas padrão", "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "privacyPermissionAdditionNotGrantedDescription": { - "message": "Você deve conceder permissões de privacidade do navegador ao Bitwarden para defini-lo como o gerenciador de senhas padrão.", + "message": "Você deve conceder permissões de privacidade do navegador ao Bitwarden para configurá-lo como o gerenciador de senhas padrão.", "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "makeDefault": { @@ -4623,16 +4632,16 @@ "message": "Itens sugeridos" }, "autofillSuggestionsTip": { - "message": "Salvar um item de credencial para este site para o preenchimento automático" + "message": "Salve um item de credencial para este site para preencher automaticamente" }, "yourVaultIsEmpty": { "message": "Seu cofre está vazio" }, "noItemsMatchSearch": { - "message": "Nenhum item corresponde à sua pesquisa" + "message": "Nenhum item corresponde à sua busca" }, "clearFiltersOrTryAnother": { - "message": "Limpe os filtros ou tente outro termo de pesquisa" + "message": "Limpe os filtros ou tente outro termo de busca" }, "copyInfoTitle": { "message": "Copiar informações - $ITEMNAME$", @@ -4675,7 +4684,7 @@ } }, "viewItemTitle": { - "message": "Visualizar item - $ITEMNAME$", + "message": "Ver item - $ITEMNAME$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4685,7 +4694,7 @@ } }, "viewItemTitleWithField": { - "message": "Visualizar item - $ITEMNAME$ - $FIELD$", + "message": "Ver item - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4740,7 +4749,7 @@ "message": "Não há valores para copiar" }, "assignToCollections": { - "message": "Atribuir à coleções" + "message": "Atribuir a conjuntos" }, "copyEmail": { "message": "Copiar e-mail" @@ -4764,13 +4773,13 @@ "message": "Aparência" }, "errorAssigningTargetCollection": { - "message": "Erro ao atribuir coleção de destino." + "message": "Erro ao atribuir conjunto de destino." }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir pasta de destino." }, "viewItemsIn": { - "message": "Visualizar itens em $NAME$", + "message": "Ver itens em $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -4873,10 +4882,10 @@ "message": "Baixar o Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Baixe o Bitwarden em todos os dispositivos" + "message": "Baixar o Bitwarden em tudo" }, "getTheMobileApp": { - "message": "Baixar o aplicativo para dispositivos móveis" + "message": "Baixe o aplicativo para dispositivos móveis" }, "getTheMobileAppDesc": { "message": "Acesse as suas senhas em qualquer lugar com o aplicativo móvel do Bitwarden." @@ -4885,7 +4894,7 @@ "message": "Baixe o aplicativo para computador" }, "getTheDesktopAppDesc": { - "message": "Acesse o seu cofre sem um navegador e, em seguida, configure o desbloqueio com biometria para facilitar o desbloqueio tanto no aplicativo de computador quanto na extensão do navegador." + "message": "Acesse o seu cofre sem um navegador, configure o desbloqueio com biometria para facilitar o desbloqueio tanto no aplicativo de computador quanto na extensão do navegador." }, "downloadFromBitwardenNow": { "message": "Baixar em bitwarden.com agora" @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Desbloqueie relatórios, acesso de emergência, e mais recursos de segurança com o Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Organizações gratuitas não podem usar anexos" }, @@ -5056,17 +5068,17 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Entrar com chave de acesso", + "message": "Conectar-se com chave de acesso", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { "message": "Atribuir" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Apenas membros da organização com acesso a essas coleções poderão ver o item." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver o item." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Apenas membros da organização com acesso à essas coleções poderão ver os itens." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver os itens." }, "bulkCollectionAssignmentWarning": { "message": "Você selecionou $TOTAL_COUNT$ itens. Você não pode atualizar $READONLY_COUNT$ destes itens porque você não tem permissão de edição.", @@ -5093,7 +5105,7 @@ "message": "Rótulo do campo" }, "textHelpText": { - "message": "Utilize campos de texto para dados como questões de segurança" + "message": "Use campos de texto para dados como questões de segurança" }, "hiddenHelpText": { "message": "Use campos ocultos para dados confidenciais como uma senha" @@ -5138,7 +5150,7 @@ } }, "reorderToggleButton": { - "message": "Reordene $LABEL$. Use a tecla de seta para mover o item para cima ou para baixo.", + "message": "Reordenar $LABEL$. Use a tecla de seta para mover o item para cima ou para baixo.", "placeholders": { "label": { "content": "$1", @@ -5147,7 +5159,7 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorganize a URI do site. Use as setas para mover o item para cima ou para baixo." + "message": "Reordenar a URI do site. Use as setas para mover o item para cima ou para baixo." }, "reorderFieldUp": { "message": "$LABEL$ movido para cima, posição $INDEX$ de $LENGTH$", @@ -5167,13 +5179,13 @@ } }, "selectCollectionsToAssign": { - "message": "Selecione as coleções para atribuir" + "message": "Selecione conjuntos a atribuir" }, "personalItemTransferWarningSingular": { - "message": "1 item será transferido permanentemente para a organização selecionada. Você não irá mais ser dono deste item." + "message": "1 item será transferido permanentemente para a organização selecionada. Você não irá mais ser o proprietário deste item." }, "personalItemsTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para a organização selecionada. Você não irá mais ser dono desses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para a organização selecionada. Você não irá mais ser o proprietário desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5182,7 +5194,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item será transferido permanentemente para $ORG$. Você não irá mais ser dono deste item.", + "message": "1 item será transferido permanentemente para $ORG$. Você não irá mais ser o proprietário deste item.", "placeholders": { "org": { "content": "$1", @@ -5191,7 +5203,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para $ORG$. Você não irá mais ser dono desses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para $ORG$. Você não irá mais ser o proprietário desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5204,7 +5216,7 @@ } }, "successfullyAssignedCollections": { - "message": "Coleções atribuídas com sucesso" + "message": "Conjuntos atribuídos com sucesso" }, "nothingSelected": { "message": "Você não selecionou nada." @@ -5257,7 +5269,7 @@ "message": "Ações da conta" }, "showNumberOfAutofillSuggestions": { - "message": "Mostrar o número de sugestões de preenchimento automático de login no ícone da extensão" + "message": "Mostrar número de sugestões de preenchimento automático de credenciais no ícone da extensão" }, "accountAccessRequested": { "message": "Acesso à conta solicitado" @@ -5272,7 +5284,7 @@ } }, "showQuickCopyActions": { - "message": "Mostrar a opção de cópia rápida no Cofre" + "message": "Mostrar opções de cópia rápida no Cofre" }, "systemDefault": { "message": "Padrão do sistema" @@ -5347,10 +5359,10 @@ "message": "O desbloqueio por biometria está indisponível no momento." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." + "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos do sistema." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos de sistema." + "message": "O desbloqueio por biometria está indisponível devido a algum erro na configuração dos arquivos do sistema." }, "biometricsStatusHelptextDesktopDisconnected": { "message": "O desbloqueio por biometria está indisponível porque o aplicativo de computador não está aberto." @@ -5371,23 +5383,23 @@ "message": "Desbloqueie seu cofre em segundos" }, "unlockVaultDesc": { - "message": "Você pode personalizar suas configurações de desbloqueio e tempo limite para acessar mais rapidamente seu cofre." + "message": "Você pode personalizar suas configurações de desbloqueio e tempo limite para acessar seu cofre mais rapidamente." }, "unlockPinSet": { - "message": "Desbloqueio com PIN definido" + "message": "PIN de desbloqueio configurado" }, "unlockWithBiometricSet": { - "message": "Desbloqueio com biometria definido" + "message": "Desbloqueio com biometria configurado" }, "authenticating": { "message": "Autenticando" }, "fillGeneratedPassword": { - "message": "Preencher a senha gerada", + "message": "Preencher senha gerada", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Senha regenerada", + "message": "Senha regerada", "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { @@ -5431,11 +5443,11 @@ "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { - "message": "E Comercial", + "message": "E", "description": "Represents the & key in screen reader content as a readable word" }, "asteriskCharacterDescriptor": { - "message": "Asterísco", + "message": "Asterisco", "description": "Represents the * key in screen reader content as a readable word" }, "parenLeftCharacterDescriptor": { @@ -5563,7 +5575,7 @@ "message": "Digite a senha da chave SSH." }, "enterSshKeyPassword": { - "message": "Digite a senha" + "message": "Digitar senha" }, "invalidSshKey": { "message": "A chave SSH é inválida" @@ -5578,7 +5590,7 @@ "message": "Chave SSH importada com sucesso" }, "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", + "message": "Você não pode remover conjuntos com permissões de Apenas ver: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -5590,7 +5602,7 @@ "message": "Atualize seu aplicativo de computador" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "Para usar o desbloqueio biométrica, atualize seu aplicativo de computador ou desative o desbloqueio biométrico nas configurações do desktop." + "message": "Para usar o desbloqueio biométrico, atualize seu aplicativo de computador ou desative o desbloqueio biométrico nas configurações do desktop." }, "changeAtRiskPassword": { "message": "Alterar senhas em risco" @@ -5620,7 +5632,7 @@ "message": "Autenticação rápida e fácil" }, "quickLoginBody": { - "message": "Configure o desbloqueio por biometria e o preenchimento automático para acessar suas contas sem digitar uma única letra." + "message": "Configure o desbloqueio biométrico e o preenchimento automático para acessar suas contas sem digitar uma única letra." }, "secureUser": { "message": "Dê um up nas suas credenciais" @@ -5666,7 +5678,7 @@ "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name follows this." }, "phishingPageExplanation2": { - "message": ", uma lista de código aberto de sites de phishing conhecidos usados para roubar informações pessoais e sensíveis.", + "message": ", uma lista de código aberto de sites de phishing conhecidos usados por roubar informações pessoais e sensíveis.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence. A proper name precedes this." }, "phishingPageLearnMore": { @@ -5682,16 +5694,16 @@ } }, "hasItemsVaultNudgeBodyOne": { - "message": "Preencher itens automaticamente para a página atual" + "message": "Preenche automaticamente itens para a página atual" }, "hasItemsVaultNudgeBodyTwo": { "message": "Favorite itens para acesso rápido" }, "hasItemsVaultNudgeBodyThree": { - "message": "Pesquise seu cofre por outra coisa" + "message": "Busque no cofre por outra coisa" }, "newLoginNudgeTitle": { - "message": "Seja mais rápido com o preenchimento automático" + "message": "Economize tempo com o preenchimento automático" }, "newLoginNudgeBodyOne": { "message": "Inclua um", @@ -5760,10 +5772,10 @@ "message": "Sobre esta configuração" }, "permitCipherDetailsDescription": { - "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de mudança de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." + "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de alteração de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." }, "noPermissionsViewPage": { - "message": "Você não tem permissão para visualizar esta página. Tente entrar com uma conta diferente." + "message": "Você não tem permissão para ver esta página. Tente se conectar com uma conta diferente." }, "wasmNotSupported": { "message": "O WebAssembly não é suportado no seu navegador ou não está ativado. O WebAssembly é necessário para utilizar o aplicativo do Bitwarden.", @@ -5783,7 +5795,7 @@ "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "confirmKeyConnectorDomain": { - "message": "Confirmar domínio do Conector de Chave" + "message": "Confirmar domínio do Key Connector" }, "atRiskLoginsSecured": { "message": "Ótimo trabalho protegendo suas credenciais em risco!" @@ -5801,7 +5813,7 @@ "message": "Acesso de emergência" }, "breachMonitoring": { - "message": "Monitoramento de brechas" + "message": "Monitoramento de vazamentos" }, "andMoreFeatures": { "message": "E mais!" @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Faça upgrade para o Premium" }, - "upgradeCompleteSecurity": { - "message": "Faça upgrade para segurança completa" + "unlockAdvancedSecurity": { + "message": "Desbloqueie recursos avançados de segurança" }, - "premiumGivesMoreTools": { - "message": "O Premium te oferece mais ferramentas para se permanecer seguro, trabalhar eficientemente, e manter o controle." + "unlockAdvancedSecurityDesc": { + "message": "Um plano Premium te dá mais ferramentas para se manter seguro e em controle" }, "explorePremium": { "message": "Explorar o Premium" diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 4fd291e5c89..6b8568ddb1b 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Os itens arquivados são excluídos dos resultados gerais da pesquisa e das sugestões de preenchimento automático. Tem a certeza de que pretende arquivar este item?" }, + "upgradeToUseArchive": { + "message": "É necessária uma subscrição Premium para utilizar o Arquivo." + }, "edit": { "message": "Editar" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Ver tudo" }, + "showAll": { + "message": "Mostrar tudo" + }, "viewLess": { "message": "Ver menos" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Ano de validade" }, + "monthly": { + "message": "mês" + }, "expiration": { "message": "Prazo de validade" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Desbloqueie relatórios, acesso de emergência e outras funcionalidades de segurança com o Premium." + }, "freeOrgsCannotUseAttachments": { "message": "As organizações gratuitas não podem utilizar anexos" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Atualizar para o Premium" }, - "upgradeCompleteSecurity": { - "message": "Atualize para obter segurança total" + "unlockAdvancedSecurity": { + "message": "Desbloqueie funcionalidades de segurança avançadas" }, - "premiumGivesMoreTools": { - "message": "O Premium oferece mais ferramentas para manter a segurança, trabalhar com eficiência e manter o controlo." + "unlockAdvancedSecurityDesc": { + "message": "Uma subscrição Premium dá-lhe ferramentas adicionais para reforçar a sua segurança e manter o controlo" }, "explorePremium": { "message": "Explorar o Premium" diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 66a5b9d796b..db7a1b8c657 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Editare" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Anul expirării" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expirare" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 1f3d7c7234f..0535027daa9 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Архивированные элементы исключены из общих результатов поиска и предложений автозаполнения. Вы уверены, что хотите архивировать этот элемент?" }, + "upgradeToUseArchive": { + "message": "Для использования архива требуется премиум-статус." + }, "edit": { "message": "Изменить" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Посмотреть все" }, + "showAll": { + "message": "Показать все" + }, "viewLess": { "message": "Свернуть" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Год" }, + "monthly": { + "message": "месяц" + }, "expiration": { "message": "Срок действия" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Премиум" }, + "unlockFeaturesWithPremium": { + "message": "Разблокируйте отчеты, экстренный доступ и другие функции безопасности с помощью Премиум." + }, "freeOrgsCannotUseAttachments": { "message": "Бесплатные организации не могут использовать вложения" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Обновить до Премиум" }, - "upgradeCompleteSecurity": { - "message": "Перейти для полной защищенности" + "unlockAdvancedSecurity": { + "message": "Разблокировать дополнительные функции безопасности" }, - "premiumGivesMoreTools": { - "message": "Премиум предоставит вам больше инструментов для обеспечения безопасности, эффективной работы и контроля над ситуацией." + "unlockAdvancedSecurityDesc": { + "message": "Премиум-подписка дает вам больше возможностей для обеспечения безопасности и контроля" }, "explorePremium": { "message": "Познакомиться с Премиум" diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 61dc029754a..bb46b283322 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "සංස්කරණය" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "කල් ඉකුත්වන වසර" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "කල් ඉකුත්" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 865e832fda3..283442d95da 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archivované položky sú vylúčené zo všeobecného vyhľadávania a z návrhov automatického vypĺňania. Naozaj chcete archivovať túto položku?" }, + "upgradeToUseArchive": { + "message": "Na použitie archívu je potrebné prémiové členstvo." + }, "edit": { "message": "Upraviť" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Zobraziť všetky" }, + "showAll": { + "message": "Zobraziť všetko" + }, "viewLess": { "message": "Zobraziť menej" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Rok exspirácie" }, + "monthly": { + "message": "mesačne" + }, "expiration": { "message": "Expirácia" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Prémium" }, + "unlockFeaturesWithPremium": { + "message": "Odomknite reportovanie, núdzový prístup a ďalšie bezpečnostné funkcie s predplatným Prémium." + }, "freeOrgsCannotUseAttachments": { "message": "Bezplatné organizácie nemôžu používať prílohy" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgradovať na Prémium" }, - "upgradeCompleteSecurity": { - "message": "Upgradovať pre úplné zabezpečenie" + "unlockAdvancedSecurity": { + "message": "Odomknutie pokročilých funkcií zabezpečenia" }, - "premiumGivesMoreTools": { - "message": "Predplatné Prémium vám poskytuje viac nástrojov na zabezpečenie, efektívnu prácu a kontrolu." + "unlockAdvancedSecurityDesc": { + "message": "Predplatné Prémium vám poskytne viac nástrojov na zabezpečenie a kontrolu" }, "explorePremium": { "message": "Preskúmať Prémium" diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index ebb245290f9..2d20050d7f1 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Uredi" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Leto poteka" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Veljavna do" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index d54a6ba928f..0c7562987fc 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Архивиране ставке су искључене из општих резултата претраге и предлога за ауто попуњавање. Јесте ли сигурни да желите да архивирате ову ставку?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Уреди" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Прегледај све" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Година истека" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Истек" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Премијум" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Бесплатне организације не могу да користе прилоге" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Надоградите на Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 245692a27aa..2c364f20590 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Arkiverade objekt är exkluderade från allmänna sökresultat och förslag för autofyll. Är du säker på att du vill arkivera detta objekt?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Redigera" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Visa alla" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "Visa mindre" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Utgångsår" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Utgång" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Lås upp rapportering, nödåtkomst och fler säkerhetsfunktioner med Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Fria organisationer kan inte använda bilagor" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Uppgradera till Premium" }, - "upgradeCompleteSecurity": { - "message": "Uppgradera för fullständig säkerhet" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium ger dig fler verktyg för att hålla dig säker, arbeta effektivt och ha kontroll." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Utforska Premium" diff --git a/apps/browser/src/_locales/ta/messages.json b/apps/browser/src/_locales/ta/messages.json index a6e2ad0ee31..4d185501855 100644 --- a/apps/browser/src/_locales/ta/messages.json +++ b/apps/browser/src/_locales/ta/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "திருத்து" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "காலாவதி ஆண்டு" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "காலாவதி" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "பிரீமியம்" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "இலவச நிறுவனங்கள் இணைப்புகளைப் பயன்படுத்த முடியாது" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 7c4dbaf85dc..f829937ac51 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Edit" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Expiration" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index ff0c05a470a..ef6ba5b2077 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "แก้ไข" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "View all" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Expiration Year" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "วันหมดอายุ" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Free organizations cannot use attachments" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Upgrade to Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index b2bff83e8a9..e6004ef387f 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Arşivlenmiş kayıtlar genel arama sonuçları ve otomatik doldurma önerilerinden hariç tutulur. Bu kaydı arşivlemek istediğine emin misin?" }, + "upgradeToUseArchive": { + "message": "Arşivi kullanmak için premium üyelik gereklidir." + }, "edit": { "message": "Düzenle" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Tümünü göster" }, + "showAll": { + "message": "Tümünü göster" + }, "viewLess": { "message": "Daha az göster" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Son kullanma yılı" }, + "monthly": { + "message": "ay" + }, "expiration": { "message": "Son kullanma tarihi" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Ücretsiz kuruluşlar dosya eklerini kullanamaz" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Premium'a yükselt" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Gelişmiş güvenlik özelliklerinin kilidini açın" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "Premium abonelik size daha fazla güvenlik ve kontrol olanağı sunan ek araçlara erişmenizi sağlar" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index b104f845fa7..a1922a5abd8 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Архівовані записи виключаються з результатів звичайного пошуку та пропозицій автозаповнення. Ви дійсно хочете архівувати цей запис?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Змінити" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Переглянути все" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Рік завершення" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Термін дії" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Premium" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Організації без передплати не можуть використовувати вкладення" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Покращити до Premium" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 242b779ca26..415cf474af0 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "Các mục đã lưu trữ sẽ bị loại khỏi kết quả tìm kiếm chung và gợi ý tự động điền. Bạn có chắc chắn muốn lưu trữ mục này không?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "Sửa" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "Xem tất cả" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "View less" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "Năm hết hạn" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "Hết hạn" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "Cao cấp" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "Các tổ chức miễn phí không thể sử dụng tệp đính kèm" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "Nâng cấp lên gói Cao cấp" }, - "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "Premium gives you more tools to stay secure, work efficiently, and stay in control." + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "Explore Premium" diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index cf1664b6a6f..92bcb8cb90f 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -309,7 +309,7 @@ "message": "前往浏览器扩展商店吗?" }, "continueToBrowserExtensionStoreDesc": { - "message": "帮助别人了解 Bitwarden 是否适合他们。立即访问浏览器的扩展程序商店并留下评分。" + "message": "帮助别人了解 Bitwarden 是否适合他们。立即访问浏览器扩展商店并留下评分。" }, "changeMasterPasswordOnWebConfirmation": { "message": "您可以在 Bitwarden 网页 App 上更改您的主密码。" @@ -362,10 +362,10 @@ "message": "使用 Passwordless.dev 摆脱传统密码束缚,打造流畅且安全的登录体验。访问 bitwarden.com 网站了解更多信息。" }, "freeBitwardenFamilies": { - "message": "免费 Bitwarden 家庭" + "message": "免费的 Bitwarden 家庭版" }, "freeBitwardenFamiliesPageDesc": { - "message": "您有资格获得免费的 Bitwarden 家庭。立即在网页 App 中兑换此优惠。" + "message": "您有资格获得免费的 Bitwarden 家庭版。立即在网页 App 中兑换此优惠。" }, "version": { "message": "版本" @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "已归档的项目将被排除在一般搜索结果和自动填充建议之外。确定要归档此项目吗?" }, + "upgradeToUseArchive": { + "message": "需要高级会员才能使用归档。" + }, "edit": { "message": "编辑" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "查看全部" }, + "showAll": { + "message": "显示全部" + }, "viewLess": { "message": "查看更少" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "过期年份" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "有效期" }, @@ -3002,7 +3011,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { - "message": "弹出扩展?", + "message": "弹出扩展吗?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { @@ -4902,6 +4911,9 @@ "premium": { "message": "高级版" }, + "unlockFeaturesWithPremium": { + "message": "使用高级版解锁报告、紧急访问以及更多安全功能。" + }, "freeOrgsCannotUseAttachments": { "message": "免费组织无法使用附件" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "升级为高级版" }, - "upgradeCompleteSecurity": { - "message": "升级以获得全面的安全防护" + "unlockAdvancedSecurity": { + "message": "解锁高级安全功能" }, - "premiumGivesMoreTools": { - "message": "高级版为您提供更多工具,助您保障安全、高效工作并掌控一切。" + "unlockAdvancedSecurityDesc": { + "message": "高级版订阅为您提供更多工具,助您保持安全并掌控一切" }, "explorePremium": { "message": "探索高级版" diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 0ef20edce81..38fb50d6c8b 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -585,6 +585,9 @@ "archiveItemConfirmDesc": { "message": "封存的項目將不會出現在一般搜尋結果或自動填入建議中。確定要封存此項目嗎?" }, + "upgradeToUseArchive": { + "message": "A premium membership is required to use Archive." + }, "edit": { "message": "編輯" }, @@ -594,6 +597,9 @@ "viewAll": { "message": "檢視全部" }, + "showAll": { + "message": "Show all" + }, "viewLess": { "message": "顯示較少" }, @@ -1867,6 +1873,9 @@ "expirationYear": { "message": "逾期年份" }, + "monthly": { + "message": "month" + }, "expiration": { "message": "逾期" }, @@ -4902,6 +4911,9 @@ "premium": { "message": "進階版" }, + "unlockFeaturesWithPremium": { + "message": "Unlock reporting, emergency access, and more security features with Premium." + }, "freeOrgsCannotUseAttachments": { "message": "免費組織無法使用附檔" }, @@ -5812,11 +5824,11 @@ "upgradeToPremium": { "message": "升級到 Premium" }, - "upgradeCompleteSecurity": { - "message": "升級以獲得完整的安全防護" + "unlockAdvancedSecurity": { + "message": "Unlock advanced security features" }, - "premiumGivesMoreTools": { - "message": "進階版提供更多工具,協助您維持安全、高效工作並保持掌控。" + "unlockAdvancedSecurityDesc": { + "message": "A Premium subscription gives you more tools to stay secure and in control" }, "explorePremium": { "message": "探索進階版" diff --git a/apps/browser/store/locales/pt_BR/copy.resx b/apps/browser/store/locales/pt_BR/copy.resx index 96ae2332f53..09855fd5798 100644 --- a/apps/browser/store/locales/pt_BR/copy.resx +++ b/apps/browser/store/locales/pt_BR/copy.resx @@ -121,63 +121,63 @@ Bitwarden Gerenciador de Senhas - Em casa, no trabalho, ou em qualquer lugar, o Bitwarden protege facilmente todas as suas senhas, chaves de acesso e informações sensíveis. + Onde quer que você esteja, a Bitwarden protege facilmente todas as suas senhas, chaves de acesso e informações sensíveis. - Reconhecido como o melhor gerenciador de senhas por "PCMag", 'WIRED', 'The Verge', 'CNET', 'G2', entre outros! + Reconhecido como o melhor gerenciador de senhas por PCMag, WIRED, The Verge, CNET, G2, e outros! PROTEJA A SUA VIDA DIGITAL -Deixe a sua vida digital segura e se proteja contra violações de dados gerando e salvando senhas únicas e fortes para cada conta pessoal. Mantendo tudo isso em um cofre criptografado de ponta a ponta em que apenas você pode acessar. +Proteja a sua vida digital e proteja-se de vazamentos de dados gerando e salvando senhas únicas e seguras, para cada conta. Mantenha tudo em um cofre criptografado de ponta a ponta, que só você pode acessar. -ACESSE OS SEUS DADOS, EM QUALQUER LUGAR, HORA E DISPOSITIVO -Gerencie, armazene, proteja e compartilhe senhas facilmente entre dispositivos ilimitados e sem restrições. +ACESSE SEUS DADOS, DE QUALQUER LUGAR, QUALQUER HORA, EM QUALQUER DISPOSITIVO +Gerencie, armazene, proteja, e compartilhe senhas ilimitadas entre dispositivos ilimitados, sem restrições. Tudo de forma fácil. -TODOS DEVERIAM TEM FERRAMENTAS PARA SE PROTEGER ONLINE -Utilize Bitwarden de graça sem anúncios ou venda dos seus dados. A Bitwarden acredita que todos deveriam ter a opção de estar seguro online. Nossos planos Premium oferecem recursos mais avançados. +TODOS DEVERIAM TER AS FERRAMENTAS PARA SE PROTEGER ON-LINE +Utilize o Bitwarden de graça, sem anúncios, e sem venda de dados. O Bitwarden acredita que todos deveriam ter a possibilidade de se proteger on-line. O plano Premium oferece acesso a recursos avançados. -EMPODERE O SEUS TIMES COM BITWARDEN -Os planos para times e empresas vêm com recursos profissionais para negócios. Alguns exemplos incluem integração SSO, auto-hospedagem, integração de diretório e provisionamento SCIM, políticas globais, acesso API, registro de eventos e mais. +EMPODERE SUAS EQUIPES COM O BITWARDEN +Os planos para Equipes e o Empresarial vêm com recursos empresariais profisionais. Alguns exemplos incluem integração com SSO, auto-hospedagem, integração de diretório e provisionamento de SCIM, políticas globais, acesso à API, registros de eventos, e mais. -Utilize o Bitwarden para proteger os seus colaboradores e compartilhar informações sensíveis com seus colegas. +Use o Bitwarden para protejer a sua força de trabalho e compartilhe informações sensíveis com colegas. -Mais razões para escolher Bitwarden: +Mais motivos para escolher o Bitwarden: -Criptografia mundialmente reconhecida -Suas senhas são protegidas com avançada criptografia ponta a ponta (AES-256, salted hashing, e PBKDF2 SHA-256) para que os seus dados estejam seguros e privados. +Criptografia reconhecida mundialmente +As senhas são protegidas com criptografia avançada de ponta a ponta (AES de 256 bits, hashing com salting, e PBKDF2 SHA-256) para que seus dados continuem seguros e privados. -Auditoria de Terceiros -A Bitwarden regularmente conduz auditorias de terceiros com notáveis empresas de segurança. Essas auditorias anuais incluem qualificação do código fonte e testes de invasão contra os IPs da Bitwarden, servidores e aplicações web. +Auditoria por terceiros +O Bitwarden conduz auditorias abrangentes de terceiros periodicamente com firmas de segurança nótaveis. Essas auditorias anuais incluem análise do código-fonte e teste de penetração entre IPs, servidores, e aplicativos web do Bitwarden. -2FA Avançado -Proteja o seu login com um autenticador de dois fatores, códigos de email ou credenciais FIDO2 WebAuthn como chave de segurança por hardware ou chave de acesso. +Autenticação de duas etapas avançada +Proteja sua autenticação com um autenticador de terceiros, códigos enviados por e-mail, ou credenciais de WebAuthn FIDO2, como uma chave de segurança física ou uma chave de acesso. -Envio Bitwarden -Transmita dados diretamente para outras pessoas enquanto mantém a segurança da criptografia ponta a ponta para limitar sua exposição. +Bitwarden Send +Transmita dados diretamente para outros enquanto mantém a segurança da criptografia de ponta a ponta, limitando exposição. -Gerador integrado -Crie diferentes senhas fortes e complexas e nomes de usuário únicos para cada site que visitar. Integre com provedores de email para privacidade adicional. +Gerador embutido +Crie senhas longas, complexas, e distintas, e nomes de usuário únicos para cada site que visita. Integre com provedores de alias de email para privacidade adicional. -Tradutores globais -As traduções da Bitwarden estão disponíveis para mais de 60 línguas, traduzidas pela comunidade global através do Crowdin. +Traduções globais +O Bitwarden tem traduções para mais de 60 idiomas, traduzidos pela comunidade global, pelo Crowdin. -Aplicações Multi-Plataforma -Proteja e compartilhe conteúdo confidencial dentro do Vault da Bitwarden de qualquer navegador, dispositivo móvel, desktop, entre outros. +Aplicativos multiplataforma +Proteja e compartilhe dados sensíveis dentro do seu cofre do Bitwarden de qualquer navegador, dispositivo móvel, sistema operacional de computador, e mais. -Bitwarden protege mais do que apenas senhas -Com nossas soluções em gerenciamento de credenciais criptografadas ponta a ponta, a Bitwarden empodera organizações para proteger qualquer informação, incluindo senhas de desenvolvedor e chaves de acesso. Visite Bitwarden.com para aprender mais sobre Bitwarden Secrets Manager e Bitwarden Passwordless.dev! +O Bitwarden protege mais do que só senhas +As soluções criptografadas de ponta a ponta de gerenciamento de credenciaisdo Bitwarden empoderam organizações a proteger tudo, incluindo segredos de desenvolvedor, e experiências com chaves de acesso. Visite bitwarden.com para aprender mais sobre o Bitwarden Gerenciador de Segredos e o Bitwarden Passworldless.dev! - Onde quer que você esteja, a Bitwarden protege facilmente todas as suas senha, chaves de acesso e informações sensíveis. + Onde quer que você esteja, a Bitwarden protege facilmente todas as suas senhas, chaves de acesso e informações sensíveis. - Sincronize e acesse o seu cofre através de múltiplos dispositivos + Sincronize e acesse o seu cofre entre vários dispositivos Gerencie todas as suas credenciais a partir de um cofre seguro - Autopreencha rapidamente as suas credenciais dentro de qualquer site que visitar + Preencha automaticamente as suas credenciais dentro de qualquer site que visitar O seu cofre é também acessível a partir do menu de contexto pelo clique no botão direito do mouse @@ -186,6 +186,6 @@ Com nossas soluções em gerenciamento de credenciais criptografadas ponta a pon Gera automaticamente senhas fortes, aleatórias e seguras - A sua informação é gerenciada com segurança utilizando encriptação AES-256 bits + A sua informação é gerenciada com segurança utilizando criptografia de AES de 256 bits From 3c660ea7d207158c8357b7dd98f0642e780276f7 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 06:43:35 +0100 Subject: [PATCH 10/37] Autosync the updated translations (#17711) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 34 +- apps/web/src/locales/ar/messages.json | 34 +- apps/web/src/locales/az/messages.json | 34 +- apps/web/src/locales/be/messages.json | 34 +- apps/web/src/locales/bg/messages.json | 42 +- apps/web/src/locales/bn/messages.json | 34 +- apps/web/src/locales/bs/messages.json | 34 +- apps/web/src/locales/ca/messages.json | 34 +- apps/web/src/locales/cs/messages.json | 34 +- apps/web/src/locales/cy/messages.json | 34 +- apps/web/src/locales/da/messages.json | 34 +- apps/web/src/locales/de/messages.json | 74 +- apps/web/src/locales/el/messages.json | 34 +- apps/web/src/locales/en_GB/messages.json | 34 +- apps/web/src/locales/en_IN/messages.json | 34 +- apps/web/src/locales/eo/messages.json | 34 +- apps/web/src/locales/es/messages.json | 34 +- apps/web/src/locales/et/messages.json | 34 +- apps/web/src/locales/eu/messages.json | 34 +- apps/web/src/locales/fa/messages.json | 134 +- apps/web/src/locales/fi/messages.json | 34 +- apps/web/src/locales/fil/messages.json | 34 +- apps/web/src/locales/fr/messages.json | 34 +- apps/web/src/locales/gl/messages.json | 34 +- apps/web/src/locales/he/messages.json | 34 +- apps/web/src/locales/hi/messages.json | 34 +- apps/web/src/locales/hr/messages.json | 122 +- apps/web/src/locales/hu/messages.json | 34 +- apps/web/src/locales/id/messages.json | 34 +- apps/web/src/locales/it/messages.json | 266 +- apps/web/src/locales/ja/messages.json | 34 +- apps/web/src/locales/ka/messages.json | 34 +- apps/web/src/locales/km/messages.json | 34 +- apps/web/src/locales/kn/messages.json | 34 +- apps/web/src/locales/ko/messages.json | 34 +- apps/web/src/locales/lv/messages.json | 50 +- apps/web/src/locales/ml/messages.json | 34 +- apps/web/src/locales/mr/messages.json | 34 +- apps/web/src/locales/my/messages.json | 34 +- apps/web/src/locales/nb/messages.json | 34 +- apps/web/src/locales/ne/messages.json | 34 +- apps/web/src/locales/nl/messages.json | 34 +- apps/web/src/locales/nn/messages.json | 34 +- apps/web/src/locales/or/messages.json | 34 +- apps/web/src/locales/pl/messages.json | 34 +- apps/web/src/locales/pt_BR/messages.json | 3060 +++++++++++----------- apps/web/src/locales/pt_PT/messages.json | 38 +- apps/web/src/locales/ro/messages.json | 34 +- apps/web/src/locales/ru/messages.json | 34 +- apps/web/src/locales/si/messages.json | 34 +- apps/web/src/locales/sk/messages.json | 34 +- apps/web/src/locales/sl/messages.json | 34 +- apps/web/src/locales/sr_CS/messages.json | 34 +- apps/web/src/locales/sr_CY/messages.json | 34 +- apps/web/src/locales/sv/messages.json | 34 +- apps/web/src/locales/ta/messages.json | 34 +- apps/web/src/locales/te/messages.json | 34 +- apps/web/src/locales/th/messages.json | 34 +- apps/web/src/locales/tr/messages.json | 34 +- apps/web/src/locales/uk/messages.json | 34 +- apps/web/src/locales/vi/messages.json | 34 +- apps/web/src/locales/zh_CN/messages.json | 104 +- apps/web/src/locales/zh_TW/messages.json | 46 +- 63 files changed, 3121 insertions(+), 2617 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 0aa86168472..0fc3ebe06d9 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 9b8dde78dd6..acd669d462e 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 5181906dacc..9fa7411f199 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -9820,6 +9820,14 @@ "message": "Çox bahadır", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "1 illik ödənişsiz" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Bitwarden brauzer uzantısı uğurla açıldı. Riskli parollarınıza nəzər sala bilərsiniz." }, - "openExtensionManuallyPart1": { - "message": "Bitwarden brauzer uzantısı açılarkən xəta ilə üzləşdik. Alət çubuğundan", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "Bitwarden ikonunu açın.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Abunəliyiniz tezliklə yenilənəcək. Kəsintisiz xidməti təmin etmək və yeniləməni $RENEWAL_DATE$ tarixindən əvvəl təsdiqləmək üçün $RESELLER$ ilə əlaqə saxlayın.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden uzantısı quraşdırıldı!" }, - "openTheBitwardenExtension": { - "message": "Bitwarden uzantısını aç" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Bitwarden uzantısı quraşdırılıb! Giriş etmək və avto-doldurmanı başlatmaq üçün uzantını aç." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Giriş etmək üçün uzantını aç və avto-doldurmağa başla." @@ -11687,6 +11684,14 @@ "message": "Öyrənmə Mərkəzi", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Kömək Mərkəzi", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Davam etmək istədiyinizə əminsiniz?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 59d5d49ab1d..20142bf95d1 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index eb926015996..3267ebc3385 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -5810,7 +5810,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Всички елементи ще се притежават от и съхраняват в организацията, което ще означава, че управлението, видимостта и докладите ще се извършват от организацията. Когато това и включено, всеки член ще може да съхранява елементите си в стандартна колекция. Научете повече относно управлението на ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -9820,6 +9820,14 @@ "message": "Твърде скъпо", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Превключване към безплатен план", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Превключване към безплатна организация", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Безплатно за 1 година" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Добавката за браузър на Биуторден се отвори. Сега може да прегледате паролите си в риск." }, - "openExtensionManuallyPart1": { - "message": "Добавката за браузър на Биуторден не успя да се отвори. Отворете я с иконката на Битуорден", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "от лентата с инструменти.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Вашият абонамент ще бъде подновен скоро. За да подсигурите, че услугата няма да има прекъсвания, свържете се с $RESELLER$ и потвърдете подновяването преди $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Добавката на Битуорден е инсталирана!" }, - "openTheBitwardenExtension": { - "message": "Отварете добавката на Битуорден" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Добавката на Битуорден е инсталирана! Отворете я, за да се впишете и да можете да се вписвате автоматично." + "bitwardenExtensionIsInstalled": { + "message": "Добавката на Битуорден е инсталирана!" }, "openExtensionToAutofill": { "message": "Отворете добавката, за да се впишете и да можете да използвате автоматичното попълване." @@ -11687,6 +11684,14 @@ "message": "Центъра за обучения", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Ако добавката на Битуорден не се е отворила, може да трябва да отворите Битуорден от иконката ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " в лентата с инструменти.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Помощния център", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12119,13 +12124,13 @@ "message": "Започнете безплатния пробен период на Семейния план" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Блокиране на създаването на акаунти за присвоени домейни" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Предотвратяване на създаването на потребителски акаунти извън Вашата организация чрез адреси на е-поща от присвоени домейни." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Трябва да има присвоен домейн преди активирането на тази политика." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Задайте метод за отключване, за да може да промените действието при изтичане на времето за достъп до трезора." @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Наистина ли искате да продължите?" + }, + "userVerificationFailed": { + "message": "Проверката на потребителя беше неуспешна." } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 300f0bcd8f3..f302bd08e24 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 3dc0ab7494c..dce29d875db 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 35db86e2b28..dc3f4994c67 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -9820,6 +9820,14 @@ "message": "Massa car", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratuït durant 1 any" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 5693a5fc824..b4016223c73 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -9820,6 +9820,14 @@ "message": "Příliš drahé", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Přepínání na bezplatný tarif", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Přepínání na bezplatnou organizaci", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Zdarma na 1 rok" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Rozšíření Bitwarden pro prohlížeč bylo úspěšně otevřeno. Nyní můžete zkontrolovat Vaše ohrožená hesla." }, - "openExtensionManuallyPart1": { - "message": "Měli jsme potíže s otevřením rozšíření Bitwarden pro pohlížeč. Klepněte na ikonu Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "na panelu nástrojů.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Vaše předplatné se brzy obnoví. Chcete-li zajistit nepřerušenou službu, kontaktujte $RESELLER$ pro potvrzení obnovení před $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Rozšíření Bitwarden nainstalováno!" }, - "openTheBitwardenExtension": { - "message": "Otevřít rozšíření Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Rozšíření Bitwarden je nainstalováno! Otevřete rozšíření pro přihlášení a začněte používat automatické vyplňování." + "bitwardenExtensionIsInstalled": { + "message": "Rozšíření Bitwarden je nainstalováno!" }, "openExtensionToAutofill": { "message": "Otevřete rozšíření pro příhlášení a spuštění automatického vyplňování." @@ -11687,6 +11684,14 @@ "message": "Centrum výuky", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Pokud není rozšíření otevřeno, možná budete muset otevřít Bitwarden z ikony ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " na panelu nástrojů.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Centrum nápovědy", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Opravdu chcete pokračovat?" + }, + "userVerificationFailed": { + "message": "Ověření uživatele se nezdařilo." } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 2b0222d7096..46876fa947c 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index dee490c39e9..0316c1d2f0c 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -9820,6 +9820,14 @@ "message": "For dyrt", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratis i 1 år" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Abonnementet fornyes snart. For at sikre uafbrudt tjeneste, kontakt $RESELLER$ inden $RENEWAL_DATE$ for at bekræfte fornyelsen.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 4a83f8becc8..4b623bf8170 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -94,7 +94,7 @@ "message": "Mitglieder Aufgaben zuweisen, um den Fortschritt zu überwachen" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Sobald du Anwendungen überprüft und als kritisch markiert hast, weist du deinen Mitgliedern Aufgaben zu, damit diese ihre Passwörter ändern." }, "sendReminders": { "message": "Erinnerungen senden" @@ -179,34 +179,34 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Keine Daten gefunden" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Importiere die Zugangsdaten deiner Organisation, um mit der Zugangsintelligenz zu beginnen. Sobald du dies getan hast, kannst du:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Anwendungen als kritisch markieren" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Dadurch kannst du Risiken für deine wichtigsten Anwendungen zuerst beseitigen." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Helfe Mitgliedern, ihre Sicherheit zu verbessern" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Weise gefährdeten Mitgliedern gezielte Sicherheitsaufgaben zu, um Zugangsdaten zu aktualisieren." }, "feature3Title": { "message": "Fortschritt überwachen" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Änderungen im Laufe der Zeit verfolgen, um Sicherheitsverbesserungen anzuzeigen." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Bericht generieren" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Du bist so weit, Berichte zu generieren. Sobald du sie generierst, kannst du folgendes tun:" }, "noCriticalApplicationsTitle": { "message": "Du hast keine Anwendung als kritisch markiert" @@ -266,13 +266,13 @@ "message": "Gefährdete Mitglieder" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Diese Mitglieder haben Zugriff auf sensible Einträge für kritische Anwendungen." }, "membersWithAtRiskPasswords": { "message": "Mitglieder mit gefährdeten Passwörtern" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Den Mitgliedern deiner Organisation wird die Aufgabe zugewiesen, sensible Passwörter zu ändern. Sie erhalten eine Benachrichtigung innerhalb ihrer Bitwarden Browser-Erweiterung." }, "membersAtRiskCount": { "message": "$COUNT$ gefährdete Mitglieder", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Diese Mitglieder melden sich bei kritischen Anwendungen mit schwachen, kompromittierten oder wiederverwendeten Passwörtern an." }, "atRiskMembersDescriptionNone": { "message": "Dies sind keine Mitglieder, die sich in Anwendungen mit schwachen, kompromittierten oder wiederverwendeten Passwörtern anmelden." @@ -386,13 +386,13 @@ "message": "Kritische Anwendungen priorisieren" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Wähle die für deine Organisation kritischsten Anwendungen aus. Danach kannst du Mitgliedern Sicherheitsaufgaben zuweisen, um Risiken zu beseitigen." }, "reviewNewApplications": { "message": "Neue Anwendungen überprüfen" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Überprüfe neue Anwendungen mit sensiblen Einträgen und kennzeichne diejenigen, die du genau überwachen möchtest, als kritisch. Anschließend kannst du Mitgliedern Sicherheitsaufgaben zuweisen, um Risiken zu beseitigen." }, "clickIconToMarkAppAsCritical": { "message": "Klicke auf das Sternsymbol, um eine App als kritisch zu markieren" @@ -5810,7 +5810,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Alle Einträge sind Eigentum der Organisation und werden dort gespeichert, was organisationsweite Kontrollen, Transparenz und Berichterstellung ermöglicht. Wenn diese Funktion aktiviert ist, steht jedem Mitglied eine Standard-Sammlung zur Speicherung von Einträgen zur Verfügung. Erfahre mehr über die Verwaltung des ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -9820,6 +9820,14 @@ "message": "Zu teuer", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Wechseln zum kostenlosen Tarif", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Wechseln zur kostenlosen Organisation", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Kostenlos für 1 Jahr" }, @@ -9851,7 +9859,7 @@ "message": "Aufgaben zuweisen" }, "assignSecurityTasksToMembers": { - "message": "Sende Benachrichtigungen, um Passwörter zu ändern" + "message": "Benachrichtigungen zum Ändern von Passwörtern senden" }, "assignToCollections": { "message": "Sammlungen zuweisen" @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Die Bitwarden Browser-Erweiterung wurde erfolgreich geöffnet. Du kannst jetzt deine gefährdeten Passwörter überprüfen." }, - "openExtensionManuallyPart1": { - "message": "Wir hatten Probleme beim Öffnen der Bitwarden-Browser-Erweiterung. Öffne das Bitwarden-Symbol", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "in der Symbolleiste.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Dein Abonnement wird bald verlängert. Um einen ununterbrochenen Betrieb zu gewährleisten, kontaktiere $RESELLER$ um deine Verlängerung vor dem $RENEWAL_DATE$ zu bestätigen.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden-Erweiterung installiert!" }, - "openTheBitwardenExtension": { - "message": "Die Bitwarden-Erweiterung öffnen" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Die Bitwarden-Erweiterung ist installiert! Öffne die Erweiterung, um dich anzumelden und das automatische Ausfüllen zu starten." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden-Erweiterung wurde installiert!" }, "openExtensionToAutofill": { "message": "Öffne die Erweiterung, um dich anzumelden und Auto-Ausfüllen zu nutzen." @@ -11687,6 +11684,14 @@ "message": "Lernzentrum", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Falls sich die Erweiterung nicht geöffnet hat, musst du möglicherweise Bitwarden über das Symbol ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " in der Symbolleiste öffnen.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Hilfezentrum", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12119,13 +12124,13 @@ "message": "Kostenlose Families-Testversion starten" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Erstellung von Konten für beanspruchte Domains blockieren" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Verhindere, dass Benutzer außerhalb deiner Organisation Konten mit E-Mail-Adressen aus beanspruchten Domains erstellen." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Vor der Aktivierung dieser Richtlinie muss eine Domain beansprucht werden." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Richte eine Entsperrmethode ein, um deine Aktion bei Tresor-Timeout zu ändern." @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Bist du sicher, dass du fortfahren möchtest?" + }, + "userVerificationFailed": { + "message": "Benutzerverifizierung fehlgeschlagen." } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 5e937df4a21..3a23bb286ea 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -9820,6 +9820,14 @@ "message": "Πολύ ακριβό", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Δωρεάν για 1 χρόνο" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 7e0f79f9a11..643601f54fe 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organisation", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Centre", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Centre", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 864f66ade8e..29271d771d2 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organisation", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Centre", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Centre", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 3ec660dc5b2..da4490d0495 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "el la ilarbreto", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index b69c4ebf822..ac5ca868b0f 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -9820,6 +9820,14 @@ "message": "Demasiado caro", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratis durante 1 año" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index f96af492352..186c0f1f256 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 20aec32c796..e494c663b74 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 56aa148b77a..ff39b14c05f 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -3,7 +3,7 @@ "message": "همه‌ برنامه‌ها" }, "activity": { - "message": "Activity" + "message": "فعالیت" }, "appLogoLabel": { "message": "لوگو Bitwarden" @@ -21,13 +21,13 @@ "message": "خطر کلمه عبور" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "شما مجاز به ویرایش این مورد نیستید" }, "reviewAtRiskPasswords": { "message": "کلمات عبور در معرض خطر (ضعیف، افشا شده یا تکراری) را در برنامه‌ها بررسی کنید. برنامه‌های حیاتی خود را انتخاب کنید تا اقدامات امنیتی را برای کاربران‌تان اولویت‌بندی کنید و به کلمات عبور در معرض خطر رسیدگی کنید." }, "reviewAtRiskLoginsPrompt": { - "message": "Review at-risk logins" + "message": "بررسی ورودهای پرخطر" }, "dataLastUpdated": { "message": "آخرین به‌روزرسانی داده‌ها: $DATE$", @@ -39,7 +39,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "شما هنوز گزارشی ایجاد نکرده‌اید" }, "notifiedMembers": { "message": "اعضای مطلع شده" @@ -66,7 +66,7 @@ "message": "ایجاد مورد ورود جدید" }, "percentageCompleted": { - "message": "$PERCENT$% complete", + "message": "$PERCENT$ درصد انجام شده", "placeholders": { "percent": { "content": "$1", @@ -75,7 +75,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "$COUNT$ مورد از $TOTAL$ کار امنیتی انجام شده است", "placeholders": { "count": { "content": "$1", @@ -88,28 +88,28 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "وضعیت تغییر رمزهای عبور" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "به اعضا وظیفه بدهید تا روند کار را رصد کنند" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "وقتی برنامه‌ها را بررسی کردید و آنها را به عنوان مهم علامت زدید، به اعضای تیم خود وظیفه دهید که رمزهایشان را تغییر دهند." }, "sendReminders": { - "message": "Send reminders" + "message": "ارسال يادآوری" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "وقتی برنامه‌ای را مهم علامت بزنید، اینجا نمایش داده می‌شود." }, "viewAtRiskMembers": { - "message": "View at-risk members" + "message": "مشاهده اعضای در خطر" }, "viewAtRiskApplications": { - "message": "View at-risk applications" + "message": "مشاهده برنامه‌های در خطر" }, "criticalApplicationsAreAtRisk": { - "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "message": "$COUNT$ مورد از $TOTAL$ برنامه مهم به دلیل رمزهای ضعیف در خطر هستند", "placeholders": { "count": { "content": "$1", @@ -131,10 +131,10 @@ } }, "criticalApplicationsMarked": { - "message": "critical applications marked" + "message": "برنامه‌های مهم علامت‌گذاری شده" }, "countOfCriticalApplications": { - "message": "$COUNT$ critical applications", + "message": "$COUNT$ برنامه مهم", "placeholders": { "count": { "content": "$1", @@ -143,7 +143,7 @@ } }, "countOfApplicationsAtRisk": { - "message": "$COUNT$ applications at-risk", + "message": "$COUNT$ رمز عبور در خطر", "placeholders": { "count": { "content": "$1", @@ -152,7 +152,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ رمز عبور جدید در خطر", "placeholders": { "count": { "content": "$1", @@ -161,7 +161,7 @@ } }, "newPasswordsAtRisk": { - "message": "$COUNT$ new passwords at-risk", + "message": "$COUNT$ رمز عبور جدید در خطر", "placeholders": { "count": { "content": "$1", @@ -179,64 +179,64 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "اطلاعاتی وجود ندارد" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "اطلاعات ورود سازمان خود را وارد کنید تا با هوش دسترسی شروع کنید. بعد از این کار می‌توانید:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "علامت‌گذاری برنامه‌ها به عنوان مهم" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "این کار به شما کمک می‌کند ابتدا خطرات برنامه‌های مهم خود را برطرف کنید." }, "feature2Title": { - "message": "Help members improve their security" + "message": "کمک به اعضا برای بهبود امنیتشان" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "به اعضای در خطر وظایف امنیتی راهنما شده بدهید تا اطلاعات ورودشان را به‌روز کنند." }, "feature3Title": { - "message": "Monitor progress" + "message": "نظارت بر پیشرفت" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "تغییرات را در طول زمان دنبال کنید تا بهبود امنیت را نشان دهید." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "ایجاد گزارش" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "شما آماده ایجاد گزارش هستید. بعد از ایجاد گزارش می‌توانید:" }, "noCriticalApplicationsTitle": { - "message": "You haven’t marked any applications as critical" + "message": "شما هیچ برنامه‌ای را به عنوان مهم علامت نزده‌اید" }, "noCriticalApplicationsDescription": { - "message": "Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "مهم‌ترین برنامه‌های خود را انتخاب کنید تا اقدامات امنیتی برای کاربران در مورد رمزهای ضعیف اولویت‌بندی شود." }, "markCriticalApplications": { - "message": "Select critical applications" + "message": "انتخاب برنامه‌های مهم" }, "markAppAsCritical": { "message": "برنامه را به عنوان حیاتی علامت‌گذاری کنید" }, "markAsCritical": { - "message": "Mark as critical" + "message": "علامت‌گذاری به عنوان مهم" }, "applicationsSelected": { - "message": "applications selected" + "message": "برنامه انتخاب شده" }, "selectApplication": { - "message": "Select application" + "message": "برنامه را انتخاب کنید" }, "unselectApplication": { - "message": "Unselect application" + "message": "لغو انتخاب برنامه" }, "applicationsMarkedAsCriticalSuccess": { "message": "برنامه‌های علامت گذاری شده به عنوان حیاتی" }, "criticalApplicationsMarkedSuccess": { - "message": "$COUNT$ applications marked as critical", + "message": "$COUNT$ برنامه به عنوان مهم علامت زده شد", "placeholders": { "count": { "content": "$1", @@ -245,7 +245,7 @@ } }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "علامت‌گذاری برنامه‌ها به عنوان مهم ناموفق بود" }, "application": { "message": "برنامه" @@ -266,16 +266,16 @@ "message": "اعضای در معرض خطر" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "این اعضا به موارد آسیب‌پذیر برنامه‌های مهم دسترسی دارند." }, "membersWithAtRiskPasswords": { - "message": "Members with at-risk passwords" + "message": "اعضایی با رمزهای عبور ضعیف" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "به اعضای سازمان شما وظیفه تغییر رمزهای آسیب‌پذیر داده می‌شود. آن‌ها در افزونه مرورگر Bitwarden خود اعلان دریافت می‌کنند." }, "membersAtRiskCount": { - "message": "$COUNT$ members at-risk", + "message": "$COUNT$ عضو در خطر", "placeholders": { "count": { "content": "$1", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "این اعضا با رمزهای ضعیف، افشا شده یا تکراری وارد برنامه‌های مهم می‌شوند." }, "atRiskMembersDescriptionNone": { "message": "هیچ عضوی با کلمات عبور ضعیف، افشا شده یا تکراری وارد برنامه‌ها نمی‌شود." @@ -341,13 +341,13 @@ "message": "کل برنامه‌ها" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "برنامه‌هایی که نیاز به بررسی دارند" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "بررسی برنامه‌های جدید" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ برنامه جدید", "placeholders": { "count": { "content": "$1", @@ -356,16 +356,16 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "برنامه‌های جدید را بررسی کنید، آنها را به عنوان مهم علامت بزنید و سازمان خود را ایمن نگه دارید" }, "reviewNow": { - "message": "Review now" + "message": "همین حالا بررسی کنید" }, "allCaughtUp": { - "message": "All caught up!" + "message": "همه چیز انجام شد!" }, "noNewApplicationsToReviewAtThisTime": { - "message": "No new applications to review at this time" + "message": "در حال حاضر برنامه جدیدی برای بررسی وجود ندارد" }, "organizationHasItemsSavedForApplications": { "message": "Your organization has items saved for $COUNT$ applications", @@ -9820,6 +9820,14 @@ "message": "خیلی گران است", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "رایگان برای یک سال" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "افزونه مرورگر Bitwarden با موفقیت باز شد. اکنون می‌توانید کلمات عبور در معرض خطر خود را بررسی کنید." }, - "openExtensionManuallyPart1": { - "message": "در باز کردن افزونه مرورگر Bitwarden مشکل داشتیم. آیکون Bitwarden را باز کنید", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "از نوار ابزار.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "اشتراک شما به‌زودی تمدید می‌شود. برای تضمین ادامه‌ی بدون وقفه‌ی خدمات، قبل از تاریخ $RENEWAL_DATE$ با $RESELLER$ تماس بگیرید و تمدید خود را تأیید کنید.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "افزونه Bitwarden نصب شد!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "افزونه را باز کنید تا وارد شوید و پر کردن خودکار را آغاز کنید." @@ -11687,6 +11684,14 @@ "message": "مرکز آموزش", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "مرکز راهنمایی", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index a1332427b09..9710db5f285 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -9820,6 +9820,14 @@ "message": "Liian kallis", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Ilmainen 1 vuoden ajan" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 9935386d012..85b5797e634 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index db3aa3090b1..8103dcde46e 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -9820,6 +9820,14 @@ "message": "Trop cher", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Passage à l'abonnement gratuit", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Passage à l'organisation gratuite", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratuit pour 1 an" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Ouverture réussie de l'extension du navigateur Bitwarden. Vous pouvez maintenant revoir vos mots de passe à risque." }, - "openExtensionManuallyPart1": { - "message": "Nous avons eu des difficultés à ouvrir l'extension de navigateur Bitwarden. Ouvrez l'icône Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "de la barre d'outils.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Votre abonnement sera renouvelé bientôt. Pour assurer un service ininterrompu, contactez $RESELLER$ pour confirmer votre renouvellement avant le $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "L'extension Bitwarden est installée !" }, - "openTheBitwardenExtension": { - "message": "Ouvrir l'extension Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "L'extension Bitwarden est installée! Ouvrez l'extension pour vous connecter et démarrer le remplissage automatique." + "bitwardenExtensionIsInstalled": { + "message": "L'extension Bitwarden est installée !" }, "openExtensionToAutofill": { "message": "Ouvrez l'extension pour vous connecter et démarrer le remplissage automatique." @@ -11687,6 +11684,14 @@ "message": "Centre d'apprentissage", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Si l'extension n'est pas ouverte, vous devrez peut-être ouvrir Bitwarden à partir de l'icône ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " sur la barre d'outils.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Centre d’aide", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Êtes-vous sûr de vouloir continuer ?" + }, + "userVerificationFailed": { + "message": "La vérification de l'utilisateur a échoué." } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 5ff4117909b..ce34dee8f42 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index f5f8bfd3c78..6560e2f2222 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -9820,6 +9820,14 @@ "message": "יקר מדי", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "חינם לשנה אחת" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "פתח בהצלחה את הרחבת הדפדפן של Bitwarden. אתה יכול לסקור עכשיו את הסיסמאות בסיכון שלך." }, - "openExtensionManuallyPart1": { - "message": "התקשינו לפתוח את הרחבת הדפדפן של Bitwarden. פתח את הסמל של Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "מסרגל הכלים.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "המנוי שלך יתחדש בקרוב. כדי להבטיח שירות רציף, צור קשר עם $RESELLER$ כדי לאשר את החידוש שלך לפני $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "הרחבת Bitwarden הותקנה!" }, - "openTheBitwardenExtension": { - "message": "פתח את ההרחבה של Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "ההרחבה של Bitwarden הותקנה! פתח את ההרחבה כדי להיכנס ולהתחיל למלא אוטומטית." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "פתח את ההרחבה כדי להיכנס ולהתחיל למלא אוטומטית." @@ -11687,6 +11684,14 @@ "message": "מרכז הלמידה", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "מרכז העזרה", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index b3ecb676b4d..67dede6f1e7 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 26a784acf5c..8c548a71dee 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -94,7 +94,7 @@ "message": "Dodijeli članovima zadatke za praćenje napretka" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Nakon što pregledaš aplikacije i označiš ih kao kritične, dodijeli svojim članovima zadatke za promjenu lozinki." }, "sendReminders": { "message": "Pošalji podsjetnike" @@ -179,34 +179,34 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Nisu pronađeni podaci" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Uvezi podatke za prijavu svoje organizacije za korištenje usluge Access Intelligence. Nakon toga, moći ćeš:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Označi aplikacije kao kritične" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "To će ti pomoći prvo ukloniti rizike za tvoje najvažnije aplikacije." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Pomoći povećati sigurnost članova" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Dodijeli vođene sigurnosne zadatke članovima u riziku za ažuriranje vjerodajnica." }, "feature3Title": { - "message": "Monitor progress" + "message": "Pratiti napredak" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Praćenje promjena tijekom vremena za prikaz sigurnosnih poboljšanja." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Stvarati izvješća" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Počni generirati izvješća. Nakon što ih generiraš, moći ćeš:" }, "noCriticalApplicationsTitle": { "message": "Niti jedna aplikacija nije označena kao kritična" @@ -266,13 +266,13 @@ "message": "Rizični korisnici" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Ovi članovi imaju pristup ranjivim stavkama za kritične aplikacije." }, "membersWithAtRiskPasswords": { "message": "Članovi s rizičnim lozinkama" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Članovima tvoje organizacije biti će dodijeljen zadatak promjene ranjivih lozinki. Primiti će obavijest unutar Bitwarden proširenja preglednika." }, "membersAtRiskCount": { "message": "Rizičnih članova: $COUNT$", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Ovi članovi se prijavljuju u kritične aplikacije slabim, otkrivenim ili ponovno korištenim lozinkama." }, "atRiskMembersDescriptionNone": { "message": "Nema članova koji se prijavljuju slabim, izloženim ili ponovno korištenim lozinkama." @@ -386,13 +386,13 @@ "message": "Daj prioritet kritičnim aplikacijama" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Odaberi koje su aplikacije najvažnije za tvoju organizaciju. Zatim ćeš moći dodijeliti sigurnosne zadatke članovima kako bi se uklonili rizici." }, "reviewNewApplications": { "message": "Pregledaj nove prijave" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Pregledaj nove aplikacije s ranjivim stavkama i označi one koje želiš pomno pratiti kao kritične. Zatim ćeš moći dodijeliti sigurnosne zadatke članovima kako bi se uklonili rizici." }, "clickIconToMarkAppAsCritical": { "message": "Klikni ikonu zvjezdice za označavanje aplikacije kao kritične" @@ -3188,7 +3188,7 @@ "message": "Sve neplaćene pretplate naplatiti će se na tvoj način plaćanja." }, "paymentChargedWithTrial": { - "message": "Plan dolazi s besplatnom probnom verzijom od 7 dana. Tvoj način plaćanja neće biti terećen dok ne završi probno razdoblje. Možeš otkazati u bilo kojem trenutku." + "message": "Paket dolazi s besplatnom probnom verzijom od 7 dana. Tvoj način plaćanja neće biti terećen dok ne završi probno razdoblje. Možeš otkazati u bilo kojem trenutku." }, "paymentInformation": { "message": "Podaci o plaćanju" @@ -3419,7 +3419,7 @@ "message": "Naziv tvrtke" }, "chooseYourPlan": { - "message": "Odaberi svoj plan" + "message": "Odaberi svoj paket" }, "users": { "message": "Korisnici" @@ -3469,7 +3469,7 @@ "message": "Za privatnu upotrebu, za dijeljenje s obitelji i prijateljima." }, "planNameTeams": { - "message": "Timovi" + "message": "Teams" }, "planDescTeams": { "message": "Za male tvtke ili druge manje organizacije." @@ -3598,7 +3598,7 @@ } }, "trialPaidInfoMessage": { - "message": "Tvoj plan $PLAN$ će biti pretvoren u plaćenu pretplatu nakon isteka besplatnog probnog razdoblja od 7 dana.", + "message": "Tvoj paket $PLAN$ će biti pretvoren u plaćenu pretplatu nakon isteka besplatnog probnog razdoblja od 7 dana.", "placeholders": { "plan": { "content": "$1", @@ -4813,7 +4813,7 @@ } }, "subscriptionUserSeatsWithoutAdditionalSeatsOption": { - "message": "Možeš pozvati do $COUNT$ članova bez dodatnih troškova. Kontaktiraj korisničku podršku za nadogradnju plana i pozivanje više članova.", + "message": "Možeš pozvati do $COUNT$ članova bez dodatnih troškova. Kontaktiraj korisničku podršku za nadogradnju paketa i pozivanje više članova.", "placeholders": { "count": { "content": "$1", @@ -4822,7 +4822,7 @@ } }, "subscriptionFreePlan": { - "message": "Nije moguće pozvati više od $COUNT$ korisnika bez nadogradnje plana.", + "message": "Nije moguće pozvati više od $COUNT$ korisnika bez nadogradnje paketa.", "placeholders": { "count": { "content": "$1", @@ -4831,7 +4831,7 @@ } }, "subscriptionUpgrade": { - "message": "Nije moguće pozvati više od $COUNT$ korisnika bez nadogradnje plana.", + "message": "Nije moguće pozvati više od $COUNT$ korisnika bez nadogradnje paketa.", "placeholders": { "count": { "content": "$1", @@ -5810,7 +5810,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Sve će stavke biti u vlasništvu i spremljene u organizaciji, što će omogućiti kontrolu, vidljivost i izvještavanje na razini cijele organizacije. Kada je uključeno, svakom će članu biti dostupna zadana kolekcija za pohranu stavki. Saznaj više o upravljanju ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -5994,7 +5994,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "Za uključivanje prilagođenih uloga, organizacija mora biti na planu Enterprise 2020." + "message": "Za uključivanje prilagođenih uloga organizacija mora biti na paketu Enterprise 2020." }, "permissions": { "message": "Dozvole" @@ -6891,7 +6891,7 @@ "message": "Nema sponzoriranog Families paketa" }, "nosponsoredFamiliesDetails": { - "message": "Sponzorirani ne-obiteljski paketi biti će prikazani ovdje" + "message": "Sponzorirani ne-obiteljski paketi će biti prikazani ovdje" }, "sponsorshipFreeBitwardenFamilies": { "message": "Članovi tvoje organizacije ispunjavaju uvjete za besplatni Bitwarden Families paket. Možeš sponzorirati besplatni Bitwarden Families paket za zaposlenike koji nisu članovi tvoje Bitwarden organizacije. Sponzoriranje ne-člana zahtijeva dostupno mjesto unutar vaše organizacije." @@ -6939,7 +6939,7 @@ "message": "Veza više nije valjana. Zamoli sponzora da pošalje novu ponudu." }, "reclaimedFreePlan": { - "message": "Obnovljeni besplatni plan" + "message": "Obnovljeni besplatni paket" }, "redeem": { "message": "Iskoristi" @@ -7242,7 +7242,7 @@ "message": "Vlastiti poslužitelj" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "Za postavljanje svoje organizacije na vlastitom poslužitelju, morat ćeš prenijeti datoteku licence. Kako bi podržali besplatne Families pakete i napredne mogućnosti naplate za svoju samostalnu organizaciju, morat ćeš postaviti sinkronizaciju naplate." + "message": "Za postavljanje svoje organizacije na vlastitom poslužitelju, morat ćeš prenijeti datoteku licence. Kako bi besplatni Families paketi i napredne mogućnosti naplate bili podržani u tvojoj samostalnoj organizaciji, morat ćeš postaviti sinkronizaciju naplate." }, "billingSyncApiKeyRotated": { "message": "Token rotiran" @@ -8626,7 +8626,7 @@ "message": "Zamijeni proizvode" }, "freeOrgInvLimitReachedManageBilling": { - "message": "Besplatne organizacije mogu imati do $SEATCOUNT$ članova. Nadogradi na plaćeni plan za pozivanje više članova.", + "message": "Besplatne organizacije mogu imati do $SEATCOUNT$ članova. Nadogradi na plaćeni paket za pozivanje više članova.", "placeholders": { "seatcount": { "content": "$1", @@ -8644,7 +8644,7 @@ } }, "teamsStarterPlanInvLimitReachedManageBilling": { - "message": "Teams Starter plan može imati do $SEATCOUNT$ članova. Nadogradi svoj plan za pozivanje više članova.", + "message": "Teams Starter paket može imati do $SEATCOUNT$ članova. Nadogradi svoj paket za pozivanje više članova.", "placeholders": { "seatcount": { "content": "$1", @@ -8653,7 +8653,7 @@ } }, "teamsStarterPlanInvLimitReachedNoManageBilling": { - "message": "Teams Starter plan može imati do $SEATCOUNT$ članova. Kontaktiraj vlasnika svoje organizacije za nadogradnju plana i pozivanje više članova.", + "message": "Teams Starter paket može imati do $SEATCOUNT$ članova. Kontaktiraj vlasnika svoje organizacije za nadogradnju paketa i pozivanje više članova.", "placeholders": { "seatcount": { "content": "$1", @@ -8662,7 +8662,7 @@ } }, "freeOrgMaxCollectionReachedManageBilling": { - "message": "Besplatne organizacije mogu imati do $COLLECTIONCOUNT$ zbirki. Nadogradi na plaćeni plan za dodavanje više zbirki.", + "message": "Besplatne organizacije mogu imati do $COLLECTIONCOUNT$ zbirki. Nadogradi na plaćeni paket za dodavanje više zbirki.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -9494,13 +9494,13 @@ "message": "Predbilježi se za Secrets Manager" }, "addSecretsManagerUpgradeDesc": { - "message": "Dodajte Secrets Manager svojem nadograđenom planu za zadržavanje pristupa svim tajnama stvorenim sa svojim prethodnim planom." + "message": "Dodajte Secrets Manager svojem nadograđenom paketu za zadržavanje pristupa svim tajnama stvorenim sa svojim prethodnim planom." }, "additionalServiceAccounts": { "message": "Dodani servisni računi" }, "includedServiceAccounts": { - "message": "Plan uključuje $COUNT$ servisnih računa.", + "message": "Paket uključuje $COUNT$ servisnih računa.", "placeholders": { "count": { "content": "$1", @@ -9544,7 +9544,7 @@ "message": "Ažurirane postavke upravljanja zbirkama" }, "passwordManagerPlanPrice": { - "message": "Cijena plana za Upravitelj lozinkama" + "message": "Cijena paketa za Upravitelj lozinkama" }, "secretsManagerPlanPrice": { "message": "Cjenik Secrets Managera" @@ -9820,6 +9820,14 @@ "message": "Preskupo", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Prebacivanje na besplatni paket", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Prebacivanje na besplatnu organizaciju", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Besplatno godinu dana" }, @@ -9851,7 +9859,7 @@ "message": "Dodijeli zadatke" }, "assignSecurityTasksToMembers": { - "message": "Send notifications to change passwords" + "message": "Pošalji podsjetnike za promjenu lozinki" }, "assignToCollections": { "message": "Dodijeli zbirkama" @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Uspjšeno otvoreno Bitwarden proširenje preglednika. Sada možeš pregledati svoje rizične lozinke." }, - "openExtensionManuallyPart1": { - "message": "Nismo mogli otvoriti Bitwarden proširenje preglednika. Otvori Bitwarden ikonu", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "na alatnoj traci.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Tvoja će se pretplata uskoro obnoviti. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $RENEWAL_DATE$.", "placeholders": { @@ -11506,7 +11506,7 @@ "message": "Pregled događaja" }, "cannotCreateCollection": { - "message": "Besplatne organizacije mogu imati do 2 zbirke. Nadogradi na plaćeni plan za dodavanje više zbirki." + "message": "Besplatne organizacije mogu imati do 2 zbirke. Nadogradi na plaćeni paket za dodavanje više zbirki." }, "searchArchive": { "message": "Pretraži arhivu" @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden proširenje je instalirano!" }, - "openTheBitwardenExtension": { - "message": "Otvori Bitwarden proširenje" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Instalirano je Bitwarden proširenje! Otvori ga za prijavu i početak auto-ispune." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Otvori proširenje i prijavi se za početak korištenja auto-ispune." @@ -11687,6 +11684,14 @@ "message": "centar za učenje", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "centar za pomoć", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -11814,7 +11819,7 @@ } }, "subscribeEnterpriseSubtitle": { - "message": "Tvoj 7-dnevni probni rok za plan $PLAN$ počinje danas. Dodaj način plaćanja za nastavak korištenja značajki nakon završetka probnog roka: ", + "message": "Tvoj 7-dnevni probni rok za paket $PLAN$ počinje danas. Dodaj način plaćanja za nastavak korištenja značajki nakon završetka probnog roka: ", "placeholders": { "plan": { "content": "$1", @@ -11939,7 +11944,7 @@ "message": "Napredne mogućnosti za bilo koju organizaciju" }, "planNameCustom": { - "message": "Vlastiti plan" + "message": "Vlastiti paket" }, "planDescCustom": { "message": "Bitwarden se prilagođava tvrtkama svih veličina kako bi osigurao lozinke i osjetljive podatke. Ako si dio velike tvrtke, zatraži ponudu od odjela prodaje." @@ -12119,13 +12124,13 @@ "message": "Započni besplatno probno razdoblje za Families" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Blokiraj stvaranje računa za potvrđene domene" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Spriječi korisnike da stvaraju račune izvan organizacije koristeći adrese e-pošte s potvrđenim domenama." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Domena mora biti potvrđena prije aktiviranja ovog pravila." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Postavi metodu otključavanja za promjenu radnje nakon isteka vremenskog ograničenja trezora." @@ -12162,9 +12167,12 @@ } }, "confirmNoSelectedCriticalApplicationsTitle": { - "message": "No critical applications are selected" + "message": "Nisu odabrane kritične aplikacije" }, "confirmNoSelectedCriticalApplicationsDesc": { - "message": "Are you sure you want to continue?" + "message": "Sigurno želiš nastaviti?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 82a892eb094..f626e348e73 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -9820,6 +9820,14 @@ "message": "Túl drága", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Váltás ingyenes díkcsomagra", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Váltás ingyenes szervezetre", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Díjmentes 1 évre" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Sikeresen megnyitottuk a Bitwarden böngésző bővítményt. Mostantól áttekinthetjük a veszélyeztetett jelszavakat." }, - "openExtensionManuallyPart1": { - "message": "Probléma merült fel a Bitward böngésző bővítmény megnyitásakor. Nyissuk meg a Bitwarden ikont", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "az eszköztárból.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Az előfizetés hamarosan megújul. A folyamatos szolgáltatás biztosítása érdekében lépjünk kapcsolatba $RESELLER$ viszonteladóval és erősítsük meg a megújítást $RENEWAL_DATE$ előtt.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "A Bitwarden bővítmény megnyitása" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "A Bitwarden bővítmény telepítve van! Nyissuk meg a bővítményt a bejelentkezéshez és az automatikus kitöltés megkezdéséhez." + "bitwardenExtensionIsInstalled": { + "message": "A Bitwarden kiterjesztés telepítésre került!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Ha a bővítmény nem nyílt meg, előfordulhat, hogy meg kell nyitni a Bitwardent az ikonról ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": "az eszköztárból.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Biztos folytatni szeretnénk?" + }, + "userVerificationFailed": { + "message": "A felhasználó ellenőrzése sikertelen volt." } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 86b9356ac08..639063ca304 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index ffc82cfcb4f..14da6d6be56 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -21,13 +21,13 @@ "message": "Rischio password" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Non hai i permessi per modificare questo elemento" }, "reviewAtRiskPasswords": { "message": "Controlla le password a rischio (deboli, esposte o riutilizzate). Seleziona le applicazioni critiche per determinare la priorità delle azioni di sicurezza." }, "reviewAtRiskLoginsPrompt": { - "message": "Review at-risk logins" + "message": "Rivedi i login a rischio" }, "dataLastUpdated": { "message": "Ultimo aggiornamento dei dati: $DATE$", @@ -94,7 +94,7 @@ "message": "Assegna compiti ai membri per monitorarne i progressi" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Dopo aver esaminato le applicazioni e contrassegnato quelle critiche, comunica ai membri dell'organizzazione di cambiare le loro password." }, "sendReminders": { "message": "Invia promemoria" @@ -131,7 +131,7 @@ } }, "criticalApplicationsMarked": { - "message": "critical applications marked" + "message": "applicazioni critiche contrassegnate" }, "countOfCriticalApplications": { "message": "$COUNT$ applicazioni critiche", @@ -179,34 +179,34 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Nessun dato disponibile" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Importa i dati di accesso della tua organizzazione per configurare Access Intelligence. Una volta fatto, sarai in grado di:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Contrassegna l'applicazione come critica" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Ti sarà utile per rimuovere i rischi innanzi tutto per le tue applicazioni più importanti." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Aiuta i membri a migliorare la loro sicurezza" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Assegna ai membri a rischio attività di sicurezza guidate per aggiornare, migliorare o rafforzare le loro credenziali di accesso." }, "feature3Title": { - "message": "Monitor progress" + "message": "Tieni sotto controllo i progressi" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Traccia i cambiamenti per monitorare i miglioramenti di sicurezza." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Genera un report" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Sei pronto per iniziare a generare report. Una volta generati, sarai in grado di:" }, "noCriticalApplicationsTitle": { "message": "Non hai contrassegnato nessuna applicazione come critica" @@ -224,7 +224,7 @@ "message": "Contrassegna l'elemento come critico" }, "applicationsSelected": { - "message": "Applicazioni selezionate" + "message": "applicazioni selezionate" }, "selectApplication": { "message": "Seleziona applicazione" @@ -236,7 +236,7 @@ "message": "Applicazioni contrassegnate come critiche" }, "criticalApplicationsMarkedSuccess": { - "message": "$COUNT$ applications marked as critical", + "message": "$COUNT$ applicazioni contrassegnate come critiche", "placeholders": { "count": { "content": "$1", @@ -266,13 +266,13 @@ "message": "Membri a rischio" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Questi membri hanno accesso a elementi vulnerabili per applicazioni critiche." }, "membersWithAtRiskPasswords": { - "message": "Members with at-risk passwords" + "message": "Membri con password a rischio" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "I membri della tua organizzazione dovranno cambiare le password vulnerabili. Riceveranno una notifica all'interno dell'estensione Bitwarden del loro browser." }, "membersAtRiskCount": { "message": "$COUNT$ membri a rischio", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Questi membri accedono ad applicazioni con password deboli, esposte, o riutilizzate." }, "atRiskMembersDescriptionNone": { "message": "Non ci sono utenti connessi con password deboli, esposte o riutilizzate." @@ -344,7 +344,7 @@ "message": "Applicazioni in attesa di revisione" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "Verifica le nuove applicazioni" }, "newApplicationsWithCount": { "message": "$COUNT$ nuove applicazioni", @@ -362,13 +362,13 @@ "message": "Controlla adesso" }, "allCaughtUp": { - "message": "All caught up!" + "message": "Nessuna notifica" }, "noNewApplicationsToReviewAtThisTime": { - "message": "No new applications to review at this time" + "message": "Nessuna nuova applicazione da verificare" }, "organizationHasItemsSavedForApplications": { - "message": "Your organization has items saved for $COUNT$ applications", + "message": "La tua organizzazione ha elementi salvati per $COUNT$ applicazioni", "placeholders": { "count": { "content": "$1", @@ -377,40 +377,40 @@ } }, "reviewApplicationsToSecureItems": { - "message": "Review applications to secure the items most critical to your organization's security" + "message": "Controlla le applicazioni e proteggi gli elementi critici per la sicurezza della tua organizzazione" }, "reviewApplications": { - "message": "Review applications" + "message": "Verifica le nuove applicazioni" }, "prioritizeCriticalApplications": { "message": "Priorità alle applicazioni critiche" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Indica quali sono le applicazioni più importanti la tua organizzazione. Potrai assegnare ai membri delle attività da completare per mettere in sicurezza le loro credenziali." }, "reviewNewApplications": { - "message": "Review new applications" + "message": "Verifica le nuove applicazioni" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Rivedi le nuove applicazioni con elementi vulnerabili e contrassegna come critiche quelle che desideri monitorare da vicino. Potrai assegnare ai membri delle attività da completare per mettere in sicurezza le loro credenziali." }, "clickIconToMarkAppAsCritical": { - "message": "Click the star icon to mark an app as critical" + "message": "Clicca sull'icona stella per contrassegnare un'app come critica" }, "markAsCriticalPlaceholder": { "message": "La funzionalità per contrassegnare gli elementi critici sarà implementata in un aggiornamento futuro" }, "applicationReviewSaved": { - "message": "Application review saved" + "message": "Applicazione verificata" }, "newApplicationsReviewed": { - "message": "New applications reviewed" + "message": "Nuove applicazioni verificate" }, "errorSavingReviewStatus": { - "message": "Error saving review status" + "message": "Errore nell'aggiornamento dello stato di verifica" }, "pleaseTryAgain": { - "message": "Please try again" + "message": "Riprova" }, "unmarkAsCritical": { "message": "Contrassegna l'elemento come non critico" @@ -875,7 +875,7 @@ "message": "Preferiti" }, "taskSummary": { - "message": "Task summary" + "message": "Riepilogo attività" }, "types": { "message": "Tipi" @@ -1402,7 +1402,7 @@ "message": "Usa login unificato (SSO)" }, "yourOrganizationRequiresSingleSignOn": { - "message": "Your organization requires single sign-on." + "message": "La tua organizzazione richiede un accesso Single Sign-On (SSO)." }, "welcomeBack": { "message": "Bentornato/a" @@ -3245,16 +3245,16 @@ "message": "Prossimo addebito" }, "nextChargeHeader": { - "message": "Next Charge" + "message": "Prossimo addebito" }, "plan": { - "message": "Plan" + "message": "Piano" }, "details": { "message": "Dettagli" }, "discount": { - "message": "discount" + "message": "sconto" }, "downloadLicense": { "message": "Scarica licenza" @@ -4461,31 +4461,31 @@ "message": "Aggiorna browser" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Generazione del tuo Access Intelligence..." }, "fetchingMemberData": { - "message": "Fetching member data..." + "message": "Recupero dei dati dei membri..." }, "analyzingPasswordHealth": { - "message": "Analyzing password health..." + "message": "Analisi della salute della password..." }, "calculatingRiskScores": { - "message": "Calculating risk scores..." + "message": "Calcolo dei punteggi di rischio..." }, "generatingReportData": { - "message": "Generating report data..." + "message": "Generazione dati del rapporto..." }, "savingReport": { - "message": "Saving report..." + "message": "Salvataggio..." }, "compilingInsights": { - "message": "Compiling insights..." + "message": "Compilazione dei dati..." }, "loadingProgress": { - "message": "Loading progress" + "message": "Caricamento in corso" }, "thisMightTakeFewMinutes": { - "message": "This might take a few minutes." + "message": "Attendi..." }, "riskInsightsRunReport": { "message": "Avvia report" @@ -4573,7 +4573,7 @@ "message": "Invito accettato" }, "invitationAcceptedDesc": { - "message": "Successfully accepted your invitation." + "message": "Hai accettato l'invito." }, "inviteInitAcceptedDesc": { "message": "Ora puoi accedere a questa organizzazione." @@ -5810,7 +5810,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Tutti gli elementi saranno posseduti e memorizzati dall'organizzazione, e saranno disponibili controlli, visibilità e reporting. Quando attivato, è disponibile una raccolta predefinita per ogni utente. Per sapere di più sulla gestione del ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -5837,63 +5837,63 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" }, "availableNow": { - "message": "Available now" + "message": "Disponibile ora" }, "autoConfirm": { - "message": "Automatic confirmation of new users" + "message": "Conferma automatica dei nuovi utenti" }, "autoConfirmDescription": { - "message": "New users invited to the organization will be automatically confirmed when an admin’s device is unlocked.", + "message": "I nuovi utenti invitati ad accedere all'organizzazione saranno automaticamente confermati quando il dispositivo di un amministratore è sbloccato.", "description": "This is the description of the policy as it appears in the 'Policies' page" }, "howToTurnOnAutoConfirm": { - "message": "How to turn on automatic user confirmation" + "message": "Come attivare la conferma automatica dell'utente" }, "autoConfirmExtension1": { - "message": "Open your Bitwarden extension" + "message": "Apri l'estensione di Bitwarden" }, "autoConfirmExtension2": { - "message": "Select", + "message": "Seleziona", "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtension3": { - "message": " Turn on", + "message": " Attiva", "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtensionOpened": { - "message": "Successfully opened the Bitwarden browser extension. You can now activate the automatic user confirmation setting." + "message": "L'estensione del browser Bitwarden è stata aperta con successo. Ora è possibile attivare l'impostazione di conferma automatica dell'utente." }, "autoConfirmPolicyEditDescription": { - "message": "New users invited to the organization will be automatically confirmed when an admin’s device is unlocked. Before turning on this policy, please review and agree to the following: ", + "message": "I nuovi utenti invitati ad accedere all'organizzazione saranno automaticamente confermati quando il dispositivo di un amministratore è sbloccato. Prima di attivare questa funzione, leggi attentamente e conferma di accettare quanto segue: ", "description": "This is the description of the policy as it appears inside the policy edit dialog" }, "autoConfirmAcceptSecurityRiskTitle": { - "message": "Potential security risk. " + "message": "Potenziale rischio per la sicurezza. " }, "autoConfirmAcceptSecurityRiskDescription": { - "message": "Automatic user confirmation could pose a security risk to your organization’s data." + "message": "La conferma automatica dell'utente potrebbe rappresentare un rischio per la sicurezza dei dati della tua organizzazione." }, "autoConfirmAcceptSecurityRiskLearnMore": { - "message": "Learn about the risks", + "message": "Scopri i rischi", "description": "The is the link copy for the first check box option in the edit policy dialog" }, "autoConfirmSingleOrgRequired": { - "message": "Single organization policy required. " + "message": "È richiesto il Single Sign-On (SSO)." }, "autoConfirmSingleOrgRequiredDesc": { - "message": "All members must only belong to this organization to activate this automation." + "message": "Tutti i membri devono appartenere esclusivamente a questa organizzazione per attivare questa automazione." }, "autoConfirmSingleOrgExemption": { - "message": "Single organization policy will extend to all roles. " + "message": "La politica di organizzazione unica si estenderà a tutti i ruoli. " }, "autoConfirmNoEmergencyAccess": { - "message": "No emergency access. " + "message": "Non è stato configurato l'accesso d'emergenza. " }, "autoConfirmNoEmergencyAccessDescription": { - "message": "Emergency Access will be removed." + "message": "L'accesso d'emergenza sarà rimosso." }, "autoConfirmCheckBoxLabel": { - "message": "I accept these risks and policy updates" + "message": "Accetto questi rischi e aggiornamenti sulle politiche" }, "personalOwnership": { "message": "Rimuovi cassaforte individuale" @@ -5948,16 +5948,16 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "uriMatchDetectionPolicy": { - "message": "Default URI match detection" + "message": "Metodo di corrispondenza degli URL predefinito" }, "uriMatchDetectionPolicyDesc": { - "message": "Determine when logins are suggested for autofill. Admins and owners are exempt from this policy." + "message": "Determina con quale logica i login sono suggeriti in base all'URL visitato. Amministratori e proprietari possono modificare questa impostazione." }, "uriMatchDetectionOptionsLabel": { - "message": "Default URI match detection" + "message": "Metodo di corrispondenza predefinito" }, "invalidUriMatchDefaultPolicySetting": { - "message": "Please select a valid URI match detection option.", + "message": "Scegli un metodo di corrispondenza valido.", "description": "Error message displayed when a user attempts to save URI match detection policy settings with an invalid selection." }, "modifiedPolicyId": { @@ -6614,10 +6614,10 @@ "message": "La tua password principale non soddisfa uno o più politiche della tua organizzazione. Per accedere alla cassaforte, aggiornala ora. Procedere ti farà uscire dalla sessione corrente, richiedendoti di accedere di nuovo. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora." }, "automaticAppLoginWithSSO": { - "message": "Automatic login with SSO" + "message": "Accesso automatico con SSO" }, "automaticAppLoginWithSSODesc": { - "message": "Extend SSO security and convenience to unmanaged apps. When users launch an app from your identity provider, their login details are automatically filled and submitted, creating a one-click, secure flow from the identity provider to the app." + "message": "Estendi la sicurezza e la comodità del Single Sign-On (SSO) alle app non gestite. Quando gli utenti lanciano un'app collegata, i dati di accesso sono inseriti e inviati automaticamente: si tratta di un flusso a singolo clic, velocissimo e sicuro, che unisce il provider d'identità all'applicazione." }, "automaticAppLoginIdpHostLabel": { "message": "Host Identity provider" @@ -6629,31 +6629,31 @@ "message": "La tua organizzazione ha aggiornato le tue opzioni di decrittazione. Per favore, imposta una master password per accedere alla tua cassaforte." }, "sessionTimeoutPolicyTitle": { - "message": "Session timeout" + "message": "Timeout della sessione" }, "sessionTimeoutPolicyDescription": { - "message": "Set a maximum session timeout for all members except owners." + "message": "Imposta un timeout di sessione massimo per tutti i membri tranne i proprietari." }, "maximumAllowedTimeout": { - "message": "Maximum allowed timeout" + "message": "Timeout massimo consentito" }, "maximumAllowedTimeoutRequired": { - "message": "Maximum allowed timeout is required." + "message": "È necessario impostare un limite massimo di timeout." }, "sessionTimeoutPolicyInvalidTime": { - "message": "Time is invalid. Change at least one value." + "message": "Valore non valido: prova ad inserirlo nuovamente." }, "sessionTimeoutAction": { - "message": "Session timeout action" + "message": "Azione al timeout della sessione" }, "immediately": { - "message": "Immediately" + "message": "Subito" }, "onSystemLock": { - "message": "On system lock" + "message": "Al blocco del dispositivo" }, "onAppRestart": { - "message": "On app restart" + "message": "Al riavvio dell'app" }, "hours": { "message": "Ore" @@ -6662,19 +6662,19 @@ "message": "Minuti" }, "sessionTimeoutConfirmationNeverTitle": { - "message": "Are you certain you want to allow a maximum timeout of \"Never\" for all members?" + "message": "Sei sicuro di voler disabilitare il valore massimo di timeout per tutti i membri?" }, "sessionTimeoutConfirmationNeverDescription": { - "message": "This option will save your members' encryption keys on their devices. If you choose this option, ensure that their devices are adequately protected." + "message": "Questa opzione salverà localmente la chiave crittografica di ogni membro sul suo dispositivo. Se scegli questa opzione, assicurati che i loro dispositivi siano adeguatamente protetti." }, "learnMoreAboutDeviceProtection": { - "message": "Learn more about device protection" + "message": "Ulteriori informazioni sulla protezione dei dispositivi" }, "sessionTimeoutConfirmationOnSystemLockTitle": { - "message": "\"System lock\" will only apply to the browser and desktop app" + "message": "'Blocco di sistema' si applica solo all'estensione del browser e all'app desktop" }, "sessionTimeoutConfirmationOnSystemLockDescription": { - "message": "The mobile and web app will use \"on app restart\" as their maximum allowed timeout, since the option is not supported." + "message": "Le versioni mobile e Web imposteranno un timeout al riavvio dell'app, perché l'opzione non è supportata." }, "vaultTimeoutPolicyInEffect": { "message": "Le politiche della tua organizzazione hanno impostato il timeout massimo consentito della tua cassaforte su $HOURS$ ore e $MINUTES$ minuti.", @@ -7218,7 +7218,7 @@ "message": "Devi aggiungere lo URL del server di base o almeno un ambiente personalizzato." }, "selfHostedEnvMustUseHttps": { - "message": "URLs must use HTTPS." + "message": "Gli indirizzi devono usare il protocollo HTTPS." }, "apiUrl": { "message": "URL del server API" @@ -7393,7 +7393,7 @@ "message": "Accesso negato. Non hai i permessi necessari per visualizzare questa pagina." }, "noPageAccess": { - "message": "You do not have access to this page" + "message": "Non hai accesso a questa pagina" }, "masterPassword": { "message": "Password principale" @@ -9820,6 +9820,14 @@ "message": "Troppo costoso", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Passaggio al piano gratuito", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Passaggio all'organizzazione gratuita", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratis per un anno" }, @@ -9851,7 +9859,7 @@ "message": "Assegna attività" }, "assignSecurityTasksToMembers": { - "message": "Send notifications to change passwords" + "message": "Invia notifiche ai membri per invitarli a modificare le loro password" }, "assignToCollections": { "message": "Assegna alle raccolte" @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "L'estensione di Bitwarden è installata e funzionante. Ora è possibile avere una panoramica delle password a rischio." }, - "openExtensionManuallyPart1": { - "message": "Non è stato possibile aprire l'estensione di Bitwarden. Clicca sull'icona di Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "dalla barra degli strumenti.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Il tuo abbonamento sarà rinnovato a breve. Per assicurarti un servizio continuativo, contatta $RESELLER$ e conferma il tuo rinnovo prima del $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Estensione di Bitwarden installata!" }, - "openTheBitwardenExtension": { - "message": "Apri l'estensione Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "L'estensione Bitwarden è installata! Clicca sul pulsante dell'estensione sulla barra del browser per accedere e avviare l'auto-riempimento." + "bitwardenExtensionIsInstalled": { + "message": "Estensione di Bitwarden installata!" }, "openExtensionToAutofill": { "message": "Apri l'estensione cliccando sul tasto della barra degli strumenti e accedi con i tuoi dati per attivare il riempimento automatico." @@ -11687,6 +11684,14 @@ "message": "Guida introduttiva", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Se l'estensione non s'è avviata, potrebbe essere necessario cliccare sull'icona di Bitwarden ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " nella barra degli strumenti del browser.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "il Manuale di Bitwarden", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12083,73 +12088,73 @@ "message": "Vedi i piani Business" }, "updateEncryptionSettings": { - "message": "Update encryption settings" + "message": "Aggiorna le impostazioni di crittografia" }, "updateYourEncryptionSettings": { - "message": "Update your encryption settings" + "message": "Aggiorna le impostazioni di crittografia" }, "updateSettings": { - "message": "Update settings" + "message": "Aggiorna le impostazioni" }, "algorithm": { - "message": "Algorithm" + "message": "Algoritmo" }, "encryptionKeySettingsHowShouldWeEncryptYourData": { - "message": "Choose how Bitwarden should encrypt your vault data. All options are secure, but stronger methods offer better protection - especially against brute-force attacks. Bitwarden recommends the default setting for most users." + "message": "Scegli la modalità di crittografia per la tua cassaforte. Tutte le opzioni sono assolutamente sicure, ma alcuni metodi avanzati offrono una protezione superiore. Bitwarden consiglia l'impostazione predefinita per la maggior parte degli utenti." }, "encryptionKeySettingsIncreaseImproveSecurity": { - "message": "Increasing the values above the default will improve security, but your vault may take longer to unlock as a result." + "message": "Scegliere un valore superiore al predefinito aumenta il livello di sicurezza, ma la cassaforte potrebbe impiegare più tempo a sbloccarsi." }, "encryptionKeySettingsAlgorithmPopoverTitle": { - "message": "About encryption algorithms" + "message": "Informazioni sugli algoritmi di crittografia" }, "encryptionKeySettingsAlgorithmPopoverPBKDF2": { - "message": "PBKDF2-SHA256 is a well-tested encryption method that balances security and performance. Good for all users." + "message": "PBKDF2-SHA256 è un metodo di crittografia ben testato che bilancia sicurezza e prestazioni. Consigliato per tutti gli utenti." }, "encryptionKeySettingsAlgorithmPopoverArgon2Id": { - "message": "Argon2id offers stronger protection against modern attacks. Best for advanced users with powerful devices." + "message": "Argon2id offre una protezione più forte contro gli attacchi moderni. Consigliato per gli utenti avanzati con dispositivi potenti." }, "zipPostalCodeLabel": { - "message": "ZIP / Postal code" + "message": "CAP / codice postale" }, "cardNumberLabel": { - "message": "Card number" + "message": "Numero di carta" }, "startFreeFamiliesTrial": { - "message": "Start free Families trial" + "message": "Inizia la prova gratuita Famiglie" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Blocca la creazione di account per domini rivendicati" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Impedisci agli utenti di creare account al di fuori della tua organizzazione utilizzando indirizzi email da domini rivendicati." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Prima di attivare questa politica è necessario attivare un dominio." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Imposta un metodo di sblocco per modificare l'azione al timeout della cassaforte." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Le impostazioni di timeout sono state impostate secondo le politiche aziendali" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Il timeout della tua cassaforte supera i limiti impostati dalla tua organizzazione." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Vuoi davvero impostare il blocco su 'Mai'? In questa modalità, la chiave di decrittazione della cassaforte sarà conservata localmente sul tuo dispositivo: assicurati di mantenerlo protetto e al sicuro." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Azione al timeout" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Timeout della sessione" }, "appearance": { - "message": "Appearance" + "message": "Aspetto" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Il timeout supera la restrizione imposta dalla tua organizzazione: massimo $HOURS$ ora/e e $MINUTES$ minuto/i", "placeholders": { "hours": { "content": "$1", @@ -12162,9 +12167,12 @@ } }, "confirmNoSelectedCriticalApplicationsTitle": { - "message": "No critical applications are selected" + "message": "Non ci sono applicazioni contrassegnate come critiche" }, "confirmNoSelectedCriticalApplicationsDesc": { - "message": "Are you sure you want to continue?" + "message": "Vuoi davvero continuare?" + }, + "userVerificationFailed": { + "message": "Verifica dell'utente non riuscita." } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 66f30f93f96..7143e958f99 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -9820,6 +9820,14 @@ "message": "料金が高すぎる", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "1年間無料" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index c4069973d90..108df6dcddb 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index b23e2e3cbac..0d08d207748 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 49d834e9cae..c3b4fe8ebd3 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 33d812d1537..4063e7c62da 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 9b1b54cf0b5..120b06b8024 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -94,7 +94,7 @@ "message": "Piešķirt dalībniekiem uzdevumus, lai pārraudzītu virzību" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Tiklīdz lietotnes ir izskatītas un atzīmētas kā būtiskas, piešķir uzdevumus dalībniekiem nomainīt savas paroles!" }, "sendReminders": { "message": "Nosūtīt atgādinājumus" @@ -179,13 +179,13 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Dati netika atrasti" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Ievieto savas apvienības pieteikšanās datus, lai uzsāktu Access Intelligence izmantošanu. Tiklīdz to izdarīsi, varēsi:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Atzīmēt lietotnes kā būtiskas" }, "feature1Description": { "message": "This will help you remove risks to your most important applications first." @@ -5810,7 +5810,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Visi vienumi piederēs apvienībai un tiks tajā saglabāti, iespējojot visaptverošu pārvaldību, redzamību un ziņošanu apvienībā. Kad ieslēgta, noklusējuma krājums, kurā glabātat vienumus, būs pieejams katram dalībniekam. Uzzināt vairāk par ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -9820,6 +9820,14 @@ "message": "Pārāk dārgi", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Pārslēdzas uz bezmaksas plānu", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Pārslēdzas uz bezmaksas apvienību", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "1 gadu bez maksas" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Bitwarden pārlūka paplašinājums tika veiksmīgi atvērts. Tagad var pārskatīt savas riskam pakļautās paroles." }, - "openExtensionManuallyPart1": { - "message": "Mums bija sarežģījumi Bitwarden pārlūka paplašinājuma atvēršanā. Rīkjoslā jāatver Bitwarden ikona", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "rīkjoslā.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Abonements drīz tiks atjaunots. Lai nodrošinātu nepārtrauktu pakalpojumu, pirms $RENEWAL_DATE$ jāsazinās ar $RESELLER$, lai apstiprinātu atjaunošanu.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden paplašinājums uzstādīts." }, - "openTheBitwardenExtension": { - "message": "Atvērt Bitwarden paplašinājumu" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Bitwarden paplašinājums ir uzstādīts. Atver paplašinājumu, lai pieteiktos un sāktu automātsko aizpildīšanu!" + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden paplašinājums ir uzstādīts." }, "openExtensionToAutofill": { "message": "Jāatver paplašinājums, lai pieteiktos un uzsāktu automātisko aizpildi." @@ -11687,6 +11684,14 @@ "message": "Mācīšanāš centrs", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Ja paplašinājums neatvērās, var būt nepieciešams atvērt Bitwarden ar ikonu ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " rīkjoslā.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Palīdzības centrs", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12119,13 +12124,13 @@ "message": "Uzsākt ģimenes plāna bezmaksas izmēģinājumu" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Liegt konta izveidošanu pieteiktajiem domēniem" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Neļaut lietotājiem kontu izveidošanu ārpus apvienības ar e-pasta adresēm no pieteikajiem domēniem." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Domēnam jābūt pieteiktam pirms šīs pamatnostādnes aktivēšanas." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Jāuzstāda atslēgšanas veids, lai mainītu glabātavas noildzes darbību." @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Vai tiešām turpināt?" + }, + "userVerificationFailed": { + "message": "Lietotāja apliecināšana neizdevās." } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 1632226b9ce..5d7c304216c 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index b71d94fe31e..82585984958 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index b23e2e3cbac..0d08d207748 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 33ff6b1fb58..87664f952a1 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -9820,6 +9820,14 @@ "message": "For dyrt", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratis i 1 år" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Hjelpesenter", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index d87792ef4b5..e2e310d7031 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 0d8840a1889..fadbaa923d5 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -9820,6 +9820,14 @@ "message": "Te duur", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Overstappen naar gratis abonnement", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Overstappen naar gratis organisatie", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "1 jaar gratis" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "De Bitwarden-browserextensie is geopend. Je kunt nu je risicovolle wachtwoorden bekijken." }, - "openExtensionManuallyPart1": { - "message": "We konden de Bitwarden-browserextensie niet openen. Open het Bitwarden-pictogram", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "vanaf de werkbalk.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Je abonnement wordt binnenkort verlengd. Neem voor $RENEWAL_DATE$ contact op met $RESELLER$ om je verlenging te bevestigen en een ononderbroken service te verzekeren.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extensie geïnstalleerd!" }, - "openTheBitwardenExtension": { - "message": "De Bitwarden-extensie openen" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "De Bitwarden-extensie is geïnstalleerd! Open de extensie om in te loggen en te beginnen met automatisch invullen." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden-extensie geïnstalleerd!" }, "openExtensionToAutofill": { "message": "Open de extensie om in te loggen en te beginnen met automatisch invullen." @@ -11687,6 +11684,14 @@ "message": "Leercentrum", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Als de extensie niet is geopend, moet je misschien Bitwarden via het pictogram ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " op de werkbalk openen.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Helpcentrum", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Weet je zeker dat je wilt doorgaan?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 2777a14d5c7..8dc4b88b647 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index b23e2e3cbac..0d08d207748 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 38b7fb51de3..5db5acc944f 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -9820,6 +9820,14 @@ "message": "Zbyt drogo", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Za darmo na 1 rok" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Pomyślnie otwarto rozszerzenie do przeglądarki. Teraz możesz przejrzeć swoje hasła zagrożone." }, - "openExtensionManuallyPart1": { - "message": "Wystąpił problem z otwarciem rozszerzenia przeglądarki. Otwórz ikonę Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "z paska narzędzi.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Twoja subskrypcja wkrótce zostanie odnowiona. Aby zapewnić ciągłość usług, skontaktuj się z $RESELLER$, aby potwierdzić odnowienie przed $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Rozszerzenie Bitwarden zainstalowane!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Otwórz rozszerzenie, aby zalogować się i rozpocząć autouzupełnianie." @@ -11687,6 +11684,14 @@ "message": "Centrum Szkoleniowe", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Centrum Pomocy", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 09dd1b14c4a..a1fd3f271b7 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -21,13 +21,13 @@ "message": "Risco de senhas" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Você não tem permissão para editar este item" }, "reviewAtRiskPasswords": { - "message": "Revise senhas em risco (fracas, expostas, ou reutilizadas) em todos os aplicativos. Selecione seus aplicativos mais críticos para priorizar ações de segurança para que seus usuários resolvem senhas em risco." + "message": "Revise senhas em risco (fracas, expostas, ou reutilizadas) entre aplicativos. Selecione seus aplicativos mais críticos para priorizar ações de segurança para que seus usuários resolvem senhas em risco." }, "reviewAtRiskLoginsPrompt": { - "message": "Review at-risk logins" + "message": "Revisar credenciais em risco" }, "dataLastUpdated": { "message": "Última atualização dos dados: $DATE$", @@ -45,7 +45,7 @@ "message": "Membros notificados" }, "revokeMembers": { - "message": "Revogar membro" + "message": "Revogar membros" }, "restoreMembers": { "message": "Restaurar membros" @@ -63,7 +63,7 @@ } }, "createNewLoginItem": { - "message": "Criar credencial" + "message": "Criar item de credencial" }, "percentageCompleted": { "message": "$PERCENT$% concluído", @@ -91,10 +91,10 @@ "message": "Progresso de alteração de senha" }, "assignMembersTasksToMonitorProgress": { - "message": "Atribuir tarefas a membros para monitorar progresso" + "message": "Atribua tarefas a membros para monitorar o progresso" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Depois que você revisar aplicativos e os marcar como críticos, atribua tarefas aos seus membros para alterar suas senhas." }, "sendReminders": { "message": "Enviar lembretes" @@ -103,10 +103,10 @@ "message": "Ao marcar aplicativos como críticos, eles aparecerão aqui." }, "viewAtRiskMembers": { - "message": "Visualizar membros em risco" + "message": "Ver membros em risco" }, "viewAtRiskApplications": { - "message": "Visualizar aplicativos em risco" + "message": "Ver aplicativos em risco" }, "criticalApplicationsAreAtRisk": { "message": "$COUNT$ aplicativos críticos dos $TOTAL$ estão em risco devido a senhas em risco", @@ -131,7 +131,7 @@ } }, "criticalApplicationsMarked": { - "message": "critical applications marked" + "message": "aplicativos críticos marcados" }, "countOfCriticalApplications": { "message": "$COUNT$ aplicativos críticos", @@ -161,7 +161,7 @@ } }, "newPasswordsAtRisk": { - "message": "$COUNT$ new passwords at-risk", + "message": "$COUNT$ novas senhas em risco", "placeholders": { "count": { "content": "$1", @@ -179,40 +179,40 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Nenhum dado encontrado" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Importe os dados de autenticação da sua organização para começar com a Inteligência de Acesso. Depois de fazer isso, você poderá:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Marque aplicativos como críticos" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Isso te ajudará a remover riscos dos seus aplicativos mais importantes primeiro." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Ajude os membros a melhorar sua segurança" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Atribua membros em risco tarefas guiadas de segurança para atualizar as credenciais." }, "feature3Title": { - "message": "Monitor progress" + "message": "Monitore o progresso" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Rastreie alterações ao longo do tempo para mostrar melhorias de segurança." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Gerar relatório" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Você está pronto para começar a gerar relatórios. Depois de gerar, você poderá:" }, "noCriticalApplicationsTitle": { "message": "Você não marcou nenhum aplicativo como crítico" }, "noCriticalApplicationsDescription": { - "message": "Selecione os seus aplicativos mais críticos para priorizar ações de segurança de correção de senhas em risco dos seus usuários." + "message": "Selecione os seus aplicativos mais críticos para priorizar ações de segurança dos seus usuários de correção de senhas em risco." }, "markCriticalApplications": { "message": "Selecionar aplicativos críticos" @@ -236,7 +236,7 @@ "message": "Aplicativos marcados como críticos" }, "criticalApplicationsMarkedSuccess": { - "message": "$COUNT$ applications marked as critical", + "message": "$COUNT$ aplicativos marcados como críticos", "placeholders": { "count": { "content": "$1", @@ -260,19 +260,19 @@ "message": "Total de senhas" }, "searchApps": { - "message": "Procurar aplicativos" + "message": "Buscar aplicativos" }, "atRiskMembers": { "message": "Membros em risco" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Esses membros têm acesso a itens vulneráveis de aplicativos críticos." }, "membersWithAtRiskPasswords": { - "message": "Members with at-risk passwords" + "message": "Membros com senhas em risco" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Membros da sua organização serão atribuídos a uma tarefa para alterar senhas vulneráveis. Eles receberão uma notificação dentro da sua extensão de navegador do Bitwarden." }, "membersAtRiskCount": { "message": "$COUNT$ membros em risco", @@ -302,19 +302,19 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Esses membros estão se conectando a aplicativos críticos com senhas fracas, expostas, ou reutilizadas." }, "atRiskMembersDescriptionNone": { - "message": "Não há nenhum membro se conectando em aplicativos com senhas fracas, expostas, ou reutilizadas." + "message": "Não há nenhum membro se conectando a aplicativos com senhas fracas, expostas, ou reutilizadas." }, "atRiskApplicationsDescription": { "message": "Esses aplicativos têm senhas fracas, expostas, ou reutilizadas." }, "atRiskApplicationsDescriptionNone": { - "message": "Não há aplicativos com senhas fracas, expostas ou reutilizadas." + "message": "Não há aplicativos com senhas fracas, expostas, ou reutilizadas." }, "atRiskMembersDescriptionWithApp": { - "message": "Esses membros estão conectando-se no $APPNAME$ com senhas fracas, expostas, ou reutilizadas.", + "message": "Esses membros estão se conectando a $APPNAME$ com senhas fracas, expostas, ou reutilizadas.", "placeholders": { "appname": { "content": "$1", @@ -344,7 +344,7 @@ "message": "Aplicativos que precisam de revisão" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "Revisar aplicativos novos" }, "newApplicationsWithCount": { "message": "$COUNT$ aplicativos novos", @@ -362,13 +362,13 @@ "message": "Revisar agora" }, "allCaughtUp": { - "message": "All caught up!" + "message": "Tudo pronto!" }, "noNewApplicationsToReviewAtThisTime": { - "message": "No new applications to review at this time" + "message": "Não há aplicativos novos para revisar neste momento" }, "organizationHasItemsSavedForApplications": { - "message": "Your organization has items saved for $COUNT$ applications", + "message": "A sua organização tem itens salvos para $COUNT$ aplicativos", "placeholders": { "count": { "content": "$1", @@ -377,46 +377,46 @@ } }, "reviewApplicationsToSecureItems": { - "message": "Review applications to secure the items most critical to your organization's security" + "message": "Revise os aplicativos para proteger os itens mais críticos para a segurança da sua organização" }, "reviewApplications": { - "message": "Review applications" + "message": "Revisar aplicativos" }, "prioritizeCriticalApplications": { "message": "Priorizar aplicativos críticos" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Selecione quais aplicativos são os mais críticos para a sua organização. E então, você poderá atribuir tarefas de segurança aos membros, para se livrar dos riscos." }, "reviewNewApplications": { - "message": "Review new applications" + "message": "Revisar aplicativos novos" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Revise aplicativos novos com itens vulneráveis e marque aqueles que você gostaria de monitorar com atenção, como crítico. E então, você poderá atribuir tarefas de segurança aos membros, para se livrar de riscos." }, "clickIconToMarkAppAsCritical": { - "message": "Click the star icon to mark an app as critical" + "message": "Clique no ícone de estrela para marcar um aplicativo como crítico" }, "markAsCriticalPlaceholder": { - "message": "A funcionalidade de marcar como crítico será implementada em uma atualização futura" + "message": "O recurso de marcar como crítico será implementado em uma atualização futura" }, "applicationReviewSaved": { - "message": "Application review saved" + "message": "Revisão de aplicativo salva" }, "newApplicationsReviewed": { - "message": "New applications reviewed" + "message": "Novos aplicativos revisados" }, "errorSavingReviewStatus": { - "message": "Error saving review status" + "message": "Erro ao salvar o estado da revisão" }, "pleaseTryAgain": { - "message": "Please try again" + "message": "Tente novamente" }, "unmarkAsCritical": { "message": "Desmarcar como crítico" }, "criticalApplicationUnmarkedSuccessfully": { - "message": "Aplicativo desmarcado com sucesso como crítico" + "message": "Aplicativo desmarcado como crítico com sucesso" }, "whatTypeOfItem": { "message": "Que tipo de item é este?" @@ -441,19 +441,19 @@ "message": "Novo URI" }, "username": { - "message": "Nome de Usuário" + "message": "Nome de usuário" }, "password": { "message": "Senha" }, "newPassword": { - "message": "Nova senha" + "message": "Senha nova" }, "passphrase": { - "message": "Frase Secreta" + "message": "Frase secreta" }, "notes": { - "message": "Notas" + "message": "Anotações" }, "privateNote": { "message": "Anotação privada" @@ -468,13 +468,13 @@ "message": "Nome do titular do cartão" }, "loginCredentials": { - "message": "Credenciais de login" + "message": "Credenciais de acesso" }, "personalDetails": { "message": "Detalhes pessoais" }, "identification": { - "message": "Identidade" + "message": "Identificação" }, "contactInfo": { "message": "Informação de contato" @@ -483,7 +483,7 @@ "message": "Detalhes do cartão" }, "cardBrandDetails": { - "message": "Detalhes $BRAND$", + "message": "Detalhes da $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -504,7 +504,7 @@ "message": "Site (URI)" }, "websiteUriCount": { - "message": "$COUNT$° site (URI)", + "message": "Site (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": { @@ -569,13 +569,13 @@ "message": "Código de segurança / CVV" }, "identityName": { - "message": "Nome na identidade" + "message": "Nome da identidade" }, "company": { "message": "Empresa" }, "ssn": { - "message": "Cadastro de Pessoas Físicas (CPF)" + "message": "Número de CPF" }, "passportNumber": { "message": "Número do passaporte" @@ -659,13 +659,13 @@ "message": "Chave do autenticador (TOTP)" }, "totpHelperTitle": { - "message": "Tornar a verificação em duas etapas fácil" + "message": "Torne a verificação em 2 etapas mais simples" }, "totpHelper": { "message": "O Bitwarden pode armazenar e preencher códigos de verificação de duas etapas. Copie e cole a chave neste campo." }, "totpHelperWithCapture": { - "message": "O Bitwarden pode armazenar e preencher códigos de verificação de duas etapas. Selecione o ícone de câmera para tirar uma captura da tela do código QR de autenticador deste site, ou copie e cole a chave neste campo." + "message": "O Bitwarden pode armazenar e preencher códigos de verificação de 2 etapas. Selecione o ícone da câmera e tire uma captura de tela do código QR do autenticador nesse site ou copie e cole a chave nesse campo." }, "learnMoreAboutAuthenticators": { "message": "Saiba mais sobre os autenticadores" @@ -680,7 +680,7 @@ "message": "Texto" }, "cfTypeHidden": { - "message": "Ocultado" + "message": "Oculto" }, "cfTypeBoolean": { "message": "Booleano" @@ -784,10 +784,10 @@ "description": "Toggling an expand/collapse state." }, "checkPassword": { - "message": "Verifique se a senha foi exposta." + "message": "Confira se a senha foi exposta." }, "passwordExposed": { - "message": "Esta senha foi exposta $VALUE$ vez(es) em violações de dados. Você deve alterá-la.", + "message": "Esta senha foi exposta $VALUE$ vez(es) em vazamentos de dados. Você deve alterá-la.", "placeholders": { "value": { "content": "$1", @@ -796,7 +796,7 @@ } }, "passwordSafe": { - "message": "Esta senha não foi encontrada em violações de dados conhecidos. Deve ser seguro de usar." + "message": "Esta senha não foi encontrada em vazamentos de dados conhecidos. Deve ser segura de usar." }, "save": { "message": "Salvar" @@ -814,10 +814,10 @@ "message": "Fechar" }, "delete": { - "message": "Excluir" + "message": "Apagar" }, "favorite": { - "message": "Favorito" + "message": "Favoritar" }, "unfavorite": { "message": "Desfavoritar" @@ -826,47 +826,47 @@ "message": "Editar" }, "searchCollection": { - "message": "Pesquisar coleção" + "message": "Buscar no conjunto" }, "searchFolder": { - "message": "Pesquisar pasta" + "message": "Buscar na pasta" }, "searchFavorites": { - "message": "Pesquisar favoritos" + "message": "Buscar nos favoritos" }, "searchLogin": { - "message": "Pesquisar credenciais", + "message": "Buscar nas credenciais", "description": "Search Login type" }, "searchCard": { - "message": "Buscar cartões", + "message": "Buscar nos cartões", "description": "Search Card type" }, "searchIdentity": { - "message": "Pesquisar identidades", + "message": "Buscar nas identidades", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Pesquisar anotações seguras", + "message": "Buscar nas anotações seguras", "description": "Search Secure Note type" }, "searchVault": { - "message": "Pesquisar cofre" + "message": "Buscar no cofre" }, "searchMyVault": { - "message": "Pesquisar meu cofre" + "message": "Buscar no meu cofre" }, "searchOrganization": { - "message": "Pesquisar organização" + "message": "Buscar na organização" }, "searchMembers": { - "message": "Pesquisar membros" + "message": "Buscar nos membros" }, "searchGroups": { - "message": "Buscar grupos" + "message": "Buscar nos grupos" }, "resetSearch": { - "message": "Apagar pesquisa" + "message": "Apagar busca" }, "allItems": { "message": "Todos os itens" @@ -875,7 +875,7 @@ "message": "Favoritos" }, "taskSummary": { - "message": "Task summary" + "message": "Resumo de tarefas" }, "types": { "message": "Tipos" @@ -914,7 +914,7 @@ "message": "Pastas" }, "collections": { - "message": "Coleções" + "message": "Conjuntos" }, "firstName": { "message": "Primeiro nome" @@ -971,7 +971,7 @@ "message": "Editar item" }, "viewItem": { - "message": "Visualizar item" + "message": "Ver item" }, "newItemHeaderLogin": { "message": "Nova credencial", @@ -1030,23 +1030,23 @@ "description": "Header for edit file send" }, "viewItemHeaderLogin": { - "message": "Visualizar credencial", + "message": "Ver credencial", "description": "Header for view login item type" }, "viewItemHeaderCard": { - "message": "Visualizar cartão", + "message": "Ver cartão", "description": "Header for view card item type" }, "viewItemHeaderIdentity": { - "message": "Visualizar identidade", + "message": "Ver identidade", "description": "Header for view identity item type" }, "viewItemHeaderNote": { - "message": "Visualizar anotação", + "message": "Ver anotação", "description": "Header for view note item type" }, "viewItemHeaderSshKey": { - "message": "Visualizar chave SSH", + "message": "Ver chave SSH", "description": "Header for view SSH key item type" }, "new": { @@ -1063,7 +1063,7 @@ "message": "Nome do item" }, "ex": { - "message": "ex.", + "message": "p. ex.", "description": "Short abbreviation for 'example'." }, "other": { @@ -1215,22 +1215,22 @@ "message": "Mover selecionados" }, "selectAll": { - "message": "Marcar tudo" + "message": "Selecionar tudo" }, "unselectAll": { - "message": "Desmarcar tudo" + "message": "Deselecionar tudo" }, "launch": { "message": "Abrir" }, "newAttachment": { - "message": "Adicionar Novo Anexo" + "message": "Adicionar novo anexo" }, "deletedAttachment": { - "message": "Anexo excluído" + "message": "Anexo apagado" }, "deleteAttachmentConfirmation": { - "message": "Tem certeza que deseja excluir esse anexo?" + "message": "Tem certeza que quer apagar este anexo?" }, "attachmentSaved": { "message": "Anexo salvo" @@ -1291,7 +1291,7 @@ "message": "Apagar anexo" }, "deleteItemConfirmation": { - "message": "Você tem certeza que deseja enviar este item para a lixeira?" + "message": "Tem certeza que quer enviar este item para a lixeira?" }, "deletedItem": { "message": "Item enviado para a lixeira" @@ -1303,7 +1303,7 @@ "message": "Itens movidos" }, "overwritePasswordConfirmation": { - "message": "Você tem certeza que deseja substituir a senha atual?" + "message": "Tem certeza que quer substituir a senha atual?" }, "editedFolder": { "message": "Pasta salva" @@ -1312,7 +1312,7 @@ "message": "Pasta adicionada" }, "deleteFolderConfirmation": { - "message": "Você tem certeza que deseja excluir esta pasta?" + "message": "Você tem certeza que deseja apagar esta pasta?" }, "deletedFolder": { "message": "Pasta apagada" @@ -1330,7 +1330,7 @@ "message": "Acessando" }, "loggedOut": { - "message": "Sessão encerrada" + "message": "Desconectado" }, "loggedOutDesc": { "message": "Você foi desconectado de sua conta." @@ -1342,7 +1342,7 @@ "message": "Reiniciar cadastro" }, "expiredLink": { - "message": "Link expirado" + "message": "Link vencido" }, "pleaseRestartRegistrationOrTryLoggingIn": { "message": "Reinicie o cadastro ou tente conectar-se." @@ -1351,10 +1351,10 @@ "message": "Você pode já ter uma conta" }, "logOutConfirmation": { - "message": "Você tem certeza que deseja sair?" + "message": "Tem certeza que quer se desconectar?" }, "logOut": { - "message": "Encerrar sessão" + "message": "Desconectar" }, "ok": { "message": "Ok" @@ -1369,19 +1369,19 @@ "message": "Localização" }, "loginOrCreateNewAccount": { - "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro." + "message": "Conecte-se ou crie uma conta para acessar seu cofre seguro." }, "loginWithDevice": { "message": "Conectar-se com dispositivo" }, "loginWithDeviceEnabledNote": { - "message": "O login com dispositivo deve estar ativado nas configurações do aplicativo do Bitwarden. Precisa de outra opção?" + "message": "A autenticação com dispositivo deve ser configurada nas configurações do aplicativo móvel do Bitwarden. Precisa de outra opção?" }, "needAnotherOptionV1": { "message": "Precisa de outra opção?" }, "loginWithMasterPassword": { - "message": "Entrar com senha principal" + "message": "Conectar-se com senha principal" }, "readingPasskeyLoading": { "message": "Lendo a chave de acesso..." @@ -1393,16 +1393,16 @@ "message": "A autenticação da chave de acesso falhou. Tente novamente." }, "useADifferentLogInMethod": { - "message": "Usar um método de entrada diferente" + "message": "Usar um método de autenticação diferente" }, "logInWithPasskey": { - "message": "Entrar com chave de acesso" + "message": "Conectar-se com chave de acesso" }, "useSingleSignOn": { "message": "Usar autenticação única" }, "yourOrganizationRequiresSingleSignOn": { - "message": "Your organization requires single sign-on." + "message": "A sua organização requer o uso da autenticação única." }, "welcomeBack": { "message": "Boas-vindas de volta" @@ -1411,16 +1411,16 @@ "message": "Chave de acesso inválida. Tente novamente." }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "A 2FA não é suportada para chaves de acesso. Atualize o app para entrar." + "message": "A 2FA não é suportada para chaves de acesso. Atualize o aplicativo para se conectar." }, "loginWithPasskeyInfo": { - "message": "Use uma chave de acesso gerada que te conectará automaticamente sem uma senha. Biometrias como reconhecimento facial ou impressão digital, ou outro método de segurança FIDO2 verificarão sua identidade." + "message": "Use uma chave de acesso gerada que te conectará automaticamente sem uma senha. A biometria, como a reconhecimento facial ou impressão digital, ou outro método de segurança do FIDO2 verificarão sua identidade." }, "newPasskey": { "message": "Nova chave de acesso" }, "learnMoreAboutPasswordless": { - "message": "Saiba mais sobre acesso sem senha" + "message": "Saiba mais sobre o passwordless" }, "creatingPasskeyLoading": { "message": "Criando chave de acesso..." @@ -1459,10 +1459,10 @@ "message": "Usada para criptografia" }, "loginWithPasskeyEnabled": { - "message": "Entrar com chave de acesso ativado" + "message": "Autenticação com chave de acesso ativada" }, "passkeySaved": { - "message": "$NAME$ salvo", + "message": "$NAME$ salva", "placeholders": { "name": { "content": "$1", @@ -1477,7 +1477,7 @@ "message": "Remover chave de acesso" }, "removePasskeyInfo": { - "message": "Se todas as chaves de acesso forem removidas, não será mais possível entrar em novos dispositivos sem sua senha principal." + "message": "Se todas as chaves de acesso forem removidas, não será mais possível se conectar em novos dispositivos sem sua senha principal." }, "passkeyLimitReachedInfo": { "message": "Limite de chaves de acesso atingido. Remova uma chave de acesso para adicionar outra." @@ -1492,10 +1492,10 @@ "message": "Novo no Bitwarden?" }, "setAStrongPassword": { - "message": "Defina uma senha forte" + "message": "Configure uma senha forte" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Termine de criar a sua conta definindo uma senha" + "message": "Termine de criar a sua conta configurando uma senha" }, "newAroundHere": { "message": "Novo por aqui?" @@ -1504,25 +1504,25 @@ "message": "Iniciar período de teste" }, "logIn": { - "message": "Entrar" + "message": "Conectar-se" }, "logInToBitwarden": { - "message": "Entrar no Bitwarden" + "message": "Conecte-se ao Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Digite o código enviado por e-mail" + "message": "Digite o código enviado ao seu e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { "message": "Digite o código do seu aplicativo autenticador" }, "pressYourYubiKeyToAuthenticate": { - "message": "Pressione sua YubiKey para autenticar" + "message": "Pressione sua YubiKey para autenticar-se" }, "authenticationTimeout": { - "message": "Tempo de autenticação esgotado" + "message": "Tempo limite da autenticação atingido" }, "authenticationSessionTimedOut": { - "message": "A sessão de autenticação expirou. Reinicie o processo de entrada." + "message": "A sessão de autenticação expirou. Reinicie o processo de autenticação." }, "verifyYourIdentity": { "message": "Verifique sua identidade" @@ -1537,10 +1537,10 @@ "message": "O que é um dispositivo?" }, "aDeviceIs": { - "message": "Um dispositivo é uma instalação única do aplicativo Bitwarden em qual você se conectou. Reinstalar, limpar os dados do aplicativo ou limpar seus cookies pode resultar em um dispositivo aparecendo várias vezes." + "message": "Um dispositivo é uma instalação única do aplicativo do Bitwarden em qual você se conectou. Reinstalar, limpar os dados do aplicativo ou limpar seus cookies pode resultar em um dispositivo aparecendo várias vezes." }, "logInInitiated": { - "message": "Login iniciado" + "message": "Autenticação iniciada" }, "logInRequestSent": { "message": "Solicitação enviada" @@ -1549,13 +1549,13 @@ "message": "Enviar" }, "emailAddressDesc": { - "message": "Você usará o seu endereço de e-mail para a iniciar sessão." + "message": "Você usará o seu endereço de e-mail para se conectar." }, "yourName": { "message": "Seu nome" }, "yourNameDesc": { - "message": "Como devemos chamá-lo?" + "message": "Como devemos te chamar?" }, "masterPass": { "message": "Senha principal" @@ -1570,7 +1570,7 @@ "message": "Uma dica de senha principal pode ajudá-lo(a) a lembrar a senha caso você esqueça." }, "reTypeMasterPass": { - "message": "Digite novamente a senha principal" + "message": "Redigitar senha principal" }, "masterPassHint": { "message": "Dica da senha principal (opcional)" @@ -1582,7 +1582,7 @@ "message": "Dica da senha principal" }, "masterPassHintText": { - "message": "Se você esquecer sua senha, a dica da senha pode ser enviada ao seu e-mail. $CURRENT$/$MAXIMUM$ caracteres máximos.", + "message": "Se você esquecer sua senha, a dica da senha pode ser enviada ao seu e-mail. $CURRENT$ do máximo de $MAXIMUM$ caracteres.", "placeholders": { "current": { "content": "$1", @@ -1604,13 +1604,13 @@ "message": "Solicitar dica" }, "requestPasswordHint": { - "message": "Dica da senha principal" + "message": "Solicitar dica da senha" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Digite o endereço de e-mail da sua conta e sua dica da senha será enviada para você" + "message": "Digite o endereço de e-mail da sua conta e dica da sua senha será enviada para você" }, "getMasterPasswordHint": { - "message": "Obter dica da senha principal" + "message": "Receber dica da senha principal" }, "emailRequired": { "message": "O endereço de e-mail é obrigatório." @@ -1622,7 +1622,7 @@ "message": "A senha principal é obrigatória." }, "confirmMasterPasswordRequired": { - "message": "A senha principal é obrigatória." + "message": "É necessário redigitar a senha principal." }, "masterPasswordMinlength": { "message": "A senha principal deve ter pelo menos $VALUE$ caracteres.", @@ -1638,13 +1638,13 @@ "message": "A confirmação da senha principal não corresponde." }, "newAccountCreated": { - "message": "A sua nova conta foi criada! Agora você pode iniciar a sessão." + "message": "A sua conta nova foi criada! Agora você pode se conectar." }, "newAccountCreated2": { - "message": "Sua nova conta foi criada!" + "message": "Sua conta nova foi criada!" }, "youHaveBeenLoggedIn": { - "message": "Você está conectado!" + "message": "Você foi conectado!" }, "trialAccountCreated": { "message": "Conta criada com sucesso." @@ -1674,7 +1674,7 @@ "message": "Desbloquear" }, "loggedInAsEmailOn": { - "message": "Entrou como $EMAIL$ em $HOSTNAME$.", + "message": "Conectado como $EMAIL$ em $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -1690,7 +1690,7 @@ "message": "Senha principal inválida" }, "invalidMasterPasswordConfirmEmailAndHost": { - "message": "Senha principal inválida. Confirme se seu e-mail está correto e sua conta foi criada em $HOST$.", + "message": "Senha principal inválida. Confirme que seu e-mail está correto e que sua conta foi criada em $HOST$.", "placeholders": { "host": { "content": "$1", @@ -1726,19 +1726,19 @@ "message": "Adicione itens usados frequentemente aos favoritos para acesso rápido." }, "noSearchResults": { - "message": "Nenhum resultado de pesquisa" + "message": "Nenhum resultado de busca" }, "clearFiltersOrTryAnother": { - "message": "Limpar filtros ou tentar outro termo de pesquisa" + "message": "Limpe os filtros ou tente outro termo de busca" }, "noPermissionToViewAllCollectionItems": { - "message": "Você não tem permissão para visualizar todos os itens nesta coleção." + "message": "Você não tem permissão para ver todos os itens neste conjunto." }, "youDoNotHavePermissions": { - "message": "Você não pode acessar esta coleção" + "message": "Você não tem permissões para esse conjunto" }, "noCollectionsInList": { - "message": "Não há coleções para listar." + "message": "Não há conjuntos para listar." }, "noGroupsInList": { "message": "Não há grupos para listar." @@ -1756,7 +1756,7 @@ "message": "Nova organização" }, "noOrganizationsList": { - "message": "Você não pertence a nenhuma organização. Organizações permitem-lhe compartilhar itens em segurança com outros usuários." + "message": "Você não pertence à nenhuma organização. Organizações te permitem compartilhar itens em segurança com outros usuários." }, "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." @@ -1817,19 +1817,19 @@ "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Usar código de recuperação" + "message": "Usar seu código de recuperação" }, "insertU2f": { - "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele." + "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ela tiver um botão, toque nele." }, "loginUnavailable": { - "message": "Entrada indisponível" + "message": "Autenticação indisponível" }, "noTwoStepProviders": { "message": "Esta conta tem a autenticação em duas etapas ativada. No entanto, nenhum dos provedores de autenticação em duas etapas configurados são suportados por este navegador web." }, "noTwoStepProviders2": { - "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como um aplicativo de autenticação)." + "message": "Utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como um aplicativo de autenticação)." }, "twoStepOptions": { "message": "Opções de autenticação em duas etapas" @@ -1844,7 +1844,7 @@ "message": "Chave de recuperação inválida" }, "authenticatorAppTitle": { - "message": "Aplicativo de autenticação" + "message": "Aplicativo autenticador" }, "authenticatorAppDescV2": { "message": "Digite um código gerado por um aplicativo autenticador como o Bitwarden Authenticator.", @@ -1861,7 +1861,7 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.", + "message": "Verifique com o Duo Security para sua organização utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { @@ -1898,10 +1898,10 @@ "message": "Organizações" }, "moveToOrgDesc": { - "message": "Escolha uma organização para a qual deseja mover este item. Mudar para uma organização transfere a propriedade do item para essa organização. Você não será mais o proprietário direto deste item depois que ele for movido." + "message": "Escolha uma organização para a qual deseja mover este item. Mover para uma organização transfere a propriedade do item para essa organização. Você não será mais o proprietário direto deste item depois que ele for movido." }, "collectionsDesc": { - "message": "Edite as coleções com as quais este item está sendo compartilhado. Somente usuários da organização com acesso a estas coleções poderão ver esse item." + "message": "Edite os conjuntos com os quais este item está sendo compartilhado. Somente usuários da organização com acesso a estes conjuntos poderão ver esse item." }, "deleteSelectedItemsDesc": { "message": "$COUNT$ item(ns) serão enviados para a lixeira.", @@ -1913,7 +1913,7 @@ } }, "deleteSelectedCollectionsDesc": { - "message": "$COUNT$ coleção(ões) serão apagadas para sempre.", + "message": "$COUNT$ conjunto(s) serão apagadas para sempre.", "placeholders": { "count": { "content": "$1", @@ -1925,7 +1925,7 @@ "message": "Tem certeza que deseja continuar?" }, "moveSelectedItemsDesc": { - "message": "Escolha a pasta para a qual você deseja mover os $COUNT$ itens selecionados.", + "message": "Escolha a pasta para a qual você deseja adicionar o(s) $COUNT$ item(ns) selecionado(s).", "placeholders": { "count": { "content": "$1", @@ -1943,13 +1943,13 @@ "message": "Copiar UUID" }, "errorRefreshingAccessToken": { - "message": "Erro ao acessar token de recarregamento" + "message": "Erro de recarregamento do token de acesso" }, "errorRefreshingAccessTokenDesc": { - "message": "Nenhum token de atualização ou chave de API foi encontrado. Tente sair e entrar novamente." + "message": "Nenhum token de atualização ou chave de API foi encontrado. Tente se desconectar e se conectar novamente." }, "warning": { - "message": "Aviso" + "message": "Atenção" }, "confirmVaultExport": { "message": "Confirmar exportação do cofre" @@ -1958,7 +1958,7 @@ "message": "Confirmar exportação de segredos" }, "exportWarningDesc": { - "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua o arquivo imediatamente após terminar de usá-lo." + "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague o arquivo imediatamente após terminar de usá-lo." }, "exportSecretsWarningDesc": { "message": "Esta exportação contém seus dados de segredos em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague-o imediatamente após terminar de usá-lo." @@ -1991,7 +1991,7 @@ "message": "Esta senha será usada para exportar e importar este arquivo" }, "confirmMasterPassword": { - "message": "Confirme a senha principal" + "message": "Confirmar senha principal" }, "confirmFormat": { "message": "Confirmar formato" @@ -2006,7 +2006,7 @@ "message": "Use a chave de criptografia da sua conta, derivada do nome de usuário e senha principal da sua conta, para criptografar a exportação e restringir a importação para apenas a conta atual do Bitwarden." }, "passwordProtectedOptionDescription": { - "message": "Defina uma senha para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografar." + "message": "Configure uma senha de arquivo para criptografar a exportação e importá-la para qualquer conta do Bitwarden usando a senha para descriptografá-la." }, "exportTypeHeading": { "message": "Tipo da exportação" @@ -2015,7 +2015,7 @@ "message": "Restrita à conta" }, "passwordProtected": { - "message": "Protegido por senha" + "message": "Protegida por senha" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { "message": "\"Senha do arquivo\" e \"Confirmar senha do arquivo\" não correspondem." @@ -2030,16 +2030,16 @@ "message": "Dados do cofre exportados" }, "passwordGenerator": { - "message": "Gerador de senha" + "message": "Gerador de senhas" }, "minComplexityScore": { - "message": "Pontuação de complexidade mínima" + "message": "Pontuação mínima de complexidade" }, "minNumbers": { "message": "Mínimo de números" }, "minSpecial": { - "message": "Mínimo de especiais", + "message": "Mínimo de caracteres especiais", "description": "Minimum special characters" }, "ambiguous": { @@ -2078,14 +2078,14 @@ "message": "Separador das palavras" }, "capitalize": { - "message": "Iniciais em Maiúsculas", + "message": "Iniciais maiúsculas", "description": "Make the first letter of a word uppercase." }, "includeNumber": { "message": "Incluir número" }, "generatorPolicyInEffect": { - "message": "Os requisitos de política empresarial foram aplicados às suas opções de gerador.", + "message": "Os requisitos da política empresarial foram aplicados às opções do seu gerador.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { @@ -2101,13 +2101,13 @@ "message": "Se continuar, todos os itens serão apagados para sempre do histórico do gerador. Tem certeza que deseja continuar?" }, "noPasswordsInList": { - "message": "Não existem senhas para listar." + "message": "Não há senhas para listar." }, "clearHistory": { "message": "Limpar histórico" }, "nothingToShow": { - "message": "Nada a mostrar" + "message": "Nada para mostrar" }, "nothingGeneratedRecently": { "message": "Você não gerou nada recentemente" @@ -2123,7 +2123,7 @@ "message": "Alterar e-mail" }, "changeEmailTwoFactorWarning": { - "message": "Prosseguir irá alterar o endereço de e-mail da sua conta. Isso não mudará o endereço de e-mail usado para autenticação de dois fatores. Você pode alterar esse endereço de e-mail nas configurações de autenticação de duas etapas." + "message": "Prosseguir irá alterar o endereço de e-mail da sua conta. Isso não mudará o endereço de e-mail usado para autenticação de duas etapas. Você pode alterar esse endereço de e-mail nas configurações de autenticação de duas etapas." }, "newEmail": { "message": "Novo e-mail" @@ -2144,13 +2144,13 @@ "message": "O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "changePasswordWarning": { - "message": "Ao alterar sua senha, você precisará entrar com a sua senha nova. Sessões ativas em outros dispositivos serão desconectados dentro de uma hora." + "message": "Ao alterar sua senha, você precisará se conectar com a sua senha nova. Sessões ativas em outros dispositivos serão desconectadas dentro de uma hora." }, "emailChanged": { "message": "E-mail salvo" }, "logBackIn": { - "message": "Por favor, reinicie a sessão." + "message": "Conecte-se novamente." }, "currentSession": { "message": "Sessão atual" @@ -2159,7 +2159,7 @@ "message": "Solicitação pendente" }, "logBackInOthersToo": { - "message": "Por favor, reinicie a sessão. Se estiver usando outros aplicativos do Bitwarden, encerre a sessão e reinicie também." + "message": "Conecte-se novamente. Se estiver usando outros aplicativos do Bitwarden, desconecte-se e conecte-se neles também." }, "changeMasterPassword": { "message": "Alterar senha principal" @@ -2183,7 +2183,7 @@ "message": "Iterações da KDF" }, "kdfIterationsDesc": { - "message": "As iterações KDF mais altas podem ajudar a proteger a sua senha principal de ser descoberta pela força bruta de um invasor. Recomendamos um valor de $VALUE$ ou mais.", + "message": "Ter iterações de KDF mais altas podem ajudar a proteger a sua senha principal de ser descoberta pela força bruta de um invasor. Recomendamos um valor de $VALUE$ ou mais.", "placeholders": { "value": { "content": "$1", @@ -2192,7 +2192,7 @@ } }, "kdfIterationsWarning": { - "message": "Usar iterações de KDF muito altas pode resultar em baixo desempenho ao entrar (e desbloquear) no Bitwarden em dispositivos com CPUs mais lentas. Recomendamos que você aumente o valor em incrementos de $INCREMENT$ e, em seguida, teste em todos os seus dispositivos.", + "message": "Configurar as suas iterações da KDF muito altas pode resultar em baixo desempenho ao se conectar no (e desbloquear o) Bitwarden em dispositivos mais lentos ou antigos. Recomendamos que você aumente o valor em incrementos de $INCREMENT$ e, em seguida, teste em todos os seus dispositivos.", "placeholders": { "increment": { "content": "$1", @@ -2205,13 +2205,13 @@ "description": "Memory refers to computer memory (RAM). MB is short for megabytes." }, "argon2Warning": { - "message": "Usar valores altos para as iterações, memória, e paralelismo da KDF pode resultar em baixo desempenho ao entrar (e desbloquear) o Bitwarden em dispositivos mais lentos ou antigos. Recomendamos alterar estes valores individualmente em incrementos pequenos, e então, testar em todos os seus dispositivos." + "message": "Configurar valores altos para as iterações, memória, e paralelismo da KDF pode resultar em baixo desempenho ao se conectar (e desbloquear) o Bitwarden em dispositivos mais lentos ou antigos. Recomendamos alterar estes valores individualmente em incrementos pequenos, e então, testar em todos os seus dispositivos." }, "kdfParallelism": { "message": "Paralelismo da KDF" }, "argon2Desc": { - "message": "Mais iterações KDF, memória e paralelismo podem ajudar a proteger sua senha principal de ser descoberta por força bruta por um invasor." + "message": "Mais iterações, memória, e paralelismo da KDF podem ajudar a proteger sua senha principal de ser descoberta por força bruta por um invasor." }, "encKeySettingsChanged": { "message": "As configurações da chave de criptografia foram salvas" @@ -2223,19 +2223,19 @@ "message": "Desautorizar sessões" }, "deauthorizeSessionsDesc": { - "message": "Preocupado por ter iniciado a sessão em outro dispositivo? Prossiga abaixo para desautorizar todos os computadores e dispositivos que tenha usado. Esta medida de segurança é recomendada se usou um computador público ou guardou acidentalmente a sua senha num dispositivo que não lhe pertence. Esta ação também apagará todas as sessões anteriores registadas iniciadas com autenticação em duas etapas." + "message": "Preocupado que sua conta esteja conectada em outro dispositivo? Prossiga abaixo para desautorizar todos os computadores e dispositivos que tenha usado. Esta medida de segurança é recomendada se usou um computador público ou salvou acidentalmente a sua senha num dispositivo que não lhe pertence. Isso também limpará todas as sessões lembradas de autenticação com duas etapas." }, "deauthorizeSessionsWarning": { "message": "O processo também desconectará você da sua sessão atual, exigindo que você se conecte novamente. Você também será solicitado a efetuar a autenticação em duas etapas novamente, se estiver ativada. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "newDeviceLoginProtection": { - "message": "Entrada de dispositivos novos" + "message": "Autenticação de dispositivos novos" }, "turnOffNewDeviceLoginProtection": { - "message": "Desativar proteção de entrada de dispositivos novos" + "message": "Desativar proteção de autenticação de dispositivos novos" }, "turnOnNewDeviceLoginProtection": { - "message": "Ativar proteção de entrada de dispositivos novos" + "message": "Ativar proteção de autenticação de dispositivos novos" }, "turnOffNewDeviceLoginProtectionModalDesc": { "message": "Continue abaixo para desativar os e-mails de verificação que o Bitwarden enviará quando se conectar a partir de um novo dispositivo." @@ -2247,7 +2247,7 @@ "message": "Com a proteção de autenticação de dispositivos novos desativada, qualquer um com a sua senha principal pode acessar sua conta de qualquer dispositivo. Para proteger sua conta sem e-mails de verificação, configure a autenticação em duas etapas." }, "accountNewDeviceLoginProtectionSaved": { - "message": "Alterações na proteção na entrada de dispositivos novos salvas" + "message": "Alterações na proteção na autenticação de dispositivos novos salvas" }, "sessionsDeauthorized": { "message": "Todas as sessões desautorizadas" @@ -2265,19 +2265,19 @@ "message": "Limpar cofre" }, "purgedOrganizationVault": { - "message": "Cofre da organização limpado." + "message": "Cofre da organização limpo." }, "vaultAccessedByProvider": { "message": "Cofre acessado pelo provedor." }, "purgeVaultDesc": { - "message": "Continue abaixo para excluir todos os itens e pastas do seu cofre. Itens que pertencem a uma organização com a qual você compartilha não serão excluídos." + "message": "Continue abaixo para apagar todos os itens e pastas no seu cofre. Itens que pertencem a uma organização com a qual você compartilha não serão apagados." }, "purgeOrgVaultDesc": { - "message": "Continue abaixo para excluir todos os itens no cofre da organização." + "message": "Continue abaixo para apagar todos os itens no cofre da organização." }, "purgeVaultWarning": { - "message": "Limpando o seu cofre permanentemente. Não pode ser desfeito." + "message": "Limpar seu cofre é para sempre. Não pode ser desfeito." }, "vaultPurged": { "message": "O cofre foi limpo." @@ -2289,7 +2289,7 @@ "message": "Prossiga abaixo para apagar sua conta e todos os dados do cofre." }, "deleteAccountWarning": { - "message": "A exclusão de sua conta é permanente. Não pode ser desfeito." + "message": "O apagamento da sua conta é permanente. Não pode ser desfeito." }, "accountDeleted": { "message": "Conta apagada" @@ -2298,7 +2298,7 @@ "message": "A sua conta foi fechada e todos os dados associados foram apagados." }, "deleteOrganizationWarning": { - "message": "O apagamento da organização é permanente. Não pode ser desfeito." + "message": "O apagamento da sua organização é permanente. Não pode ser desfeito." }, "myAccount": { "message": "Minha conta" @@ -2310,7 +2310,7 @@ "message": "Importar dados" }, "onboardingImportDataDetailsPartOne": { - "message": "Se você não tem dados para importar, você pode criar um ", + "message": "Se você não tem dados para importar, você pode criar um(a) ", "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.)" }, "onboardingImportDataDetailsLink": { @@ -2333,7 +2333,7 @@ "message": "Erro de importação" }, "importErrorDesc": { - "message": "Houve um problema com os dados que você tentou importar. Resolva os erros listados abaixo em seu arquivo de origem e tente novamente." + "message": "Houve um problema com os dados que você tentou importar. Resolva os erros listados abaixo em seu arquivo-fonte e tente novamente." }, "importSuccess": { "message": "Dados importados com sucesso" @@ -2360,7 +2360,7 @@ } }, "importFormatError": { - "message": "Os dados não estão formatados corretamente. Por favor, verifique o seu arquivo de importação e tente novamente." + "message": "Os dados não estão formatados corretamente. Verifique o seu arquivo de importação e tente novamente." }, "importNothingError": { "message": "Nada foi importado." @@ -2378,13 +2378,13 @@ "message": "Selecione uma pasta" }, "selectImportCollection": { - "message": "Selecione uma coleção" + "message": "Selecione um conjunto" }, "importTargetHintCollection": { - "message": "Selecione esta opção caso queira importar os conteúdos importados do arquivo movidos para uma coleção" + "message": "Selecione esta opção caso queira importar os conteúdos do arquivo para um conjunto" }, "importTargetHintFolder": { - "message": "Selecione esta opção caso queira importar os conteúdos importados do arquivo movidos para uma pasta" + "message": "Selecione esta opção caso queira importar os conteúdos do arquivo para uma pasta" }, "importUnassignedItemsError": { "message": "Arquivo contém itens não atribuídos." @@ -2396,7 +2396,7 @@ "message": "Selecione o arquivo de importação" }, "chooseFile": { - "message": "Escolher arquivo" + "message": "Selecionar arquivo" }, "noFileChosen": { "message": "Nenhum arquivo escolhido" @@ -2405,7 +2405,7 @@ "message": "ou copie/cole o conteúdo do arquivo de importação" }, "instructionsFor": { - "message": "$NAME$ instruções", + "message": "Instruções para $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -2424,7 +2424,7 @@ "message": "Personalize sua experiência no cofre web." }, "preferencesUpdated": { - "message": "Preferências atualizadas" + "message": "Preferências salvas" }, "language": { "message": "Idioma" @@ -2463,10 +2463,10 @@ "message": "Novo domínio personalizado" }, "newCustomDomainDesc": { - "message": "Digite uma lista de domínios separados por vírgulas. Apenas domínios \"base\" são permitidos. Não insira subdomínios. Por exemplo, digite \"google.com.br\" em vez de \"www.google.com.br\". Você também pode digitar \"androidapp://package.name\" para associar um aplicativo Android a outros domínios de site." + "message": "Digite uma lista de domínios separados por vírgulas. Apenas domínios \"base\" são permitidos. Não digite subdomínios. Por exemplo, digite \"google.com\" em vez de \"www.google.com\". Você também pode digitar \"androidapp://package.name\" para associar um aplicativo Android a outros domínios." }, "customDomainX": { - "message": "Domínio Personalizado $INDEX$", + "message": "Domínio personalizado $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2481,10 +2481,10 @@ "message": "Autenticação em duas etapas" }, "twoStepLoginEnforcement": { - "message": "Obrigatoriedade da autenticação em duas etapas" + "message": "Aplicação da autenticação em duas etapas" }, "twoStepLoginDesc": { - "message": "Proteja a sua conta exigindo uma etapa adicional ao iniciar sessão." + "message": "Proteja a sua conta exigindo uma etapa adicional ao se conectar." }, "twoStepLoginTeamsDesc": { "message": "Ative a autenticação em duas etapas para sua organização." @@ -2500,7 +2500,7 @@ "message": "Para aplicar a autenticação em duas etapas pelo Duo, use as opções abaixo." }, "twoStepLoginOrganizationSsoDesc": { - "message": "Se você tem SSO configurado ou planeja ter, a autenticação em duas etapas já pode ser aplicada por meio do seu provedor de identidade." + "message": "Se você tem o SSO configurado ou planeja ter, a autenticação em duas etapas já pode ser aplicada por meio do seu provedor de identidade." }, "twoStepLoginRecoveryWarning": { "message": "A configuração de autenticação em duas etapas pode bloqueá-lo permanentemente da sua conta no Bitwarden. Um código de recuperação permite que você acesse sua conta no caso de não poder mais usar seu provedor de login em duas etapas normalmente (exemplo: você perde seu dispositivo). O suporte do Bitwarden não será capaz de ajudá-lo se você perder o acesso à sua conta. Recomendamos que você anote ou imprima o código de recuperação e o mantenha em um lugar seguro." @@ -2509,16 +2509,16 @@ "message": "Remover tipo de item de cartão" }, "restrictedItemTypePolicyDesc": { - "message": "Não permitir que membros criem tipos de itens de cartões. Cartões existentes serão apagados automaticamente." + "message": "Não permita que membros criem cartões. Cartões existentes serão apagados automaticamente." }, "restrictCardTypeImport": { - "message": "Não é possível importar tipos de item de cartão" + "message": "Não é possível importar itens do tipo cartão" }, "restrictCardTypeImportDesc": { "message": "Uma política configurada por uma ou mais organizações impede que você importe cartões em seus cofres." }, "yourSingleUseRecoveryCode": { - "message": "Seu código de recuperação de uso único pode ser usado para desativar a autenticação em duas etapas no caso de você perder acesso ao seu provedor de login em duas etapas. O Bitwarden recomenda que você anote o código de recuperação e o mantenha em um lugar seguro." + "message": "Seu código de recuperação de uso único pode ser usado para desativar a autenticação em duas etapas no caso de você perder acesso ao seu provedor de autenticação em duas etapas. O Bitwarden recomenda que você anote o código de recuperação e o mantenha em um lugar seguro." }, "viewRecoveryCode": { "message": "Ver código de recuperação" @@ -2541,13 +2541,13 @@ "description": "Premium membership" }, "premiumMembership": { - "message": "Assinatura Premium" + "message": "Plano Premium" }, "premiumRequired": { - "message": "Requer assinatura Premium" + "message": "Requer Premium" }, "premiumRequiredDesc": { - "message": "É necessário ter uma conta premium para usar esse recurso." + "message": "Um plano Premium é necessário para usar esse recurso." }, "youHavePremiumAccess": { "message": "Você tem acesso Premium" @@ -2559,10 +2559,10 @@ "message": "Gerenciar" }, "manageCollection": { - "message": "Gerenciar coleção" + "message": "Gerenciar conjunto" }, "viewItems": { - "message": "Visualizar itens" + "message": "Ver itens" }, "viewItemsHidePass": { "message": "Ver itens, senhas ocultas" @@ -2574,10 +2574,10 @@ "message": "Editar itens, senhas ocultas" }, "disable": { - "message": "Desabilitar" + "message": "Desativar" }, "orgUserDetailsNotFound": { - "message": "Detalhes de membro não encontrados." + "message": "Detalhes do membro não encontrados." }, "revokeAccess": { "message": "Revogar acesso" @@ -2589,7 +2589,7 @@ "message": "Este provedor de autenticação em duas etapas está ativo em sua conta." }, "twoStepLoginAuthDesc": { - "message": "Insira a sua senha principal para modificar as configurações de login em duas etapas." + "message": "Digite a sua senha principal para modificar as configurações de autenticação em duas etapas." }, "twoStepAuthenticatorInstructionPrefix": { "message": "Baixe um app autenticador como o" @@ -2604,7 +2604,7 @@ "message": "." }, "continueToExternalUrlTitle": { - "message": "Continuar para $URL$?", + "message": "Continuar em $URL$?", "placeholders": { "url": { "content": "$1", @@ -2616,13 +2616,13 @@ "message": "Você está saindo do Bitwarden e abrindo um site externo em uma nova janela." }, "twoStepContinueToBitwardenUrlTitle": { - "message": "Continuar para bitwarden.com?" + "message": "Continuar em bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { "message": "O Bitwarden Authenticator permite que você armazene as chaves de autenticador e gere códigos TOTP para fluxos de verificação de 2 etapas. Saiba mais no site bitwarden.com." }, "twoStepAuthenticatorScanCodeV2": { - "message": "Leia o código QR abaixo com o seu app de autenticação ou insira a chave." + "message": "Leia o código QR abaixo com o seu app de autenticação ou cole a chave." }, "twoStepAuthenticatorQRCanvasError": { "message": "Não foi possível carregar o código QR. Tente novamente ou use a chave abaixo." @@ -2643,16 +2643,16 @@ "message": "Provedor de autenticação em duas etapas desativado." }, "twoFactorYubikeyAdd": { - "message": "Adicionar um novo Yubikey à sua conta" + "message": "Adicione uma nova YubiKey à sua conta" }, "twoFactorYubikeyPlugIn": { - "message": "Conecte o YubiKey na porta USB do seu computador." + "message": "Conecte a YubiKey na porta USB do seu computador." }, "twoFactorYubikeySelectKey": { - "message": "Selecione o YubiKey no primeiro campo vazio abaixo." + "message": "Selecione o primeiro campo vazio de entrada da YubiKey." }, "twoFactorYubikeyTouchButton": { - "message": "Toque o botão do Yubikey." + "message": "Toque o botão da YubiKey." }, "twoFactorYubikeySaveForm": { "message": "Salve o formulário." @@ -2661,10 +2661,10 @@ "message": "Devido as limitações da plataforma, YubiKeys não podem ser usadas em todos os aplicativos do Bitwarden. Você deve ativar outro provedor de autenticação em duas etapas, para que você possa acessar a sua conta quando YubiKeys não puderem ser usadas. Plataformas suportadas:" }, "twoFactorYubikeySupportUsb": { - "message": "Cofre Web, aplicativo de desktop, CLI e todas as extensões do navegador em um dispositivo com uma porta USB que pode aceitar o seu YubiKey." + "message": "Cofre web, aplicativo de computador, CLI, e todas as extensões de navegador em um dispositivo com uma porta USB que pode aceitar a sua YubiKey." }, "twoFactorYubikeySupportMobile": { - "message": "Aplicativos móveis em um dispositivo com capacidades de NFC ou uma porta USB que pode aceitar o seu YubiKey." + "message": "Aplicativos móveis em um dispositivo com capacidades de NFC ou uma porta USB que pode aceitar a sua YubiKey." }, "yubikeyX": { "message": "YubiKey $INDEX$", @@ -2685,7 +2685,7 @@ } }, "webAuthnkeyX": { - "message": "$INDEX$ª Chave WebAuthn", + "message": "Chave WebAuthn $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2700,34 +2700,34 @@ "message": "Uma das minhas chaves suporta NFC." }, "twoFactorYubikeySupportsNfcDesc": { - "message": "Se um dos seus YubiKeys oferece suporte a NFC (como um NEO YubiKey), você será solicitado em dispositivos móveis sempre que for detectada disponibilidade de NFC." + "message": "Se uma das suas YubiKeys oferece suporte a NFC (como uma YubiKey NEO), você será solicitado em dispositivos móveis sempre que for detectada disponibilidade da NFC." }, "yubikeysUpdated": { - "message": "YubiKeys atualizado" + "message": "YubiKeys atualizadas" }, "disableAllKeys": { "message": "Desativar todas as chaves" }, "twoFactorDuoDesc": { - "message": "Insira as informações do aplicativo Bitwarden no painel do administrador do Duo." + "message": "Digite as informações do aplicativo Bitwarden no painel de administração do Duo." }, "twoFactorDuoClientId": { - "message": "Id do cliente" + "message": "ID do cliente" }, "twoFactorDuoClientSecret": { "message": "Segredo do cliente" }, "twoFactorDuoApiHostname": { - "message": "Servidor da API" + "message": "Nome do servidor da API" }, "twoFactorEmailDesc": { - "message": "Siga estas etapas para configurar o login em duas etapas com e-mail:" + "message": "Siga estas etapas para configurar a autenticação em duas etapas com e-mail:" }, "twoFactorEmailEnterEmail": { - "message": "Insira o e-mail que você deseja receber o códigos de verificação" + "message": "Digite o e-mail que você deseja receber os códigos de verificação" }, "twoFactorEmailEnterCode": { - "message": "Insira o código de verificação de 6 dígitos que foi enviado pro seu e-mail" + "message": "Digite o código de verificação de 6 dígitos que foi enviado pro seu e-mail" }, "sendEmail": { "message": "Enviar e-mail" @@ -2751,31 +2751,31 @@ "message": "Dê à chave de segurança um nome amigável para identificá-la." }, "twoFactorU2fPlugInReadKey": { - "message": "Conecte a chave de segurança na porta USB do seu computador e clique no botão \"Ler Chave\"." + "message": "Conecte a chave de segurança na porta USB do seu computador e clique no botão \"Ler chave\"." }, "twoFactorU2fTouchButton": { "message": "Se a chave de segurança tiver um botão, toque nele." }, "twoFactorU2fSaveForm": { - "message": "Salvar o formulário." + "message": "Salve o formulário." }, "twoFactorU2fWarning": { - "message": "Devido às limitações da plataforma, o FIDO U2F não pode ser usado em todos os aplicativos do Bitwarden. Deve configurar outro provedor de autenticação em duas etapas para poder acessar a sua conta quando o FIDO U2F não puder ser usado. Plataformas suportadas:" + "message": "Devido às limitações da plataforma, o FIDO U2F não pode ser usado em todos os aplicativos do Bitwarden. Você deve configurar outro provedor de autenticação em duas etapas para poder acessar a sua conta quando o FIDO U2F não puder ser usado. Plataformas suportadas:" }, "twoFactorU2fSupportWeb": { - "message": "Cofre web e extensões de navegador em um desktop/laptop com um navegador que suporte U2F (Chrome, Opera, Vivaldi ou Firefox com o FIDO U2F ativado)." + "message": "Cofre web e extensões de navegador em um computador com um navegador que suporte U2F (Chrome, Opera, Vivaldi ou Firefox com o FIDO U2F ativado)." }, "twoFactorU2fWaiting": { - "message": "Esperando que você toque no botão da sua chave de segurança" + "message": "Aguardando que você toque no botão da sua chave de segurança" }, "twoFactorU2fClickSave": { - "message": "Clique no botão \"Salvar\" abaixo para ativar essa chave de segurança para a autenticação em duas etapas." + "message": "Clique no botão de \"Salvar\" abaixo para ativar essa chave de segurança para a autenticação em duas etapas." }, "twoFactorU2fProblemReadingTryAgain": { "message": "Houve um problema ao ler a chave de segurança. Tente novamente." }, "twoFactorRecoveryYourCode": { - "message": "Seu código de recuperação de login em duas etapas do Bitwarden" + "message": "Seu código de recuperação da autenticação em duas etapas do Bitwarden" }, "twoFactorRecoveryNoCode": { "message": "Você ainda não ativou nenhum provedor de autenticação em duas etapas. Depois de ativar um provedor de autenticação em duas etapas, você pode conferir aqui o seu código de recuperação." @@ -2818,7 +2818,7 @@ } }, "noUnsecuredWebsites": { - "message": "Nenhum item no seu cofre tem URIs inseguros." + "message": "Nenhum item no seu cofre tem URIs sem segurança." }, "inactive2faReport": { "message": "Autenticação em duas etapas inativa" @@ -2830,7 +2830,7 @@ "message": "Credenciais encontradas sem autenticação em duas etapas" }, "inactive2faFoundReportDesc": { - "message": "Encontramos $COUNT$ site(s) em seu(s) $VAULT$ que pode(m) não estar configurado com a autenticação em duas etapas (de acordo com 2fa.directory). Para proteger ainda mais essas contas, você deve configurar a autenticação em duas etapas.", + "message": "Encontramos $COUNT$ site(s) em seu(s) $VAULT$ que pode(m) não estar configurado(s) com a autenticação em duas etapas (de acordo com 2fa.directory). Para proteger ainda mais essas contas, você deve configurar a autenticação em duas etapas.", "placeholders": { "count": { "content": "$1", @@ -2858,7 +2858,7 @@ "message": "Senhas expostas encontradas" }, "exposedPasswordsFoundReportDesc": { - "message": "Encontramos $COUNT$ itens em seu(s) cofres $VAULT$ com senhas expostas em vazamentos conhecidos de dados. Você deve alterá-las para uma nova senha.", + "message": "Encontramos $COUNT$ itens em seu(s) cofre(s) $VAULT$ com senhas expostas em vazamentos conhecidos de dados. Você deve alterá-las para uma nova senha.", "placeholders": { "count": { "content": "$1", @@ -2871,7 +2871,7 @@ } }, "noExposedPasswords": { - "message": "Nenhum item no seu cofre tem senhas que foram expostas em violações de dados conhecidas." + "message": "Nenhum item em seu cofre tem senhas expostas em vazamentos de dados conhecidos." }, "checkExposedPasswords": { "message": "Conferir senhas expostas" @@ -2957,16 +2957,16 @@ "message": "Vazamento de dados" }, "breachDesc": { - "message": "Contas comprometidas podem expor sua informação pessoal. Dê segurança a contas vazadas ativando o 2FA ou criando uma senha mais forte." + "message": "Contas comprometidas podem expor sua informação pessoal. Proteja as contas vazadas ativando o 2FA ou criando uma senha mais forte." }, "breachCheckUsernameEmail": { - "message": "Verifique qualquer nome de usuário ou endereço de e-mail que você usa." + "message": "Confira quaisquer nomes de usuário ou endereços de e-mail que você usa." }, "checkBreaches": { - "message": "Conferir brechas" + "message": "Conferir vazamentos" }, "breachUsernameNotFound": { - "message": "$USERNAME$ não foi encontrado em nenhuma violação de dados conhecida.", + "message": "$USERNAME$ não foi encontrado em nenhum vazamento de dados conhecido.", "placeholders": { "username": { "content": "$1", @@ -2979,7 +2979,7 @@ "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { - "message": "$USERNAME$ foi encontrado em $COUNT$ violações de dados diferentes on-line.", + "message": "$USERNAME$ foi encontrado em $COUNT$ vazamentos de dados diferentes on-line.", "placeholders": { "username": { "content": "$1", @@ -3004,10 +3004,10 @@ "message": "Usuários afetados" }, "breachOccurred": { - "message": "Ocorreu uma brecha" + "message": "Ocorreu um vazamento" }, "breachReported": { - "message": "Brecha reportada" + "message": "Vazamento relatado" }, "reportError": { "message": "Ocorreu um erro ao tentar carregar o relatório. Tente novamente" @@ -3034,14 +3034,14 @@ "description": "Add more credit to your account's balance." }, "amount": { - "message": "Montante", + "message": "Valor", "description": "Dollar amount, or quantity." }, "creditDelayed": { "message": "O crédito adicionado aparecerá em sua conta após o pagamento ser totalmente processado. Alguns métodos de pagamento são mais lentos e podem levar mais tempo para processar do que outros." }, "makeSureEnoughCredit": { - "message": "Por favor, certifique-se de que sua conta tenha crédito suficiente para esta compra. Se sua conta não tiver crédito suficiente disponível, seu método de pagamento padrão será usado para completar a diferença. Você pode adicionar crédito à sua conta na página de Cobrança." + "message": "Certifique-se de que sua conta tenha crédito suficiente para esta compra. Se sua conta não tiver crédito suficiente disponível, seu método de pagamento padrão será usado para completar a diferença. Você pode adicionar crédito à sua conta na página de Cobrança." }, "notEnoughAccountCredit": { "message": "Você não tem crédito suficiente na conta para esta compra. Você pode adicionar crédito à sua conta na página de Cobrança." @@ -3054,34 +3054,34 @@ "description": "Another way of saying \"Get a Premium membership\"" }, "premiumUpdated": { - "message": "Você se tornou Premium." + "message": "Você fez upgrade para o Premium." }, "premiumUpgradeUnlockFeatures": { - "message": "Faça upgrade da sua conta para uma conta Premium e desbloqueie ótimos recursos adicionais." + "message": "Faça upgrade da sua conta para um plano Premium e desbloqueie ótimos recursos adicionais." }, "premiumSignUpStorage": { - "message": "1 GB de armazenamento de arquivos encriptados." + "message": "1 GB de armazenamento criptografado para anexo de arquivos." }, "premiumSignUpTwoStepOptions": { - "message": "Opções adicionais de autenticação em duas etapas, como YubiKey, e Duo." + "message": "Opções de autenticação em duas etapas proprietárias como YubiKey e Duo." }, "premiumSignUpEmergency": { "message": "Acesso de emergência" }, "premiumSignUpReports": { - "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro." + "message": "Higiene de senhas, saúde da conta, e relatórios sobre vazamentos de dados para manter o seu cofre seguro." }, "premiumSignUpTotp": { - "message": "Gerador de código de verificação TOTP (2FA) para logins no seu cofre." + "message": "Gerador de código de verificação TOTP (2FA) para credenciais no seu cofre." }, "premiumSignUpSupport": { "message": "Prioridade no suporte ao cliente." }, "premiumSignUpFuture": { - "message": "Todos os recursos Premium no futuro. Mais em breve!" + "message": "Todos as recursos do Premium no futuro. Mais em breve!" }, "premiumPrice": { - "message": "Tudo por apenas $PRICE$ /ano!", + "message": "Tudo por apenas $PRICE$ por ano!", "placeholders": { "price": { "content": "$1", @@ -3090,7 +3090,7 @@ } }, "premiumPriceWithFamilyPlan": { - "message": "Seja Premium por apenas $PRICE$ por ano, ou obtenha contas premium para $FAMILYPLANUSERCOUNT$ usuários e compartilhamento familiar ilimitado com um ", + "message": "Torne-se Premium por apenas $PRICE$ por ano, ou obtenha contas Premium para $FAMILYPLANUSERCOUNT$ usuários e compartilhamento familiar ilimitado com um ", "placeholders": { "price": { "content": "$1", @@ -3103,16 +3103,16 @@ } }, "bitwardenFamiliesPlan": { - "message": "Plano Bitwarden Families." + "message": "Plano Bitwarden Familías." }, "addons": { - "message": "Complementos" + "message": "Extensões" }, "premiumAccess": { "message": "Acesso Premium" }, "premiumAccessDesc": { - "message": "Você pode adicionar acesso Premium a todos os membros da sua organização a $PRICE$ por $INTERVAL$.", + "message": "Você pode adicionar acesso ao Premium a todos os membros da sua organização por $PRICE$ ao $INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -3128,10 +3128,10 @@ "message": "Armazenamento adicional (GB)" }, "additionalStorageGbDesc": { - "message": "# de GB adicional" + "message": "Número de GB adicionais" }, "additionalStorageIntervalDesc": { - "message": "Seu plano tem $SIZE$ de armazenamento criptografado de arquivos. Você pode adicionar armazenamento adicional por $PRICE$ por GB /$INTERVAL$.", + "message": "Seu plano vem com $SIZE$ de armazenamento criptografado de arquivos. Você pode adicionar armazenamento adicional por $PRICE$ por GB ao $INTERVAL$.", "placeholders": { "size": { "content": "$1", @@ -3169,7 +3169,7 @@ "message": "mês" }, "monthAbbr": { - "message": "mês.", + "message": "mês", "description": "Short abbreviation for 'month'" }, "paymentChargedAnnually": { @@ -3188,7 +3188,7 @@ "message": "Seu método de pagamento será cobrado por qualquer assinatura não paga." }, "paymentChargedWithTrial": { - "message": "Seu plano vem com um teste gratuito de 7 dias. Seu cartão não será cobrado até que o período de teste termine. Você pode cancelar a qualquer momento." + "message": "Seu plano vem com um teste grátis de 7 dias. Seu cartão não será cobrado até que o período de teste termine. Você pode cancelar a qualquer momento." }, "paymentInformation": { "message": "Informações de pagamento" @@ -3197,13 +3197,13 @@ "message": "Informações de cobrança" }, "billingTrialSubLabel": { - "message": "Seu método de pagamento não será cobrado durante o teste gratuito de 7 dias." + "message": "Seu método de pagamento não será cobrado durante o teste grátis de 7 dias." }, "creditCard": { "message": "Cartão de crédito" }, "paypalClickSubmit": { - "message": "Clique no botão do PayPal para entrar na sua conta do PayPal e, em seguida, clique no botão Enviar abaixo para continuar." + "message": "Clique no botão do PayPal para se conectar à sua conta do PayPal e, em seguida, clique no botão Enviar abaixo para continuar." }, "cancelSubscription": { "message": "Cancelar assinatura" @@ -3233,7 +3233,7 @@ "message": "Você tem certeza que deseja cancelar? Você perderá o acesso a todos os recursos dessa assinatura no final deste ciclo de faturamento." }, "canceledSubscription": { - "message": "A assinatura foi cancelada." + "message": "Assinatura cancelada" }, "neverExpires": { "message": "Nunca vence" @@ -3245,22 +3245,22 @@ "message": "Próxima cobrança" }, "nextChargeHeader": { - "message": "Next Charge" + "message": "Próxima cobrança" }, "plan": { - "message": "Plan" + "message": "Plano" }, "details": { "message": "Detalhes" }, "discount": { - "message": "discount" + "message": "desconto" }, "downloadLicense": { "message": "Baixar licença" }, "viewBillingToken": { - "message": "Ver token de cobrança" + "message": "Ver token de faturamento" }, "updateLicense": { "message": "Atualizar licença" @@ -3269,7 +3269,7 @@ "message": "Gerenciar assinatura" }, "launchCloudSubscription": { - "message": "Lançar assinatura na nuvem" + "message": "Iniciar Assinatura na Nuvem" }, "storage": { "message": "Armazenamento" @@ -3281,7 +3281,7 @@ "message": "Remover armazenamento" }, "subscriptionStorage": { - "message": "A sua assinatura tem um total de $MAX_STORAGE$ GB de armazenamento de arquivos criptografados. Você está usando $USED_STORAGE$ no momento.", + "message": "A sua assinatura tem um total de $MAX_STORAGE$ GB de armazenamento criptografado de arquivos. Você está usando $USED_STORAGE$ no momento.", "placeholders": { "max_storage": { "content": "$1", @@ -3315,11 +3315,11 @@ "message": "Nenhuma fatura paga." }, "paid": { - "message": "Pago", + "message": "Paga", "description": "Past tense status of an invoice. ex. Paid or unpaid." }, "unpaid": { - "message": "Por pagar", + "message": "Não paga", "description": "Past tense status of an invoice. ex. Paid or unpaid." }, "transactions": { @@ -3330,7 +3330,7 @@ "message": "Sem transações." }, "chargeNoun": { - "message": "Carregar", + "message": "Cobrança", "description": "Noun. A charge from a payment method." }, "refundNoun": { @@ -3353,10 +3353,10 @@ "message": "GB de armazenamento para remover" }, "storageAddNote": { - "message": "A adição de armazenamento resultará em ajustes no valor total da fatura e será cobrado imediatamente pela forma de pagamento registrada. A primeira cobrança será rateada pelo restante do ciclo de faturamento atual." + "message": "A adição de armazenamento resultará em ajustes no valor total da fatura e será cobrado imediatamente pela forma de pagamento cadastrada. A primeira cobrança será rateada pelo restante do ciclo de faturamento atual." }, "storageRemoveNote": { - "message": "A remoção do armazenamento resultará em ajustes no valor total da fatura que serão divididos em sua próxima cobrança de faturamento." + "message": "A remoção do armazenamento resultará em ajustes no valor total da fatura que serão rateados na sua próxima cobrança de faturamento." }, "adjustedStorage": { "message": "Ajustado $AMOUNT$ GB de armazenamento.", @@ -3371,10 +3371,10 @@ "message": "Contatar suporte ao cliente" }, "contactSupportShort": { - "message": "Entrar em contato com o suporte" + "message": "Contatar suporte" }, "updatedPaymentMethod": { - "message": "Atualizar forma de pagamento." + "message": "Método de pagamento atualizado." }, "purchasePremium": { "message": "Comprar Premium" @@ -3392,16 +3392,16 @@ } }, "uploadLicenseFilePremium": { - "message": "Para fazer upgrade da sua conta para uma assinatura Premium, você precisa enviar um arquivo de licença válido." + "message": "Para fazer upgrade da sua conta para um plano Premium, você precisa enviar um arquivo de licença válido." }, "uploadLicenseFileOrg": { - "message": "Para criar uma organização hospedada localmente, você precisa fazer o upload de um arquivo de licença válido." + "message": "Para criar uma organização hospedada localmente, você precisa enviar um arquivo de licença válido." }, "accountEmailMustBeVerified": { "message": "O endereço de e-mail da sua conta deve ser verificado." }, "newOrganizationDesc": { - "message": "As organizações permitem que você compartilhe partes do seu cofre com outras pessoas, além de gerenciar usuários relacionados para uma entidade específica, como uma família, uma equipe pequena ou uma empresa grande." + "message": "As organizações permitem que você compartilhe partes do seu cofre com outras pessoas, além de gerenciar usuários relacionados a uma entidade específica, como uma família, uma equipe pequena, ou uma empresa grande." }, "generalInformation": { "message": "Informações gerais" @@ -3410,7 +3410,7 @@ "message": "Nome da organização" }, "accountOwnedBusiness": { - "message": "Esta conta pertence a uma empresa." + "message": "Esta conta pertence à uma empresa." }, "billingEmail": { "message": "E-mail de cobrança" @@ -3431,10 +3431,10 @@ "message": "Vagas de usuários adicionais" }, "userSeatsDesc": { - "message": "# de assentos de usuário" + "message": "Número de vagas de usuário" }, "userSeatsAdditionalDesc": { - "message": "O seu plano vem com assentos de usuário de $BASE_SEATS$. Você pode adicionar mais usuários por $SEAT_PRICE$ por usuário /mês.", + "message": "Seu plano vem com $BASE_SEATS$ vagas de usuário. Você pode adicionar usuários adicionais por $SEAT_PRICE$ por usuário ao mês.", "placeholders": { "base_seats": { "content": "$1", @@ -3447,14 +3447,14 @@ } }, "userSeatsHowManyDesc": { - "message": "Quanto mais assentos de usuário você precisa? Você também pode adicionar mais assentos depois, se necessário." + "message": "Quanto mais vagas de usuário você precisa? Você também pode adicionar mais vagas depois, se necessário." }, "planNameFree": { "message": "Grátis", "description": "Free as in 'free beer'." }, "planDescFree": { - "message": "Para usuários de testes ou pessoais para compartilhar com $COUNT$ outro usuário.", + "message": "Para testes ou usuários pessoais para compartilhar com $COUNT$ outro usuário.", "placeholders": { "count": { "content": "$1", @@ -3463,10 +3463,10 @@ } }, "planNameFamilies": { - "message": "Families" + "message": "Famílias" }, "planDescFamilies": { - "message": "Para uso pessoal, para compartilhar com a família & amigos." + "message": "Para uso pessoal, para compartilhar com a família e amigos." }, "planNameTeams": { "message": "Equipes" @@ -3475,7 +3475,7 @@ "message": "Para empresas e outras organizações de equipe." }, "planNameTeamsStarter": { - "message": "Teams Starter" + "message": "Equipes Iniciantes" }, "planNameEnterprise": { "message": "Empresarial" @@ -3517,7 +3517,7 @@ } }, "limitedCollections": { - "message": "Limitado a $COUNT$ coleções", + "message": "Limitado a $COUNT$ conjuntos", "placeholders": { "count": { "content": "$1", @@ -3538,10 +3538,10 @@ "message": "Adicione e compartilhe com usuários ilimitados" }, "createUnlimitedCollections": { - "message": "Crie coleções ilimitadas" + "message": "Crie conjuntos ilimitados" }, "gbEncryptedFileStorage": { - "message": "$SIZE$ de armazenamento encriptado", + "message": "$SIZE$ de armazenamento criptografado", "placeholders": { "size": { "content": "$1", @@ -3565,13 +3565,13 @@ "message": "Acompanhe as ações do usuário com os registros de auditoria" }, "enforce2faDuo": { - "message": "Reforçar o 2FA com o Duo" + "message": "Aplique o 2FA com o Duo" }, "priorityCustomerSupport": { - "message": "Suporte prioritário ao cliente" + "message": "Suporte ao cliente com prioridade" }, "xDayFreeTrial": { - "message": "Avaliação gratuita de $COUNT$ dia(s), cancele a qualquer momento", + "message": "Teste grátis de $COUNT$ dia(s), cancele a qualquer momento", "placeholders": { "count": { "content": "$1", @@ -3589,7 +3589,7 @@ } }, "trialSecretsManagerThankYou": { - "message": "Obrigado por se inscrever no Bitwarden Secrets Manager para $PLAN$!", + "message": "Obrigado por se inscrever no Bitwarden Gerenciador de Segredos para $PLAN$!", "placeholders": { "plan": { "content": "$1", @@ -3598,7 +3598,7 @@ } }, "trialPaidInfoMessage": { - "message": "Seu $PLAN$ de teste de 7 dias será convertido em uma assinatura paga após 7 dias.", + "message": "Seu teste de 7 dias do $PLAN$ será convertido em uma assinatura paga após 7 dias.", "placeholders": { "plan": { "content": "$1", @@ -3610,10 +3610,10 @@ "message": "Enviamos um e-mail de confirmação para o e-mail de cobrança da sua equipe em " }, "monthly": { - "message": "Mensal" + "message": "Mensalmente" }, "annually": { - "message": "Anual" + "message": "Anualmente" }, "annual": { "message": "Anual" @@ -3628,7 +3628,7 @@ "message": "A sua nova organização está pronta!" }, "organizationUpgraded": { - "message": "Um upgrade foi feito na organização" + "message": "Upgrade feito na organização" }, "leave": { "message": "Sair" @@ -3640,16 +3640,16 @@ "message": "Você saiu da organização." }, "defaultCollection": { - "message": "Coleção padrão" + "message": "Conjunto padrão" }, "getHelp": { - "message": "Obter ajuda" + "message": "Receber ajuda" }, "getApps": { - "message": "Baixe os apps" + "message": "Baixar os apps" }, "loggedInAs": { - "message": "Sessão iniciada como" + "message": "Conectado como" }, "eventLogs": { "message": "Registro de eventos" @@ -3679,7 +3679,7 @@ "message": "Editar grupo" }, "deleteGroupConfirmation": { - "message": "Você tem certeza que deseja excluir este grupo?" + "message": "Você tem certeza que deseja apagar este grupo?" }, "deleteMultipleGroupsConfirmation": { "message": "Você tem certeza que deseja apagar os seguintes $QUANTITY$ grupo(s)?", @@ -3691,16 +3691,16 @@ } }, "removeUserConfirmation": { - "message": "Você tem certeza que deseja remover este(a) usuário(a)?" + "message": "Você tem certeza que deseja remover este usuário?" }, "removeOrgUserConfirmation": { "message": "Quando um membro é removido, ele já não mais acesso aos dados da organização, e esta ação é irreversível. Para adicionar o membro de volta à organização, ele deve ser convidado e integrado novamente." }, "revokeUserConfirmation": { - "message": "Quando um membro é revogado, ele não tem mais acesso aos dados da organização. Para restaurar rapidamente o acesso ao membro vá para a aba Revogados." + "message": "Quando um membro é revogado, ele não tem mais acesso aos dados da organização. Para restaurar rapidamente o acesso do membro vá para a aba de Revogados." }, "removeUserConfirmationKeyConnector": { - "message": "Alerta! Este usuário precisa do Conector de Chave para gerenciar sua criptografia. Remover este usuário de sua organização desativará permanentemente sua conta. Essa ação não pode ser desfeita. Você quer prosseguir?" + "message": "Alerta! Este usuário precisa do Key Connector para gerenciar sua criptografia. Remover este usuário de sua organização desativará permanentemente a conta dele. Essa ação não pode ser desfeita. Você quer prosseguir?" }, "externalId": { "message": "ID externo" @@ -3712,10 +3712,10 @@ "message": "ID externo do SSO" }, "ssoExternalIdDesc": { - "message": "O ID Externo do SSO é uma referência não criptografada entre o Bitwarden e seu provedor de SSO configurado." + "message": "O ID externo do SSO é uma referência não criptografada entre o Bitwarden e seu provedor de SSO configurado." }, "nestCollectionUnder": { - "message": "Agrupar coleção sob" + "message": "Agrupar conjunto em" }, "accessControl": { "message": "Controle de acesso" @@ -3724,25 +3724,25 @@ "message": "Somente leitura" }, "newCollection": { - "message": "Nova coleção" + "message": "Novo conjunto" }, "addCollection": { - "message": "Adicionar coleção" + "message": "Adicionar conjunto" }, "editCollection": { - "message": "Editar coleção" + "message": "Editar conjunto" }, "collectionInfo": { - "message": "Informações da coleção" + "message": "Informações do conjunto" }, "deleteCollectionConfirmation": { - "message": "Você tem certeza que deseja excluir esta coleção?" + "message": "Você tem certeza que deseja apagar este conjunto?" }, "editMember": { "message": "Editar membro" }, "fieldOnTabRequiresAttention": { - "message": "Um campo na aba '$TAB$' requer sua atenção.", + "message": "Um campo na aba de '$TAB$' requer sua atenção.", "placeholders": { "tab": { "content": "$1", @@ -3754,7 +3754,7 @@ "message": "Convide um novo usuário para sua organização digitando o endereço de e-mail da conta Bitwarden dele abaixo. Se ele não tiver uma conta no Bitwarden, ele será solicitado a criar uma nova conta." }, "inviteMultipleEmailDesc": { - "message": "Você pode convidar até $COUNT$ usuários por vez, separando-os com uma vírgula.", + "message": "Digite até $COUNT$ e-mails, separados com vírgula.", "placeholders": { "count": { "content": "$1", @@ -3769,16 +3769,16 @@ "message": "Você tem 0 convites restantes." }, "userUsingTwoStep": { - "message": "Este usuário está usando o login em duas etapas para proteger a sua conta." + "message": "Este usuário está usando a autenticação em duas etapas para proteger a sua conta." }, "search": { - "message": "Pesquisar" + "message": "Buscar" }, "invited": { - "message": "Convidado" + "message": "Convidados" }, "confirmed": { - "message": "Confirmado" + "message": "Confirmados" }, "clientOwnerEmail": { "message": "Email do proprietário do cliente" @@ -3796,16 +3796,16 @@ "message": "Administrador" }, "adminDesc": { - "message": "Gerencie o acesso à organização, todas as coleções, membros, relatórios, e configurações de segurança" + "message": "Gerencie o acesso à organização, todos os conjuntos, membros, relatórios, e configurações de segurança" }, "user": { "message": "Usuário" }, "userDesc": { - "message": "Acesse e adicione itens a coleções atribuídas" + "message": "Acesse e adicione itens aos conjuntos atribuídos" }, "all": { - "message": "Todos" + "message": "Tudo" }, "addAccess": { "message": "Adicionar acesso" @@ -3814,10 +3814,10 @@ "message": "Adicionar filtro de acesso" }, "refresh": { - "message": "Atualizar" + "message": "Recarregar" }, "timestamp": { - "message": "Timestamp" + "message": "Horário" }, "event": { "message": "Evento" @@ -3837,14 +3837,14 @@ "description": "Browser extension/addon" }, "desktop": { - "message": "Área de Trabalho", + "message": "Computador", "description": "Desktop app" }, "webVault": { "message": "Cofre web" }, "webApp": { - "message": "App web" + "message": "Aplicativo web" }, "cli": { "message": "CLI" @@ -3853,10 +3853,10 @@ "message": "Cofre web do Bitwarden" }, "bitSecretsManager": { - "message": "Gerenciador de Segredos do Bitwarden" + "message": "Bitwarden Gerenciador de Segredos" }, "loggedIn": { - "message": "Conectou" + "message": "Conectou-se" }, "changedPassword": { "message": "Senha da conta alterada" @@ -3871,10 +3871,10 @@ "message": "Conta recuperada da autenticação em duas etapas." }, "failedLogin": { - "message": "Falha na tentativa de login com senha incorreta." + "message": "Falha na tentativa de autenticação com senha incorreta." }, "failedLogin2fa": { - "message": "A tentativa de login falhou com o login incorreto em duas etapas." + "message": "Falha na tentativa de autenticação com autenticação em duas etapas errada." }, "incorrectPassword": { "message": "Senha incorreta" @@ -3899,7 +3899,7 @@ "message": "Editou as configurações da organização." }, "createdItemId": { - "message": "Item criado $ID$.", + "message": "Criou o item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3908,7 +3908,7 @@ } }, "editedItemId": { - "message": "Item editado $ID$.", + "message": "Editou o item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3917,7 +3917,7 @@ } }, "deletedItemId": { - "message": "Item $ID$ enviado para lixeira.", + "message": "Enviou o item $ID$ para a lixeira.", "placeholders": { "id": { "content": "$1", @@ -3941,7 +3941,7 @@ "message": "Ver todas as opções de autenticação" }, "viewedItemId": { - "message": "Item $ID$ visualizado.", + "message": "Visualizou o item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3950,7 +3950,7 @@ } }, "viewedPasswordItemId": { - "message": "Senha visualizada para o item $ID$.", + "message": "Visualizou a senha do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3959,7 +3959,7 @@ } }, "viewedHiddenFieldItemId": { - "message": "Campo oculto visualizado para o item $ID$.", + "message": "Visualizou o campo oculto do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3977,7 +3977,7 @@ } }, "viewedSecurityCodeItemId": { - "message": "Código de segurança visualizado para o item $ID$.", + "message": "Visualizou o código de segurança do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -3986,7 +3986,7 @@ } }, "viewCollectionWithName": { - "message": "Ver coleção - $NAME$", + "message": "Ver conjunto - $NAME$", "placeholders": { "name": { "content": "$1", @@ -4004,7 +4004,7 @@ } }, "copiedPasswordItemId": { - "message": "Senha copiada para o item $ID$.", + "message": "Copiou a senha do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4013,7 +4013,7 @@ } }, "copiedHiddenFieldItemId": { - "message": "Campo oculto copiado para o item $ID$.", + "message": "Copiou o campo oculto do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4022,7 +4022,7 @@ } }, "copiedSecurityCodeItemId": { - "message": "Código de segurança copiado para o item $ID$.", + "message": "Copiou o código de segurança do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4031,7 +4031,7 @@ } }, "autofilledItemId": { - "message": "Item $ID$ auto-preenchido.", + "message": "Preencheu automaticamente o item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4040,7 +4040,7 @@ } }, "createdCollectionId": { - "message": "Coleção criada $ID$.", + "message": "Criou o conjunto $ID$.", "placeholders": { "id": { "content": "$1", @@ -4049,7 +4049,7 @@ } }, "editedCollectionId": { - "message": "Coleção editada $ID$.", + "message": "Editou o conjunto $ID$.", "placeholders": { "id": { "content": "$1", @@ -4058,10 +4058,10 @@ } }, "deletedCollections": { - "message": "Apagou as coleções" + "message": "Conjuntos apagados" }, "deletedCollectionId": { - "message": "Coleção excluída $ID$.", + "message": "Apagou o conjunto $ID$.", "placeholders": { "id": { "content": "$1", @@ -4070,7 +4070,7 @@ } }, "editedPolicyId": { - "message": "Política $ID$ editada.", + "message": "Editou a política $ID$.", "placeholders": { "id": { "content": "$1", @@ -4079,7 +4079,7 @@ } }, "createdGroupId": { - "message": "Grupo criado $ID$.", + "message": "Criou o grupo $ID$.", "placeholders": { "id": { "content": "$1", @@ -4088,7 +4088,7 @@ } }, "editedGroupId": { - "message": "Grupo editado $ID$.", + "message": "Editou o grupo $ID$.", "placeholders": { "id": { "content": "$1", @@ -4097,7 +4097,7 @@ } }, "deletedGroupId": { - "message": "Grupo excluído $ID$.", + "message": "Apagou o grupo $ID$.", "placeholders": { "id": { "content": "$1", @@ -4115,7 +4115,7 @@ } }, "removedUserId": { - "message": "Usuário removido $ID$.", + "message": "Removeu o usuário $ID$.", "placeholders": { "id": { "content": "$1", @@ -4133,7 +4133,7 @@ } }, "revokedUserId": { - "message": "Acesso de $ID$ revogado da organização.", + "message": "Revogou o acesso de $ID$ à organização.", "placeholders": { "id": { "content": "$1", @@ -4142,7 +4142,7 @@ } }, "restoredUserId": { - "message": "Acesso de $ID$ restaurado à organização.", + "message": "Restaurou o acesso de $ID$ à organização.", "placeholders": { "id": { "content": "$1", @@ -4160,7 +4160,7 @@ } }, "createdAttachmentForItem": { - "message": "Anexo criado para o item $ID$.", + "message": "Criou anexo para o item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4169,7 +4169,7 @@ } }, "deletedAttachmentForItem": { - "message": "Anexo excluído para o item $ID$.", + "message": "Apagou anexo do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4178,7 +4178,7 @@ } }, "editedCollectionsForItem": { - "message": "Coleção editada para o item $ID$.", + "message": "Editou conjuntos do item $ID$.", "placeholders": { "id": { "content": "$1", @@ -4187,7 +4187,7 @@ } }, "invitedUserId": { - "message": "Usuário(a) convidado(a) $ID$.", + "message": "Convidou o usuário $ID$.", "placeholders": { "id": { "content": "$1", @@ -4196,7 +4196,7 @@ } }, "confirmedUserId": { - "message": "Usuário(a) confirmado(a) $ID$.", + "message": "Confirmou o usuário $ID$.", "placeholders": { "id": { "content": "$1", @@ -4205,7 +4205,7 @@ } }, "editedUserId": { - "message": "Usuário(a) editado(a) $ID$.", + "message": "Editou o usuário $ID$.", "placeholders": { "id": { "content": "$1", @@ -4214,7 +4214,7 @@ } }, "editedGroupsForUser": { - "message": "Grupo editado para usuário(a) $ID$.", + "message": "Editou grupos para o usuário $ID$.", "placeholders": { "id": { "content": "$1", @@ -4223,10 +4223,10 @@ } }, "unlinkedSso": { - "message": "SSO desvinculado." + "message": "Desvinculou o SSO." }, "unlinkedSsoUser": { - "message": "SSO desvinculado para o usuário $ID$.", + "message": "Desvinculou o SSO para o usuário $ID$.", "placeholders": { "id": { "content": "$1", @@ -4289,7 +4289,7 @@ "message": "Você está tentando se conectar?" }, "logInAttemptBy": { - "message": "Tentativa de autenticação por $EMAIL$", + "message": "Tentativa de acesso por $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -4310,7 +4310,7 @@ "message": "Negar acesso" }, "thisRequestIsNoLongerValid": { - "message": "Este pedido não é mais válido." + "message": "Esta solicitação não é mais válida." }, "loginRequestApprovedForEmailOnDevice": { "message": "Solicitação de autenticação aprovada para $EMAIL$ em $DEVICE$", @@ -4326,7 +4326,7 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente entrar com o dispositivo novamente." + "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente se conectar com o dispositivo novamente." }, "loginRequestHasAlreadyExpired": { "message": "A solicitação de autenticação já expirou." @@ -4350,7 +4350,7 @@ "message": "Confira seu e-mail" }, "followTheLinkInTheEmailSentTo": { - "message": "Siga o link no e-mail enviado para" + "message": "Abra o link no e-mail enviado para" }, "andContinueCreatingYourAccount": { "message": "e continue criando a sua conta." @@ -4359,7 +4359,7 @@ "message": "Nenhum e-mail?" }, "goBack": { - "message": "Voltar" + "message": "Volte" }, "toEditYourEmailAddress": { "message": "para editar o seu endereço de e-mail." @@ -4383,7 +4383,7 @@ "message": "Acesso a grupos" }, "groupAccessUserDesc": { - "message": "Conceda acesso ao membro a coleções adicionado-o a um ou mais grupos." + "message": "Conceda acesso ao membro a conjuntos adicionado-o a um ou mais grupos." }, "invitedUsers": { "message": "Usuário(s) convidado(s)" @@ -4434,13 +4434,13 @@ "message": "Verificar e-mail" }, "verifyEmailDesc": { - "message": "Confirme o endereço de e-mail da sua conta para desbloquear o acesso a todos os recursos." + "message": "Verifique o endereço de e-mail da sua conta para desbloquear o acesso a todos os recursos." }, "verifyEmailFirst": { - "message": "Primeiro, o endereço de e-mail da sua conta precisa ser confirmado." + "message": "Primeiro, o endereço de e-mail da sua conta precisa ser verificado." }, "checkInboxForVerification": { - "message": "Verifique sua caixa de entrada do e-mail para obter o código de verificação." + "message": "Confira sua caixa de entrada do e-mail por um link de verificação." }, "emailVerified": { "message": "E-mail da conta verificado" @@ -4449,49 +4449,49 @@ "message": "E-mail verificado" }, "emailVerifiedFailed": { - "message": "Não é possível confirmar o seu e-mail. Tente enviar um novo e-mail de verificação." + "message": "Não é possível verificar o seu e-mail. Tente enviar um novo e-mail de verificação." }, "emailVerificationRequired": { - "message": "Verificação de e-mail obrigatória" + "message": "Verificação de e-mail necessária" }, "emailVerificationRequiredDesc": { "message": "Você precisa verificar o seu e-mail para usar este recurso." }, "updateBrowser": { - "message": "Atualize o navegador" + "message": "Atualizar navegador" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Gerando sua Inteligência de Acesso..." }, "fetchingMemberData": { - "message": "Fetching member data..." + "message": "Buscando dados de membros..." }, "analyzingPasswordHealth": { - "message": "Analyzing password health..." + "message": "Analisando saúde das senhas..." }, "calculatingRiskScores": { - "message": "Calculating risk scores..." + "message": "Calculando pontuações de risco..." }, "generatingReportData": { - "message": "Generating report data..." + "message": "Gerando dados do relatório..." }, "savingReport": { - "message": "Saving report..." + "message": "Salvando relatório..." }, "compilingInsights": { - "message": "Compiling insights..." + "message": "Compilando conhecimentos..." }, "loadingProgress": { - "message": "Loading progress" + "message": "Progresso de carregamento" }, "thisMightTakeFewMinutes": { - "message": "This might take a few minutes." + "message": "Isto pode levar alguns minutos." }, "riskInsightsRunReport": { "message": "Executar relatório" }, "updateBrowserDesc": { - "message": "Você está usando um navegador da Web não suportado. O cofre web pode não funcionar corretamente." + "message": "Você está usando um navegador da web não suportado. O cofre web pode não funcionar corretamente." }, "youHaveAPendingLoginRequest": { "message": "Você tem uma solicitação de autenticação pendente de outro dispositivo." @@ -4503,7 +4503,7 @@ "message": "Solicitação de autenticação" }, "freeTrialEndPromptCount": { - "message": "Seu teste gratuito termina em $COUNT$ dias.", + "message": "Seu teste grátis termina em $COUNT$ dias.", "placeholders": { "count": { "content": "$1", @@ -4512,7 +4512,7 @@ } }, "freeTrialEndPromptMultipleDays": { - "message": "$ORGANIZATION$, seu teste gratuito termina em $COUNT$ dias.", + "message": "$ORGANIZATION$, seu teste grátis termina em $COUNT$ dias.", "placeholders": { "count": { "content": "$2", @@ -4525,7 +4525,7 @@ } }, "freeTrialEndPromptTomorrow": { - "message": "$ORGANIZATION$, o seu teste gratuito termina amanhã.", + "message": "$ORGANIZATION$, o seu teste grátis termina amanhã.", "placeholders": { "organization": { "content": "$1", @@ -4534,10 +4534,10 @@ } }, "freeTrialEndPromptTomorrowNoOrgName": { - "message": "Seu teste gratuito termina amanhã." + "message": "Seu teste grátis termina amanhã." }, "freeTrialEndPromptToday": { - "message": "$ORGANIZATION$, seu teste gratuito termina hoje.", + "message": "$ORGANIZATION$, seu teste grátis termina hoje.", "placeholders": { "organization": { "content": "$1", @@ -4546,7 +4546,7 @@ } }, "freeTrialEndingTodayWithoutOrgName": { - "message": "Seu teste gratuito termina hoje." + "message": "Seu teste grátis termina hoje." }, "clickHereToAddPaymentMethod": { "message": "Clique aqui para adicionar um método de pagamento." @@ -4564,25 +4564,25 @@ } }, "joinOrganizationDesc": { - "message": "Você foi convidado para participar da organização listada acima. Para aceitar o convite, você precisa iniciar sessão ou criar uma nova conta no Bitwarden." + "message": "Você foi convidado para participar da organização listada acima. Para aceitar o convite, você precisa se conectar ou criar uma nova conta no Bitwarden." }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Termine de juntar-se nessa organização definindo uma senha principal." + "message": "Termine de juntar-se à organização configurando uma senha principal." }, "inviteAccepted": { "message": "Convite aceito" }, "invitationAcceptedDesc": { - "message": "Successfully accepted your invitation." + "message": "Seu convite foi aceito com sucesso." }, "inviteInitAcceptedDesc": { - "message": "Você agora pode acessar esta organização." + "message": "Agora, você pode acessar esta organização." }, "inviteAcceptFailed": { "message": "Não é possível aceitar o convite. Peça a um administrador da organização para enviar um novo convite." }, "inviteAcceptFailedShort": { - "message": "Não foi possível aceitar o convite. $DESCRIPTION$", + "message": "Não é possível aceitar o convite. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -4594,10 +4594,10 @@ "message": "Lembrar e-mail" }, "recoverAccountTwoStepDesc": { - "message": "Se você não puder acessar sua conta por meio de seus métodos normais de autenticação em duas etapas, poderá usar seu código de recuperação para desativar a funcionalidade de duas etapas da sua conta." + "message": "Se você não puder acessar sua conta por meio de seus métodos normais de autenticação em duas etapas, poderá usar seu código de recuperação para desativar todos os provedores de duas etapas da sua conta." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Autentique-se abaixo usando seu código de recuperação de uso único. Isso irá desativar todos os provedores de duas etapas na sua conta." + "message": "Conecte-se abaixo usando seu código de recuperação de uso único. Isso irá desativar todos os provedores de duas etapas na sua conta." }, "recoverAccountTwoStep": { "message": "Recuperar autenticação em duas etapas da conta" @@ -4609,7 +4609,7 @@ "message": "Saiba mais" }, "deleteRecoverDesc": { - "message": "Insira seu endereço de e-mail abaixo para recuperar e excluir sua conta." + "message": "Digite seu endereço de e-mail abaixo para recuperar e apagar sua conta." }, "deleteRecoverEmailSent": { "message": "Se a sua conta existir, enviamos um e-mail para você com mais instruções." @@ -4654,7 +4654,7 @@ "message": "Organização apagada" }, "organizationDeletedDesc": { - "message": "A organização e todos os dados associados foram excluídos." + "message": "A organização e todos os dados associados foram apagados." }, "organizationUpdated": { "message": "Organização salva" @@ -4663,18 +4663,18 @@ "message": "Informações de tributos" }, "taxInformationDesc": { - "message": "Para clientes dentro dos EUA, o código postal (ZIP code) é necessário para satisfazer os requisitos fiscais das vendas. para outros países você pode opcionalmente fornecer um número de identificação fiscal (VAT/GST) e/ou um endereço para aparecer nas suas faturas." + "message": "Para clientes dentro dos EUA, o código postal (ZIP code) é necessário para satisfazer os requisitos fiscais das vendas, para outros países você pode opcionalmente fornecer um número de identificação fiscal (VAT/GST) e/ou um endereço para aparecer nas suas faturas." }, "billingPlan": { "message": "Plano", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlan": { - "message": "Alterar plano", + "message": "Fazer upgrade do plano", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlanUpgrade": { - "message": "Atualize sua conta para outro plano fornecendo as informações abaixo. Por favor, verifique se você tem um método de pagamento ativo adicionado à conta.", + "message": "Faça upgrade da sua conta para outro plano fornecendo as informações abaixo. Certifique-se que você tem um método de pagamento ativo adicionado à conta.", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "invoiceNumber": { @@ -4697,10 +4697,10 @@ "message": "Verificar conta bancária" }, "verifyBankAccountDesc": { - "message": "Fizemos dois micro-depósitos em sua conta bancária (pode demorar de 1 a 2 dias úteis para aparecer). Insira esses valores para confirmar a conta bancária." + "message": "Fizemos dois micro-depósitos em sua conta bancária (pode demorar de 1 a 2 dias úteis para aparecer). Digite esses valores para confirmar a conta bancária." }, "verifyBankAccountInitialDesc": { - "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você será solicitado a confirmar sua conta bancária. Vamos fazer dois micro-depósitos nos próximos 1-2 dias úteis. Insira esses valores na página de faturamento da organização para confirmar a conta bancária." + "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você precisará verificar sua conta bancária. Faremos um micro-depósito nos próximos 1-2 dias úteis. Digite os valores na página de assinatura da organização para verificar a conta bancária." }, "verifyBankAccountFailureWarning": { "message": "A falha na verificação da conta bancária resultará em um pagamento não atendido e sua assinatura será suspensa." @@ -4712,7 +4712,7 @@ "message": "Conta bancária" }, "amountX": { - "message": "Montante $COUNT$", + "message": "Valor $COUNT$", "description": "Used in bank account verification of micro-deposits. Amount, as in a currency amount. Ex. Amount 1 is $2.00, Amount 2 is $1.50", "placeholders": { "count": { @@ -4741,20 +4741,20 @@ "message": "Individual (pessoal)" }, "enterInstallationId": { - "message": "Insira o seu ID de instalação" + "message": "Digite o seu ID de instalação" }, "limitSubscriptionDesc": { - "message": "Defina um limite de vagas para sua assinatura. Quando esse limite for atingido, você não poderá convidar novos usuários." + "message": "Configure um limite de vagas para sua assinatura. Quando esse limite for atingido, você não poderá convidar novos usuários." }, "limitSmSubscriptionDesc": { - "message": "Defina um limite de vagas para sua assinatura do Gerenciador de Segredos. Ao atingir este limite, você não poderá convidar novos membros." + "message": "Configure um limite de vagas para sua assinatura do Gerenciador de Segredos. Ao atingir este limite, você não poderá convidar novos membros." }, "maxSeatLimit": { "message": "Limite de vagas (opcional)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { - "message": "Custo de vaga potencial máximo" + "message": "Custo máximo possível de vagas" }, "addSeats": { "message": "Adicionar vagas", @@ -4777,7 +4777,7 @@ } }, "limitSubscription": { - "message": "Assinatura Limite (Opcional)" + "message": "Limitar assinatura (opcional)" }, "subscriptionSeats": { "message": "Vagas da assinatura" @@ -4813,7 +4813,7 @@ } }, "subscriptionUserSeatsWithoutAdditionalSeatsOption": { - "message": "Você pode convidar até $COUNT$ membros sem custos adicionais. Entre em contato com o Suporte ao Cliente para melhorar seu plano e convidar mais membros.", + "message": "Você pode convidar até $COUNT$ membros sem custos adicionais. Entre em contato com o Suporte ao Cliente para fazer upgrade do seu plano e convidar mais membros.", "placeholders": { "count": { "content": "$1", @@ -4822,7 +4822,7 @@ } }, "subscriptionFreePlan": { - "message": "Você não pode convidar mais do que $COUNT$ usuários sem melhorar seu plano.", + "message": "Você não pode convidar mais do que $COUNT$ usuários sem fazer upgrade do seu plano.", "placeholders": { "count": { "content": "$1", @@ -4831,7 +4831,7 @@ } }, "subscriptionUpgrade": { - "message": "Você não pode convidar mais de $COUNT$ membros sem melhorar seu plano.", + "message": "Você não pode convidar mais de $COUNT$ membros sem fazer upgrade do seu plano.", "placeholders": { "count": { "content": "$1", @@ -4849,7 +4849,7 @@ } }, "subscriptionMaxReached": { - "message": "Ajustes em sua assinatura resultarão em alterações rateadas em seus totais de cobrança. Você não pode convidar mais de $COUNT$ usuários sem aumentar suas vagas de assinatura.", + "message": "Ajustes em sua assinatura resultarão em alterações rateadas em seus totais de cobrança. Você não pode convidar mais de $COUNT$ usuários sem aumentar as vagas da sua assinatura.", "placeholders": { "count": { "content": "$1", @@ -4858,7 +4858,7 @@ } }, "subscriptionSeatMaxReached": { - "message": "Você não pode convidar mais de $COUNT$ membros sem aumentar as suas vagas da assinatura.", + "message": "Você não pode convidar mais de $COUNT$ membros sem aumentar as vagas da sua assinatura.", "placeholders": { "count": { "content": "$1", @@ -4873,13 +4873,13 @@ "message": "Vagas a remover" }, "seatsAddNote": { - "message": "A adição de assentos de usuário resultará em ajustes no total da cobrança, e será cobrada imediatamente pela sua forma de pagamento registrada. A primeira cobrança será rateada pelo restante do ciclo do faturamento atual." + "message": "A adição de vagas de usuário resultará em ajustes no total da cobrança, e será cobrada imediatamente pela sua forma de pagamento cadastrada. A primeira cobrança será rateada pelo restante do ciclo do faturamento atual." }, "seatsRemoveNote": { - "message": "A remoção dos assentos de usuário resultará em ajustes no total do faturamento, que será rateado como crédito para sua próxima cobrança." + "message": "A remoção de vagas de usuário resultará em ajustes no total do faturamento, que será rateado como crédito para sua próxima cobrança." }, "adjustedSeats": { - "message": "Ajustado $AMOUNT$ assentos de usuário.", + "message": "Ajustou $AMOUNT$ vagas de usuário.", "placeholders": { "amount": { "content": "$1", @@ -4897,7 +4897,7 @@ } }, "reorderToggleButton": { - "message": "Reordene $LABEL$. Use a tecla de seta para mover o item para cima ou para baixo.", + "message": "Reordenar $LABEL$. Use a tecla de seta para mover o item para cima ou para baixo.", "placeholders": { "label": { "content": "$1", @@ -4940,10 +4940,10 @@ } }, "updateEncryptionKeyWarning": { - "message": "Depois de atualizar sua chave de criptografia, é necessário encerrar e iniciar a sessão em todos os aplicativos do Bitwarden que você está usando atualmente (como o aplicativo móvel ou as extensões do navegador). Não encerrar e iniciar sessão (que baixa sua nova chave de criptografia) pode resultar em corrupção de dados. Nós tentaremos desconectá-lo automaticamente, mas isso pode demorar um pouco." + "message": "Depois de atualizar sua chave de criptografia, é necessário se desconectar e reconectar em todos os aplicativos do Bitwarden que você está usando atualmente (como o aplicativo móvel ou as extensões do navegador). Não fazer isso (que descarrega sua nova chave de criptografia) pode resultar em corrupção de dados. Nós tentaremos desconectá-lo automaticamente, mas isso pode demorar um pouco." }, "updateEncryptionKeyAccountExportWarning": { - "message": "Quaisquer exportações restritas pela conta que você tem salvas se tornarão inválidas." + "message": "Quaisquer exportações que você tem salvas que são restritas à conta se tornarão inválidas." }, "legacyEncryptionUnsupported": { "message": "A criptografia legada não é mais suportada. Entre em contato com o suporte para recuperar a sua conta." @@ -4955,7 +4955,7 @@ "message": "Carregando" }, "upgrade": { - "message": "Atualizar" + "message": "Fazer upgrade" }, "upgradeOrganization": { "message": "Fazer upgrade da organização" @@ -4973,7 +4973,7 @@ "message": "Reembolsado" }, "nothingSelected": { - "message": "Você selecionou nada." + "message": "Voce não selecionou nada." }, "receiveMarketingEmailsV2": { "message": "Receba conselhos, novidades, e oportunidades de pesquisa do Bitwarden em sua caixa de entrada." @@ -5009,13 +5009,13 @@ "message": "Filtros" }, "vaultTimeout": { - "message": "Tempo Limite do Cofre" + "message": "Tempo limite do cofre" }, "vaultTimeout1": { "message": "Tempo limite" }, "vaultTimeoutDesc": { - "message": "Escolha quando o tempo limite do seu cofre irá se esgotar e executar a ação selecionada." + "message": "Escolha quando o seu cofre executará a ação do tempo limite do cofre." }, "vaultTimeoutLogoutDesc": { "message": "Escolha quando seu cofre será desconectado." @@ -5039,7 +5039,7 @@ "message": "4 horas" }, "onRefresh": { - "message": "Ao recarregar o navegador" + "message": "No reinício do navegador" }, "dateUpdated": { "message": "Atualizado", @@ -5075,7 +5075,7 @@ "message": "Contas de serviço não podem ser criadas em organizações suspensas. Entre em contato com o proprietário da organização para obter assistência." }, "licenseIsExpired": { - "message": "A licença está expirada." + "message": "A licença está vencida." }, "updatedUsers": { "message": "Usuários atualizados" @@ -5090,7 +5090,7 @@ "message": "Propriedade" }, "whoOwnsThisItem": { - "message": "Quem possui este item?" + "message": "Quem é o proprietário deste item?" }, "strong": { "message": "Forte", @@ -5105,7 +5105,7 @@ "description": "ex. A weak password. Scale: Very Weak -> Weak -> Good -> Strong" }, "veryWeak": { - "message": "Muito Fraca", + "message": "Muito fraca", "description": "ex. A very weak password. Scale: Very Weak -> Weak -> Good -> Strong" }, "weakMasterPassword": { @@ -5115,13 +5115,13 @@ "message": "Senha fraca identificada. Você deve usar uma senha principal forte para proteger a sua conta. Tem certeza que quer usar esta senha principal?" }, "rotateAccountEncKey": { - "message": "Também rodar a chave de encriptação da minha conta" + "message": "Rotacionar a chave de criptografia da minha conta" }, "rotateEncKeyTitle": { "message": "Rotacionar chave de criptografia" }, "rotateEncKeyConfirmation": { - "message": "Você tem certeza que quer rodar a chave de encriptação da sua conta?" + "message": "Tem certeza que quer rotacionar a chave de criptografia da sua conta?" }, "attachmentsNeedFix": { "message": "Este item tem anexos de arquivos antigos que precisam ser corrigidos." @@ -5134,10 +5134,10 @@ "description": "This is a verb. ex. 'Fix The Car'" }, "oldAttachmentsNeedFixDesc": { - "message": "Há anexos de arquivos antigos no seu cofre que precisam ser corrigidos antes que você possa girar a chave de criptografia da sua conta." + "message": "Há anexos de arquivos antigos no seu cofre que precisam ser corrigidos antes que você possa rotacionar a chave de criptografia da sua conta." }, "yourAccountsFingerprint": { - "message": "A sua frase biométrica", + "message": "A frase biométrica da sua conta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintEnsureIntegrityVerify": { @@ -5145,7 +5145,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Certifique-se de que o seu cofre esteja desbloqueado e a frase biométrica corresponda ao outro dispositivo." + "message": "Certifique-se de que o seu cofre está desbloqueado e a frase biométrica corresponda ao do outro dispositivo." }, "fingerprintPhraseHeader": { "message": "Frase biométrica" @@ -5158,42 +5158,42 @@ "message": "Você será notificado assim que a solicitação ser aprovada" }, "free": { - "message": "Gratuito", + "message": "Grátis", "description": "Free, as in 'Free beer'" }, "apiKey": { - "message": "Chave API" + "message": "Chave da API" }, "apiKeyDesc": { - "message": "Sua chave API pode ser usada para autenticar na API pública do Bitwarden." + "message": "Sua chave da API pode ser usada para autenticar na API pública do Bitwarden." }, "apiKeyRotateDesc": { - "message": "Girar a chave da API invalidará a chave anterior. Você pode girar sua chave de API se acreditar que a chave atual não é mais segura de usar." + "message": "Rotacionar a chave da API invalidará a chave anterior. Você pode rotacionar sua chave de API se acreditar que a chave atual não é mais segura de usar." }, "apiKeyWarning": { - "message": "Sua chave de API tem acesso total à organização. Deve ser mantido em segredo." + "message": "Sua chave de API tem acesso total à organização. Deve ser mantida em segredo." }, "userApiKeyDesc": { - "message": "Sua chave API pode ser usada para autenticar no Bitwarden CLI." + "message": "Sua chave da API pode ser usada para autenticar no Bitwarden CLI." }, "userApiKeyWarning": { - "message": "Sua chave de API é um mecanismo de autenticação alternativo. Deve ser mantido em segredo." + "message": "Sua chave de API é um mecanismo de autenticação alternativo. Deve ser mantida em segredo." }, "oauth2ClientCredentials": { "message": "Credenciais do cliente OAuth 2.0", "description": "'OAuth 2.0' is a programming protocol. It should probably not be translated." }, "viewApiKey": { - "message": "Visualizar chave da API" + "message": "Ver chave da API" }, "rotateApiKey": { "message": "Rotacionar chave da API" }, "selectOneCollection": { - "message": "Você deve selecionar pelo menos uma coleção." + "message": "Você deve selecionar pelo menos um conjunto." }, "couldNotChargeCardPayInvoice": { - "message": "Não foi possível cobrar no seu cartão. Por favor, veja e pague a fatura pendente listada abaixo." + "message": "Não foi possível cobrar o seu cartão. Veja e pague a fatura pendente listada abaixo." }, "minLength": { "message": "Comprimento mínimo" @@ -5202,10 +5202,10 @@ "message": "Clonar" }, "masterPassPolicyTitle": { - "message": "Requisitos de senha principal" + "message": "Requisitos da senha principal" }, "masterPassPolicyDesc": { - "message": "Defina os requisitos para a força da senha principal." + "message": "Configure os requisitos para a força da senha principal." }, "passwordStrengthScore": { "message": "Pontuação de força da senha $SCORE$", @@ -5220,7 +5220,7 @@ "message": "Exigir autenticação em duas etapas" }, "twoStepLoginPolicyDesc": { - "message": "Exigir que os usuários definam a autenticação de dois passos nas suas contas pessoais." + "message": "Exija que os membros configurem a autenticação de duas etapas." }, "twoStepLoginPolicyWarning": { "message": "Membros da organização que não são proprietários ou administradores e não têm a autenticação em duas etapas configurada em sua conta serão removidos da organização e receberão um e-mail notificando-os sobre a mudança." @@ -5229,7 +5229,7 @@ "message": "Você é um membro de uma organização que exige que a autenticação de dois passos seja ativada na sua conta de usuário. Se desativar todos os serviços de autenticação de dois passos, você será automaticamente removido dessas organizações." }, "passwordGeneratorPolicyDesc": { - "message": "Defina requisitos para o gerador de senhas." + "message": "Configure requisitos para o gerador de senhas." }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha principal cumpra aos seguintes requisitos:" @@ -5253,16 +5253,16 @@ } }, "policyInEffectUppercase": { - "message": "Contém um ou mais caracteres em maiúsculo" + "message": "Conter um ou mais caracteres em maiúsculo" }, "policyInEffectLowercase": { - "message": "Contém um ou mais caracteres em minúsculo" + "message": "Conter um ou mais caracteres em minúsculo" }, "policyInEffectNumbers": { - "message": "Contém um ou mais números" + "message": "Conter um ou mais números" }, "policyInEffectSpecial": { - "message": "Contém um ou mais dos seguintes caracteres especiais $CHARS$", + "message": "Conter um ou mais dos seguintes caracteres especiais $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -5301,28 +5301,28 @@ "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" }, "searchTrash": { - "message": "Pesquisar na lixeira" + "message": "Buscar na lixeira" }, "permanentlyDelete": { - "message": "Apagar para sempre" + "message": "Apagar permanentemente" }, "permanentlyDeleteSelected": { - "message": "Apagar selecionados para sempre" + "message": "Apagar selecionados permanentemente" }, "permanentlyDeleteItem": { - "message": "Apagar item para sempre" + "message": "Apagar item permanentemente" }, "permanentlyDeleteItemConfirmation": { - "message": "Você tem certeza que deseja excluir permanentemente esse item?" + "message": "Você tem certeza que deseja apagar permanentemente esse item?" }, "permanentlyDeletedItem": { - "message": "Item apagado para sempre" + "message": "Item apagado permanentemente" }, "permanentlyDeletedItems": { - "message": "Itens apagados para sempre" + "message": "Itens apagados permanentemente" }, "permanentlyDeleteSelectedItemsDesc": { - "message": "Você selecionou $COUNT$ item(ns) para excluir permanentemente. Tem certeza que deseja excluir permanentemente todos estes itens?", + "message": "Você selecionou $COUNT$ item(ns) para apagar permanentemente. Tem certeza que quer apagar todos estes itens permanentemente?", "placeholders": { "count": { "content": "$1", @@ -5331,7 +5331,7 @@ } }, "permanentlyDeletedItemId": { - "message": "Item $ID$ apagado para sempre", + "message": "Item $ID$ apagado permanentemente", "placeholders": { "id": { "content": "$1", @@ -5361,7 +5361,7 @@ } }, "vaultTimeoutLogOutConfirmation": { - "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" + "message": "Desconectar-se irá remover todo o acesso ao seu cofre e requirirá autenticação on-line após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Confirmação de ação do tempo limite" @@ -5376,7 +5376,7 @@ "message": "Incluir informações sobre IVA/GST (opcional)" }, "taxIdNumber": { - "message": "ID de Imposto VAT/GST" + "message": "ID de imposto VAT/GST" }, "taxInfoUpdated": { "message": "Informações de impostos atualizadas." @@ -5391,13 +5391,13 @@ "message": "Identificador da organização" }, "ssoLogInWithOrgIdentifier": { - "message": "Entre usando o portal de autenticação única da sua organização. Digite o identificador de SSO da sua organização para começar." + "message": "Conecte-se usando o portal de autenticação única da sua organização. Digite o identificador de SSO da sua organização para começar." }, "singleSignOnEnterOrgIdentifier": { "message": "Digite o identificador de SSO da sua organização para começar" }, "singleSignOnEnterOrgIdentifierText": { - "message": "Para entrar com seu provedor de SSO, digite o identificador de SSO da sua organização para começar. Talvez seja necessário digitar este identificador de SSO quando entrar com um novo dispositivo." + "message": "Para se conectar com seu provedor de SSO, digite o identificador de SSO da sua organização para começar. Talvez seja necessário digitar este identificador de SSO quando se conectar com um novo dispositivo." }, "enterpriseSingleSignOn": { "message": "Autenticação única empresarial" @@ -5406,7 +5406,7 @@ "message": "Agora você pode fechar esta aba e continuar na extensão." }, "youSuccessfullyLoggedIn": { - "message": "Você entrou na sua conta com sucesso" + "message": "Você se conectou com sucesso" }, "thisWindowWillCloseIn5Seconds": { "message": "Esta janela será fechada automaticamente em 5 segundos" @@ -5415,10 +5415,10 @@ "message": "Você pode fechar esta janela" }, "includeAllTeamsFeatures": { - "message": "Recursos para Todas as Equipes, além de:" + "message": "Todos os recursos do Equipes, mais:" }, "includeAllTeamsStarterFeatures": { - "message": "Todos os recursos do Teams Starter, mais:" + "message": "Todos os recursos do Equipes Iniciantes, mais:" }, "chooseMonthlyOrAnnualBilling": { "message": "Escolha cobrança mensal ou anual" @@ -5474,7 +5474,7 @@ "message": "Restrinja membros de entrar em outras organizações. Essa política é necessária para organizações que tenham ativado a verificação de domínio." }, "singleOrgBlockCreateMessage": { - "message": "Sua organização atual tem uma política que não permite que você entre em mais de uma organização. Por favor, entre em contato com os administradores da sua organização ou cadastre-se a partir de uma conta do Bitwarden diferente." + "message": "Sua organização atual tem uma política que não permite que você entre em mais de uma organização. Entre em contato com os administradores da sua organização ou cadastre-se a partir de uma conta do Bitwarden diferente." }, "singleOrgPolicyMemberWarning": { "message": "Membros não adequados serão colocados no estado revogado até que saiam de todas as outras organizações. Administradores estão isentos e podem restaurar os membros assim que se adequarem." @@ -5483,7 +5483,7 @@ "message": "Exigir autenticação única" }, "requireSsoPolicyDesc": { - "message": "Exija que os usuários entrem com o método de autenticação única empresarial." + "message": "Exija que os usuários se conectem com o método de autenticação única empresarial." }, "prerequisite": { "message": "Pré-requisito" @@ -5528,7 +5528,7 @@ "message": "Texto" }, "sendPasswordDescV3": { - "message": "Adicione uma senha opcional para os destinatários acessarem este Send.", + "message": "Adicione uma senha opcional para que os destinatários acessem este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -5552,25 +5552,25 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSend": { - "message": "Excluir Send", + "message": "Apagar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Tem certeza de que quer apagar este Send para sempre?", + "message": "Tem certeza de que quer apagar este Send permanentemente?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data de apagamento" }, "deletionDateDescV2": { - "message": "O Send será apagado para sempre nesta data.", + "message": "O Send será apagado permanentemente nesta data.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { "message": "Data de validade" }, "expirationDateDesc": { - "message": "Se configurado, o acesso a este Send expirará no horário especificado.", + "message": "Se configurado, o acesso a este Send acabará no horário especificado.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { @@ -5580,7 +5580,7 @@ "message": "Desativado" }, "revoked": { - "message": "Revogado" + "message": "Revogados" }, "sendLink": { "message": "Link do Send", @@ -5616,14 +5616,14 @@ "message": "Ocultar texto por padrão" }, "expired": { - "message": "Expirado" + "message": "Vencido" }, "searchSends": { - "message": "Pesquisar Sends", + "message": "Buscar nos Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPassword": { - "message": "Este Send está protegido com uma senha. Por favor, digite a senha abaixo para continuar.", + "message": "Este Send está protegido com uma senha. Digite a senha abaixo para continuar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPasswordDontKnow": { @@ -5638,11 +5638,11 @@ "message": "Baixar anexos" }, "sendAccessPasswordTitle": { - "message": "Digite a senha para visualizar este Send", + "message": "Digite a senha para ver este Send", "description": "Title of the Send password authentication screen." }, "sendAccessContentTitle": { - "message": "Visualizar Send", + "message": "Ver Send", "description": "Title of the Send view content screen." }, "sendAccessUnavailable": { @@ -5650,7 +5650,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "missingSendFile": { - "message": "O arquivo associado a este Send não foi encontrado.", + "message": "O arquivo associado com este Send não foi encontrado.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "noSendsInList": { @@ -5661,10 +5661,10 @@ "message": "Acesso de emergência" }, "emergencyAccessDesc": { - "message": "Conceda e gerencie o acesso de emergência para contatos confiáveis. Contatos confiáveis podem solicitar acesso a visualizar ou assumir o controle da sua conta em caso de emergência. Visite a nossa página de ajuda para obter mais informações e detalhes sobre como o compartilhamento de conhecimento zero funciona." + "message": "Conceda e gerencie o acesso de emergência para contatos de confiança. Contatos de confiança podem solicitar acesso para ver ou assumir o controle da sua conta em caso de emergência. Visite a nossa página de ajuda para obter mais informações e detalhes sobre como o compartilhamento de conhecimento zero funciona." }, "emergencyAccessOwnerWarning": { - "message": "Você é o Proprietário de uma ou mais organizações. Se você conceder o assumir controle a um contato de emergência, eles serão capazes de usar todas as suas permissões como Proprietário ao assumir controle." + "message": "Você é o proprietário de uma ou mais organizações. Se você conceder o assumir controle a um contato de emergência, eles serão capazes de usar todas as suas permissões como proprietário ao assumir controle." }, "trustedEmergencyContacts": { "message": "Contatos de emergência confiados" @@ -5679,7 +5679,7 @@ "message": "Designado como contato de emergência" }, "noGrantedAccess": { - "message": "Você ainda não foi designado como um contato de emergência de ninguém." + "message": "Você ainda não foi designado como um contato de emergência para ninguém." }, "inviteEmergencyContact": { "message": "Convidar contato de emergência" @@ -5703,7 +5703,7 @@ "message": "Assumir controle" }, "takeoverDesc": { - "message": "Pode redefinir a sua conta com uma nova senha principal." + "message": "Pode reconfigurar a sua conta com uma nova senha principal." }, "waitTime": { "message": "Tempo de espera" @@ -5727,7 +5727,7 @@ "message": "Usuário convidado." }, "acceptEmergencyAccess": { - "message": "Você foi convidado para se tornar um contato de emergência para o usuário listado acima. Para aceitar o convite, você precisa entrar ou criar uma nova conta no Bitwarden." + "message": "Você foi convidado para se tornar um contato de emergência para o usuário listado acima. Para aceitar o convite, você precisa se conectar ou criar uma nova conta no Bitwarden." }, "emergencyInviteAcceptFailed": { "message": "Não é possível aceitar o convite. Peça ao usuário para enviar um novo convite." @@ -5748,7 +5748,7 @@ "message": "Solicitar acesso" }, "requestAccessConfirmation": { - "message": "Tem certeza que deseja solicitar acesso de emergência? Você receberá acesso após $WAITTIME$ dia(s) ou sempre que o usuário aprovar manualmente a solicitação.", + "message": "Tem certeza que deseja solicitar acesso de emergência? Você receberá acesso após $WAITTIME$ dia(s) ou se o usuário aprovar manualmente a solicitação.", "placeholders": { "waittime": { "content": "$1", @@ -5791,10 +5791,10 @@ "message": "Acesso de emergência recusado" }, "grantorDetailsNotFound": { - "message": "Detalhes do condecente não encontrados" + "message": "Detalhes do concedente não encontrados" }, "passwordResetFor": { - "message": "Senha redefinida para $USER$. Agora você pode acessar usando a nova senha.", + "message": "Senha reconfigurada para $USER$. Agora você pode se conectar usando a nova senha.", "placeholders": { "user": { "content": "$1", @@ -5806,15 +5806,15 @@ "message": "Aplicar propriedade de dados da organização" }, "organizationDataOwnershipDesc": { - "message": "Exigir que todos os itens sejam propriedade de uma organização, removendo a opção de armazenar itens ao nível da conta.", + "message": "Exija que todos os itens sejam propriedade de uma organização, removendo a opção de armazenar itens ao nível da conta.", "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Todos os itens serão propriedade da e salvos na organização, ativando controles, visibilidade, e relatórios ao nível da organização. Quando ativado, um conjunto padrão ficará disponível para que cada membro armazene seus itens. Saiba mais sobre gerenciar o ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { - "message": "ciclo de vida credencial", + "message": "ciclo de vida de credenciais", "description": "This will be used as a hyperlink" }, "organizationDataOwnershipWarningTitle": { @@ -5827,85 +5827,85 @@ "message": "não será selecionado automaticamente ao criar itens" }, "organizationDataOwnershipWarning3": { - "message": "não pode ser gerenciado pelo Console de Admin até que o usuário seja removido" + "message": "não pode ser gerenciado pelo painel de administração até que o usuário seja removido" }, "organizationDataOwnershipWarningContentTop": { - "message": "Ao desligar esta política, a coleção padrão: " + "message": "Ao desativar esta política, o conjunto padrão: " }, "organizationDataOwnershipWarningContentBottom": { "message": "Saiba mais sobre o ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" }, "availableNow": { - "message": "Available now" + "message": "Disponível agora" }, "autoConfirm": { - "message": "Automatic confirmation of new users" + "message": "Confirmação automática de novos usuários" }, "autoConfirmDescription": { - "message": "New users invited to the organization will be automatically confirmed when an admin’s device is unlocked.", + "message": "Novos usuários convidados para a organização serão confirmados automaticamente quando o dispositivo de um administrador for desbloqueado.", "description": "This is the description of the policy as it appears in the 'Policies' page" }, "howToTurnOnAutoConfirm": { - "message": "How to turn on automatic user confirmation" + "message": "Como ativar a confirmação automática de usuários" }, "autoConfirmExtension1": { - "message": "Open your Bitwarden extension" + "message": "Abra a sua extensão do Bitwarden" }, "autoConfirmExtension2": { - "message": "Select", + "message": "Selecione", "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtension3": { - "message": " Turn on", + "message": " Ativar", "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtensionOpened": { - "message": "Successfully opened the Bitwarden browser extension. You can now activate the automatic user confirmation setting." + "message": "A extensão de navegador do Bitwarden foi aberta com sucesso. Agora você pode ativar a configuração de confirmação automática de usuários." }, "autoConfirmPolicyEditDescription": { - "message": "New users invited to the organization will be automatically confirmed when an admin’s device is unlocked. Before turning on this policy, please review and agree to the following: ", + "message": "Novos usuários convidados para a organização serão confirmados automaticamente quando o dispositivo de um administrador for desbloqueado. Antes de ativar esta política, revisa e concorde com o seguinte: ", "description": "This is the description of the policy as it appears inside the policy edit dialog" }, "autoConfirmAcceptSecurityRiskTitle": { - "message": "Potential security risk. " + "message": "Potencial risco de segurança. " }, "autoConfirmAcceptSecurityRiskDescription": { - "message": "Automatic user confirmation could pose a security risk to your organization’s data." + "message": "A confirmação automática de usuários pode representar um risco para a segurança dos dados da sua organização." }, "autoConfirmAcceptSecurityRiskLearnMore": { - "message": "Learn about the risks", + "message": "Saiba mais sobre os riscos", "description": "The is the link copy for the first check box option in the edit policy dialog" }, "autoConfirmSingleOrgRequired": { - "message": "Single organization policy required. " + "message": "Política de organização única necessária. " }, "autoConfirmSingleOrgRequiredDesc": { - "message": "All members must only belong to this organization to activate this automation." + "message": "Todos os membros devem pertencer somente a esta organização para ativar esta automação." }, "autoConfirmSingleOrgExemption": { - "message": "Single organization policy will extend to all roles. " + "message": "A política de organização única estenderá a todos os cargos. " }, "autoConfirmNoEmergencyAccess": { - "message": "No emergency access. " + "message": "Sem acesso de emergência. " }, "autoConfirmNoEmergencyAccessDescription": { - "message": "Emergency Access will be removed." + "message": "O acesso de emergência será removido." }, "autoConfirmCheckBoxLabel": { - "message": "I accept these risks and policy updates" + "message": "Eu aceito estes riscos e atualizações de política" }, "personalOwnership": { "message": "Remover cofre individual" }, "personalOwnershipPolicyDesc": { - "message": "Exigir que os usuários salvem itens em uma organização removendo a opção de cofre individual." + "message": "Exija que os usuários salvem itens em uma organização removendo a opção de cofre individual." }, "personalOwnershipExemption": { "message": "Os proprietários e administradores da organização são isentos da aplicação desta política." }, "personalOwnershipSubmitError": { - "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre pessoal. Altere a opção de propriedade para uma organização e escolha entre as coleções disponíveis." + "message": "Devido a uma política empresarial, você não pode salvar itens no seu cofre individual. Altere a opção de propriedade para uma organização e escolha entre os conjuntos disponíveis." }, "desktopAutotypePolicy": { "message": "Configuração padrão da digitação automática no computador" @@ -5918,18 +5918,18 @@ "message": "Remover Send" }, "disableSendPolicyDesc": { - "message": "Não permitir que usuários criem ou editem Sends.", + "message": "Não permita que usuários criem ou editem Sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { - "message": "Os usuários da organização que podem gerenciar as políticas da organização estão isentos da aplicação desta política." + "message": "Os usuários da organização que podem gerenciar as políticas da organização são isentos da aplicação desta política." }, "sendDisabled": { "message": "Send removido", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Devido a uma política empresarial, você só é capaz de apagar um Send existente.", + "message": "Devido a uma política corporativa, você só pode apagar um Send existente.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { @@ -5941,23 +5941,23 @@ "description": "'Sends' is a plural noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsExemption": { - "message": "Os usuários da organização que podem gerenciar as políticas da organização estão isentos da aplicação desta política." + "message": "Os usuários da organização que podem gerenciar as políticas da organização são isentos da aplicação desta política." }, "disableHideEmail": { "message": "Sempre mostrar o endereço de e-mail do membro com destinatários ao criar ou editar um Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "uriMatchDetectionPolicy": { - "message": "Default URI match detection" + "message": "Detecção de correspondência padrão de URI" }, "uriMatchDetectionPolicyDesc": { - "message": "Determine when logins are suggested for autofill. Admins and owners are exempt from this policy." + "message": "Determine quando as credenciais são sugeridas para preenchimento automático. Administradores e proprietários ficam isentos desta política." }, "uriMatchDetectionOptionsLabel": { - "message": "Default URI match detection" + "message": "Detecção de correspondência padrão de URI" }, "invalidUriMatchDefaultPolicySetting": { - "message": "Please select a valid URI match detection option.", + "message": "Selecione uma opção de detecção de correspondência de URI válida.", "description": "Error message displayed when a user attempts to save URI match detection policy settings with an invalid selection." }, "modifiedPolicyId": { @@ -5979,7 +5979,7 @@ "message": "Personalizado" }, "customDesc": { - "message": "Conceder permissões personalizadas aos membros" + "message": "Conceda permissões personalizadas aos membros" }, "customDescNonEnterpriseStart": { "message": "Cargos personalizados são um ", @@ -5994,7 +5994,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "Para ativar as permissões personalizadas, a organização deve estar em um plano Enterprise 2020." + "message": "Para ativar as permissões personalizadas, a organização deve estar em um plano Empresarial 2020." }, "permissions": { "message": "Permissões" @@ -6015,16 +6015,16 @@ "message": "Você não tem a permissão necessária para executar esta ação." }, "manageAllCollections": { - "message": "Gerenciar todas as coleções" + "message": "Gerenciar todos os conjuntos" }, "createNewCollections": { - "message": "Criar novas coleções" + "message": "Criar novos conjuntos" }, "editAnyCollection": { - "message": "Editar qualquer coleção" + "message": "Editar qualquer conjunto" }, "deleteAnyCollection": { - "message": "Apagar qualquer coleção" + "message": "Apagar qualquer conjunto" }, "manageGroups": { "message": "Gerenciar grupos" @@ -6042,7 +6042,7 @@ "message": "Gerenciar recuperação de conta" }, "disableRequiredError": { - "message": "Você deve desativar manualmente a política $POLICYNAME$ antes que esta política possa ser desativada.", + "message": "Você deve desativar manualmente a política de $POLICYNAME$ antes que esta política possa ser desativada.", "placeholders": { "policyName": { "content": "$1", @@ -6054,10 +6054,10 @@ "message": "Uma política de organização está afetando suas opções de propriedade." }, "personalOwnershipPolicyInEffectImports": { - "message": "Uma política da organização bloqueou a importação de itens em seu cofre pessoal." + "message": "Uma política da organização bloqueou a importação de itens em seu cofre individual." }, "personalOwnershipCheckboxDesc": { - "message": "Remover propriedade individual para usuários da organização" + "message": "Remova a propriedade individual para usuários da organização" }, "send": { "message": "Send", @@ -6091,19 +6091,19 @@ "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": "Desenvolvimento, DevOps e equipes de TI escolhem o Gerenciador de Segredos do Bitwarden para gerenciar e implementar seus segredos de infraestrutura e máquina de forma segura." + "message": "Equipes de desenvolvimento, DevOps e TI escolhem o Bitwarden Gerenciador de Segredos para gerenciar e implementar seus segredos de infraestrutura e máquina de forma segura." }, "centralizeSecretsManagement": { "message": "Centralize o gerenciamento de segredos." }, "centralizeSecretsManagementDescription": { - "message": "Armazene e gerencie com segurança segredos em um único local para impedir dispersão de segredos em sua organização." + "message": "Armazene e gerencie segredos com segurança em um único local para impedir dispersão de segredos em sua organização." }, "preventSecretLeaks": { "message": "Impeça vazamentos de segredos." }, "preventSecretLeaksDescription": { - "message": "Proteja segredos com criptografia de ponta a ponta. Não há mais segredos de codificação rígida ou compartilhamento através de arquivos .env." + "message": "Proteja segredos com criptografia de ponta a ponta. Nada mais de segredos hard-coded ou compartilhamento através de arquivos .env." }, "enhanceDeveloperProductivity": { "message": "Melhore a produtividade dos desenvolvedores." @@ -6112,7 +6112,7 @@ "message": "Recupere e implemente segredos programaticamente em tempo de execução para que os desenvolvedores possam se concentrar no que mais importa, como melhorar a qualidade do código." }, "strengthenBusinessSecurity": { - "message": "Fortaleça a segurança empresarial." + "message": "Fortaleça a segurança da empresa." }, "strengthenBusinessSecurityDescription": { "message": "Mantenha controle rígido sobre o acesso de máquina e humano a segredos com integrações de SSO, registros de eventos e rotação de acesso." @@ -6127,7 +6127,7 @@ "message": "Adicione uma anotação" }, "bitwardenSecretsManager": { - "message": "Gerenciador de Segredos do Bitwarden" + "message": "Bitwarden Gerenciador de Segredos" }, "moreProductsFromBitwarden": { "message": "Mais produtos do Bitwarden" @@ -6136,19 +6136,19 @@ "message": "Solicitar acesso ao Gerenciador de Segredos" }, "youNeedApprovalFromYourAdminToTrySecretsManager": { - "message": "Você precisa de aprovação do seu administrador para testar o Gerenciador de Segredos." + "message": "Você precisa de aprovação do seu administrador para experimentar o Gerenciador de Segredos." }, "smAccessRequestEmailSent": { "message": "Solicitação de acesso para o gerenciador de segredos enviada ao e-mail dos administradores." }, "requestAccessSMDefaultEmailContent": { - "message": "Olá,\n\nEstou solicitando uma assinatura do Gerenciador de Segredos do Bitwarden para a nossa equipe. O vosso apoio significaria muito!\n\nO Gerenciador de Segredos do Bitwarden é uma solução de gerenciamento de segredos criptografados de ponta a ponta para armazenamento seguro, compartilhamento, e implementação de credenciais de máquina como chaves de API, senhas de banco de dados e certificados de autenticação.\n\nEle nos ajudará a:\n\n- Melhorar a segurança\n- Otimizar o fluxo\n- Impedir caros vazamentos de segredos\n\nPara solicitar uma avaliação gratuita para nossa equipe, entre em contato com o Bitwarden.\n\nObrigado pela sua ajuda!" + "message": "Olá,\n\nEstou solicitando uma assinatura do Bitwarden Gerenciador de Segredos para a nossa equipe. O vosso apoio significaria muito!\n\nO Gerenciador de Segredos do Bitwarden é uma solução de gerenciamento de segredos criptografados de ponta a ponta para armazenamento seguro, compartilhamento, e implementação de credenciais de máquina como chaves de API, senhas de banco de dados e certificados de autenticação.\n\nEle nos ajudará a:\n\n- Melhorar a segurança\n- Otimizar o fluxo\n- Impedir caros vazamentos de segredos\n\nPara solicitar uma avaliação gratuita para nossa equipe, por favor, entre em contato com o Bitwarden.\n\nObrigado pela sua ajuda!" }, "giveMembersAccess": { - "message": "Dar acesso aos membros:" + "message": "Dê acesso aos membros:" }, "viewAndSelectTheMembers": { - "message": "visualize e selecione os membros que você deseja dar acesso ao Gerenciador de Segredos." + "message": "veja e selecione os membros que você deseja dar acesso ao Gerenciador de Segredos." }, "openYourOrganizations": { "message": "Abra o da sua organização" @@ -6199,7 +6199,7 @@ "message": "A data de apagamento fornecida não é válida." }, "expirationDateAndTimeRequired": { - "message": "Uma data e hora de expiração são obrigatórias." + "message": "Uma data e hora de validade são obrigatórias." }, "deletionDateAndTimeRequired": { "message": "Uma data e hora de apagamento são obrigatórias." @@ -6208,10 +6208,10 @@ "message": "Ocorreu um erro ao salvar as suas datas de apagamento e validade." }, "hideYourEmail": { - "message": "Oculte seu endereço de e-mail dos visualizadores." + "message": "Ocultar seu endereço de e-mail dos visualizadores." }, "webAuthnFallbackMsg": { - "message": "Para verificar seu 2FA, clique no botão abaixo." + "message": "Para verificar sua 2FA, clique no botão abaixo." }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" @@ -6232,7 +6232,7 @@ "message": "Sua senha nova não pode ser a mesma que a sua atual." }, "hintEqualsPassword": { - "message": "Sua dica de senha não pode ser a mesma que a sua senha." + "message": "A dica da sua senha não pode ser a mesma coisa que sua senha." }, "enrollAccountRecovery": { "message": "Inscrever-se na recuperação de conta" @@ -6247,7 +6247,7 @@ "message": "Inscrito com sucesso!" }, "withdrawPasswordResetSuccess": { - "message": "Retirou-se com sucesso!" + "message": "Retirada com sucesso!" }, "eventEnrollAccountRecovery": { "message": "O usuário $ID$ se inscreveu na recuperação de conta.", @@ -6268,7 +6268,7 @@ } }, "eventAdminPasswordReset": { - "message": "Senha principal do usuário $ID$ redefinida.", + "message": "Senha principal do usuário $ID$ reconfigurada.", "placeholders": { "id": { "content": "$1", @@ -6277,7 +6277,7 @@ } }, "eventResetSsoLink": { - "message": "Link de SSO redefinido para o usuário $ID$", + "message": "Reconfigurou o link do SSO para o usuário $ID$", "placeholders": { "id": { "content": "$1", @@ -6295,10 +6295,10 @@ } }, "resetPassword": { - "message": "Redefinir senha" + "message": "Reconfigurar senha" }, "resetPasswordLoggedOutWarning": { - "message": "O processo desconectará $NAME$ de sua sessão atual, obrigando que eles entrem novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", + "message": "O processo desconectará $NAME$ de sua sessão atual, obrigando que eles se conectem novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", "placeholders": { "name": { "content": "$1", @@ -6307,7 +6307,7 @@ } }, "emergencyAccessLoggedOutWarning": { - "message": "O processo desconectará $NAME$ de sua sessão atual, obrigando que eles entrem novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", + "message": "O processo desconectará $NAME$ de sua sessão atual, obrigando que eles se conectem novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora.", "placeholders": { "name": { "content": "$1", @@ -6325,55 +6325,55 @@ "message": "Uma ou mais políticas da organização exigem que a senha principal cumpra aos seguintes requisitos:" }, "resetPasswordSuccess": { - "message": "Senha redefinida com sucesso!" + "message": "Senha reconfigurada com sucesso!" }, "resetPasswordEnrollmentWarning": { - "message": "A inscrição permitirá que os administradores da organização alterem sua senha principal. Tem certeza que deseja se inscrever?" + "message": "A inscrição permitirá que os administradores da organização alterem sua senha principal" }, "accountRecoveryPolicy": { - "message": "Gerenciar recuperação de conta" + "message": "Gerenciamento da recuperação de conta" }, "accountRecoveryPolicyDesc": { - "message": "Baseado no método de criptografia, recupere contas quando senhas principais ou dispositivos confiáveis forem esquecidos ou perdidos." + "message": "Baseado no método de criptografia, recupere contas quando senhas principais ou dispositivos confiados forem esquecidos ou perdidos." }, "accountRecoveryPolicyWarning": { - "message": "Contas existentes com senhas principais exigirá que os membros se inscrevam antes que os administradores possam recuperar suas contas. A inscrição automática irá ativar a recuperação de conta para novos membros." + "message": "Contas existentes com senhas principais exigirão que os membros se inscrevam si mesmos antes que os administradores possam recuperar suas contas. A inscrição automática irá ativar a recuperação de conta para novos membros." }, "accountRecoverySingleOrgRequirementDesc": { "message": "A política empresarial de organização única deve ser ativada antes de ativar esta política." }, "resetPasswordPolicyAutoEnroll": { - "message": "Inscrição Automática" + "message": "Inscrição automática" }, "resetPasswordPolicyAutoEnrollCheckbox": { - "message": "Inscrever automaticamente novos usuários" + "message": "Exigir que novos membros sejam inscritos automaticamente" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na redefinição de senha. A inscrição permitirá que os administradores da organização alterem sua senha principal." + "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na reconfiguração de senha. A inscrição permitirá que os administradores da organização alterem sua senha principal." }, "resetPasswordOrgKeysError": { - "message": "A resposta das Chaves da Organização é nula" + "message": "A resposta das chaves da organização é nula" }, "resetPasswordDetailsError": { - "message": "A resposta para Redefinir os Detalhes da Senha é nula" + "message": "A resposta para os detalhes de reconfiguração de senha é nula" }, "trashCleanupWarning": { - "message": "As cifras que ficarem na lixeira por mais de 30 dias serão excluídas automaticamente." + "message": "Items que estão na lixeira por mais de 30 dias serão apagados automaticamente." }, "trashCleanupWarningSelfHosted": { - "message": "As cifras que estiverem na Lixeira por um tempo serão excluídas automaticamente." + "message": "Itens que ficarem na lixeira por um tempo serão apagados automaticamente." }, "passwordPrompt": { - "message": "Nova solicitação de senha principal" + "message": "Resolicitar senha principal" }, "passwordConfirmation": { "message": "Confirmação de senha principal" }, "passwordConfirmationDesc": { - "message": "Esta ação está protegida. Para continuar, por favor, reinsira a sua senha principal para verificar sua identidade." + "message": "Esta ação está protegida. Para continuar, digite a sua senha principal novamente para verificar sua identidade." }, "reinviteSelected": { - "message": "Reenviar Convites" + "message": "Reenviar convites" }, "resendNotification": { "message": "Reenviar notificação" @@ -6385,7 +6385,7 @@ "message": "Tem certeza de que deseja remover os seguintes usuários? O processo pode levar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." }, "removeOrgUsersConfirmation": { - "message": "Quando membro(s) são removidos, eles não têm acesso aos dados da organização e esta ação é irreversível. Para adicionar o membro de volta à organização, ele deve ser convidado e integrado novamente. O processo pode demorar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." + "message": "Quando membro(s) são removidos, eles não têm mais acesso aos dados da organização e esta ação é irreversível. Para adicionar o membro de volta à organização, ele deve ser convidado e integrado novamente. O processo pode demorar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." }, "revokeUsersWarning": { "message": "Quando membro(s) são revogados, eles não têm mais acesso aos dados da organização. Para restaurar o acesso rapidamente, vá para a aba Revogados. O processo pode demorar alguns segundos para ser concluído e não pode ser interrompido ou cancelado." @@ -6397,7 +6397,7 @@ "message": "Escolha um tema para o seu cofre web." }, "themeSystem": { - "message": "Usar Tema do Sistema" + "message": "Usar tema do sistema" }, "themeDark": { "message": "Escuro" @@ -6406,16 +6406,16 @@ "message": "Claro" }, "confirmSelected": { - "message": "Confirmar Selecionado(s)" + "message": "Confirmar selecionados" }, "bulkConfirmStatus": { - "message": "Status de ação em massa" + "message": "Estado de ação em massa" }, "bulkConfirmMessage": { - "message": "Confirmado com sucesso." + "message": "Confirmado com sucesso" }, "bulkReinviteMessage": { - "message": "Convidado novamente com sucesso." + "message": "Re-convidado com sucesso" }, "bulkRemovedMessage": { "message": "Removido com sucesso" @@ -6427,13 +6427,13 @@ "message": "Acesso à organização restaurado com sucesso" }, "bulkFilteredMessage": { - "message": "Excluído, não aplicável para esta ação." + "message": "Excluído, não aplicável para esta ação" }, "nonCompliantMembersTitle": { - "message": "Membros não compatíveis" + "message": "Membros não adequados" }, "nonCompliantMembersError": { - "message": "Os membros que não estão em conformidade com a política de “login” único ou de duas etapas não poderão ser restaurados até cumprirem os requisitos da política" + "message": "Os membros que não estão em conformidade com a política de organização única ou de duas etapas não poderão ser restaurados até cumprirem os requisitos da política" }, "fingerprint": { "message": "Impressão digital" @@ -6445,13 +6445,13 @@ "message": "Erro" }, "decryptionError": { - "message": "Erro ao descriptografar" + "message": "Erro de descriptografia" }, "couldNotDecryptVaultItemsBelow": { "message": "O Bitwarden não pôde descriptografar o(s) item(ns) do cofre listado abaixo." }, "contactCSToAvoidDataLossPart1": { - "message": "Contato com o cliente feito com sucesso", + "message": "Contate o costumer success", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -6462,19 +6462,19 @@ "message": "Gerenciar usuários também devem ser concedidos com a permissão de gerenciar a recuperação de contas" }, "setupProvider": { - "message": "Configuração do Provedor" + "message": "Configuração do provedor" }, "setupProviderLoginDesc": { - "message": "Você foi convidado para configurar um novo provedor. Para continuar, você precisa iniciar sessão ou criar uma nova conta no Bitwarden." + "message": "Você foi convidado para configurar um novo provedor. Para continuar, você precisa se conectar ou criar uma nova conta no Bitwarden." }, "setupProviderDesc": { - "message": "Por favor, insira os detalhes abaixo para completar a configuração do provedor. Entre em Contato com o Suporte ao Cliente se tiver alguma dúvida." + "message": "Digite os detalhes abaixo para completar a configuração do provedor. Entre em contato com o suporte ao cliente se tiver alguma dúvida." }, "providerName": { - "message": "Nome do Provedor" + "message": "Nome do provedor" }, "providerSetup": { - "message": "O provedor foi configurado." + "message": "Provedor configurado com sucesso" }, "clients": { "message": "Clientes" @@ -6484,13 +6484,13 @@ "description": "This is used as a table header to describe which client application created an event log." }, "providerAdmin": { - "message": "Administrador do Provedor" + "message": "Administrador do provedor" }, "providerAdminDesc": { "message": "O usuário de maior acesso que pode gerenciar todos os aspectos do seu provedor, bem como acessar e gerenciar organizações de clientes." }, "serviceUser": { - "message": "Usuário de Serviço" + "message": "Usuário do serviço" }, "serviceUserDesc": { "message": "Os usuários do serviço podem acessar e gerenciar todas as organizações de clientes." @@ -6499,10 +6499,10 @@ "message": "Convide um novo usuário para seu provedor digitando o endereço de e-mail da conta Bitwarden dele abaixo. Se ele não tiver uma conta no Bitwarden, ele será solicitado a criar uma nova conta." }, "joinProvider": { - "message": "Participar do Provedor" + "message": "Juntar-se ao provedor" }, "joinProviderDesc": { - "message": "Você foi convidado para participar do provedor listado acima. Para aceitar o convite, você precisa iniciar sessão ou criar uma nova conta no Bitwarden." + "message": "Você foi convidado para participar do provedor listado acima. Para aceitar o convite, você precisa se conectar ou criar uma nova conta no Bitwarden." }, "providerInviteAcceptFailed": { "message": "Não foi possível aceitar o convite. Peça ao administrador do provedor para enviar um novo convite." @@ -6517,25 +6517,25 @@ "message": "Provedor" }, "newClientOrganization": { - "message": "Nova Organização de Cliente" + "message": "Nova organização de cliente" }, "newClientOrganizationDesc": { - "message": "Crie uma nova organização de cliente que será associada a você como o provedor. Você poderá acessar e gerenciar esta organização." + "message": "Crie uma organização de cliente que será associada a você como o provedor. Você poderá acessar e gerenciar esta organização." }, "newClient": { "message": "Novo cliente" }, "addExistingOrganization": { - "message": "Adicionar Organização Existente" + "message": "Adicionar organização existente" }, "addNewOrganization": { "message": "Adicionar nova organização" }, "myProvider": { - "message": "Meu Provedor" + "message": "Meu provedor" }, "addOrganizationConfirmation": { - "message": "Tem certeza de que deseja adicionar $ORGANIZATION$ como um cliente a $PROVIDER$?", + "message": "Tem certeza de que deseja adicionar $ORGANIZATION$ como um cliente de $PROVIDER$?", "placeholders": { "organization": { "content": "$1", @@ -6560,10 +6560,10 @@ } }, "providerIsDisabled": { - "message": "O provedor está desativado." + "message": "Provedor suspenso" }, "providerUpdated": { - "message": "Provedor atualizado" + "message": "Provedor salvo" }, "yourProviderIs": { "message": "Seu provedor é $PROVIDER$. Eles têm privilégios administrativos e de cobrança para sua organização.", @@ -6590,70 +6590,70 @@ "message": "Adicionar" }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "Senha principal configurada com sucesso" }, "updatedMasterPassword": { - "message": "Senha Mestra Atualizada" + "message": "Senha principal salva" }, "updateMasterPassword": { - "message": "Atualizar Senha Mestra" + "message": "Atualizar senha principal" }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "Altere a sua senha principal para concluir a recuperação da conta." }, "updateMasterPasswordSubtitle": { - "message": "Your master password does not meet this organization’s requirements. Change your master password to continue." + "message": "Sua senha principal não corresponde aos requisitos dessa organização. Altere a sua senha principal para continuar." }, "updateMasterPasswordWarning": { - "message": "Sua Senha Mestra foi alterada recentemente por um administrador em sua organização. Para acessar o cofre, você deve atualizar sua Senha Mestra agora. Prosseguir irá desconectá-lo da sessão atual, exigindo que você faça login novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora." + "message": "Sua senha principal foi alterada recentemente por um administrador na sua organização. Para acessar o cofre, você deve atualizar sua senha principal agora. Prosseguir irá desconectá-lo da sessão atual, exigindo que você se conecte novamente. As sessões ativas em outros dispositivos podem continuar ativas por até uma hora." }, "masterPasswordInvalidWarning": { - "message": "Sua Senha Mestra foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizar sua Senha Mestra agora. O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." + "message": "A sua senha principal não atende aos requisitos da política desta organização. Para poder se juntar à organização, você precisa atualizar sua senha principal agora. O processo te desconectará da sua sessão atual, exigindo que você se conecte novamente. Sessões ativas em outros dispositivos podem ficar ativas por até uma hora." }, "updateWeakMasterPasswordWarning": { - "message": "A sua senha principal não atende a uma ou mais das políticas da sua organização. Para acessar o cofre, você deve atualizar a sua senha principal agora. O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora." + "message": "A sua senha principal não atende aos requisitos da política desta organização. Para poder acessar o cofre, você precisa atualizar sua senha principal agora. O processo te desconectará da sua sessão atual, exigindo que você se conecte novamente. Sessões ativas em outros dispositivos podem ficar ativas por até uma hora." }, "automaticAppLoginWithSSO": { - "message": "Automatic login with SSO" + "message": "Autenticação automática com SSO" }, "automaticAppLoginWithSSODesc": { - "message": "Extend SSO security and convenience to unmanaged apps. When users launch an app from your identity provider, their login details are automatically filled and submitted, creating a one-click, secure flow from the identity provider to the app." + "message": "Estenda a segurança e conveniência do SSO para aplicativos não gerenciados. Quando usuários abrir um aplicativo pelo seu provedor de identidade, os detalhes de autenticação serão preenchidos e enviados automaticamente, criando um fluxo seguro e de um só clique do provedor de identidade ao aplicativo." }, "automaticAppLoginIdpHostLabel": { - "message": "Provedor de identidade" + "message": "Servidor do provedor de identidade" }, "automaticAppLoginIdpHostDesc": { - "message": "Digite a URL do seu provedor de identidade. Insira vários URLs, separando com uma vírgula." + "message": "Digite o URL do seu provedor de identidade. Digite vários URLs separando com uma vírgula." }, "tdeDisabledMasterPasswordRequired": { - "message": "Sua organização atualizou suas opções de descriptografia. Por favor, defina uma senha principal para acessar seu cofre." + "message": "Sua organização atualizou suas opções de descriptografia. Configure uma senha principal para acessar seu cofre." }, "sessionTimeoutPolicyTitle": { - "message": "Session timeout" + "message": "Tempo limite da sessão" }, "sessionTimeoutPolicyDescription": { - "message": "Set a maximum session timeout for all members except owners." + "message": "Configure um tempo limite máximo para a sessão de todos os membros, exceto os proprietários." }, "maximumAllowedTimeout": { - "message": "Maximum allowed timeout" + "message": "Tempo limite máximo permitido" }, "maximumAllowedTimeoutRequired": { - "message": "Maximum allowed timeout is required." + "message": "Tempo limite máximo permitido é necessário." }, "sessionTimeoutPolicyInvalidTime": { - "message": "Time is invalid. Change at least one value." + "message": "Tempo é inválido. Altere pelo menos um valor." }, "sessionTimeoutAction": { - "message": "Session timeout action" + "message": "Ação do tempo limite da sessão" }, "immediately": { - "message": "Immediately" + "message": "Imediatamente" }, "onSystemLock": { - "message": "On system lock" + "message": "No bloqueio do sistema" }, "onAppRestart": { - "message": "On app restart" + "message": "No reinício do aplicativo" }, "hours": { "message": "Horas" @@ -6662,22 +6662,22 @@ "message": "Minutos" }, "sessionTimeoutConfirmationNeverTitle": { - "message": "Are you certain you want to allow a maximum timeout of \"Never\" for all members?" + "message": "Você tem certeza de que deseja permitir um tempo limite máximo de \"Nunca\" para todos os membros?" }, "sessionTimeoutConfirmationNeverDescription": { - "message": "This option will save your members' encryption keys on their devices. If you choose this option, ensure that their devices are adequately protected." + "message": "Esta opção salvará as chaves criptográficas dos seus membros em seus dispositivos. Se escolher esta opção, certifique-se de que seus dispositivos estão adequadamente protegidos." }, "learnMoreAboutDeviceProtection": { - "message": "Learn more about device protection" + "message": "Saiba mais sobre a proteção de dispositivos" }, "sessionTimeoutConfirmationOnSystemLockTitle": { - "message": "\"System lock\" will only apply to the browser and desktop app" + "message": "\"Bloqueio de sistema\" só será aplicado ao navegador e aplicativo de computador" }, "sessionTimeoutConfirmationOnSystemLockDescription": { - "message": "The mobile and web app will use \"on app restart\" as their maximum allowed timeout, since the option is not supported." + "message": "O aplicativo móvel e web usarão \"no reinício do aplicativo\" como tempo máximo permitido, já que a opção não é suportada." }, "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)", + "message": "As políticas da sua organização configuraram o seu máximo permitido do tempo limite do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { "hours": { "content": "$1", @@ -6703,7 +6703,7 @@ } }, "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}.", + "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. \nO tempo limite máximo permitido para o cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre está configurada como $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -6720,7 +6720,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "As políticas da sua organização definiram a ação tempo limite do seu cofre para $ACTION$.", + "message": "As políticas da sua organização configuraram a ação do tempo limite do seu cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -6729,205 +6729,205 @@ } }, "vaultTimeoutToLarge": { - "message": "O tempo limite do seu cofre excede a restrição definida por sua organização." + "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." }, "vaultCustomTimeoutMinimum": { - "message": "Tempo limite mínimo personalizado é 1 minuto." + "message": "O mínimo do tempo limite personalizado é de 1 minuto." }, "vaultTimeoutRangeError": { "message": "Tempo limite do cofre não está dentro do intervalo permitido." }, "disablePersonalVaultExport": { - "message": "Desabilitar Exportação de Cofre Pessoal" + "message": "Remover exportação do cofre individual" }, "disablePersonalVaultExportDescription": { "message": "Não permita que os membros exportem dados do seu cofre individual." }, "vaultExportDisabled": { - "message": "Exportação de Cofre Desabilitada" + "message": "Exportação de cofre removida" }, "personalVaultExportPolicyInEffect": { - "message": "Uma ou mais políticas da organização impdem que você exporte seu cofre pessoal." + "message": "Uma ou mais políticas da organização impedem que você exporte seu cofre individual." }, "activateAutofill": { "message": "Ativar preenchimento automático" }, "activateAutofillPolicyDesc": { - "message": "Ative a configuração de preenchimento automático ao carregamento de página na extensão do navegador para todos os membros existentes e novos." + "message": "Ative a configuração de preenchimento automático no carregamento da página na extensão do navegador para todos os membros existentes e novos." }, "experimentalFeature": { - "message": "Sites comprometidos ou não confiáveis podem tomar vantagem do autopreenchimento ao carregar a página." + "message": "Sites comprometidos ou não confiáveis podem tomar vantagem do preenchimento automático ao carregar a página." }, "learnMoreAboutAutofill": { "message": "Saiba mais sobre o preenchimento automático" }, "selectType": { - "message": "Selecionar Tipo de SSO" + "message": "Selecionar tipo de SSO" }, "type": { "message": "Tipo" }, "openIdConnectConfig": { - "message": "Configuração OpenID Connect" + "message": "Configuração do OpenID Connect" }, "samlSpConfig": { - "message": "Configuração do Provedor de Serviço SAML" + "message": "Configuração do provedor de serviço SAML" }, "samlIdpConfig": { - "message": "Configuração do Provedor de Identidade SAML" + "message": "Configuração do provedor de identidade SAML" }, "callbackPath": { - "message": "Caminho de Retorno" + "message": "Caminho de callback" }, "signedOutCallbackPath": { - "message": "Caminho de Retorno de Chamada Desconectado" + "message": "Caminho de callback desconectado" }, "authority": { "message": "Autoridade" }, "clientId": { - "message": "ID do Cliente" + "message": "ID do cliente" }, "clientSecret": { - "message": "Segredo do Cliente" + "message": "Segredo do cliente" }, "metadataAddress": { - "message": "Endereço dos Metadados" + "message": "Endereço dos metadados" }, "oidcRedirectBehavior": { - "message": "Comportamento de Redirecionamento OIDC" + "message": "Comportamento de redirecionamento OIDC" }, "getClaimsFromUserInfoEndpoint": { - "message": "Obter Reivindicações do Terminal de Informações do Usuário" + "message": "Obter reivindicações do link de informações de usuário" }, "additionalScopes": { - "message": "Escopos Adicionais/Personalizados (delimitado por vírgulas)" + "message": "Escopos personalizados" }, "additionalUserIdClaimTypes": { - "message": "Tipos de Reivindicação de ID de Usuário Adicionais/Personalizados (delimitado por vírgulas)" + "message": "Tipos de reivindicação de ID de usuário personalizado" }, "additionalEmailClaimTypes": { - "message": "Tipos de Reivindicação de E-mail Adicionais/Personalizados (delimitado por vírgulas)" + "message": "Tipos de reivindicação de e-mail" }, "additionalNameClaimTypes": { - "message": "Tipos de Reivindicação de Nome Adicionais/Personalizados (delimitado por vírgulas)" + "message": "Tipos de reivindicação de nomes personalizados" }, "acrValues": { - "message": "Valores de Referência de Classe de Contexto de Autenticação Solicitada (acr_values)" + "message": "Valores de referência de classe de contexto de autenticação solicitados" }, "expectedReturnAcrValue": { - "message": "Esperado Valor de Reivindicação \"acr\" Na Resposta (validação acr)" + "message": "Era esperado o valor de reivindicação \"acr\" na resposta" }, "spEntityId": { - "message": "ID da Entidade SP" + "message": "ID da entidade SP" }, "spMetadataUrl": { - "message": "URL de Metadados SAML 2.0" + "message": "URL de metadados do SAML 2.0" }, "spAcsUrl": { - "message": "URL do Serviço de Declaração de Consumidor (ACS)" + "message": "URL do serviço de declaração de consumidor (ACS)" }, "spNameIdFormat": { - "message": "Formato ID do Nome" + "message": "Formato do ID do nome" }, "spOutboundSigningAlgorithm": { - "message": "Algoritmo de Assinatura de Saída" + "message": "Algoritmo de assinatura de saída" }, "spSigningBehavior": { - "message": "Comportamento de Assinatura" + "message": "Comportamento de assinatura" }, "spMinIncomingSigningAlgorithm": { - "message": "Algoritmo de Assinatura de Entrada Mínima" + "message": "Algoritmo mínimo de assinatura de entrada" }, "spWantAssertionsSigned": { - "message": "Precisa de Declarações Assinadas" + "message": "Supor declarações assinadas" }, "spValidateCertificates": { - "message": "Validar Certificados" + "message": "Validar certificados" }, "spUniqueEntityId": { - "message": "Defina um ID único de entidade SP" + "message": "Configurar ID único para entidade SP" }, "spUniqueEntityIdDesc": { - "message": "Gerar um identificador que seja exclusivo para sua organização" + "message": "Gere um identificador que é único para a sua organização" }, "idpEntityId": { - "message": "ID da Entidade" + "message": "ID da entidade" }, "idpBindingType": { - "message": "Tipo de Ligação" + "message": "Tipo de vínculo" }, "idpSingleSignOnServiceUrl": { - "message": "URL de Serviço de Logon Único" + "message": "URL do serviço de autenticação única" }, "idpSingleLogoutServiceUrl": { - "message": "URL de Serviço de Desconexão Único" + "message": "URL do serviço de desconexão única" }, "idpX509PublicCert": { - "message": "Certificado Público X509" + "message": "Certificado público X509" }, "idpOutboundSigningAlgorithm": { - "message": "Algoritmo de Assinatura de Saída" + "message": "Algoritmo de assinatura de saída" }, "idpAllowUnsolicitedAuthnResponse": { - "message": "Permitir Retorno de Autenticação Não Solicitada" + "message": "Permitir respostas não solicitadas de autenticação" }, "idpAllowOutboundLogoutRequests": { - "message": "Permitir pedidos de saída" + "message": "Permitir solicitações de desconexão de saída" }, "idpSignAuthenticationRequests": { - "message": "Assinar pedidos de autenticação" + "message": "Assinar solicitações de autenticação" }, "ssoSettingsSaved": { - "message": "Configuração de logon único foi salva." + "message": "Configuração da autenticação única salva" }, "sponsoredFamilies": { - "message": "Bitwarden Families Gratuito" + "message": "Bitwarden Famílias Grátis" }, "sponsoredBitwardenFamilies": { - "message": "Sponsored families" + "message": "Famílias financiadas" }, "noSponsoredFamiliesMessage": { - "message": "No sponsored families" + "message": "Nenhuma família financiada" }, "nosponsoredFamiliesDetails": { - "message": "Sponsored non-member families plans will display here" + "message": "Planos familiares financiados de não membros aparecerão aqui" }, "sponsorshipFreeBitwardenFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. You can sponsor Free Bitwarden Families for employees who are not a member of your Bitwarden organization. Sponsoring a non-member requires an available seat within your organization." + "message": "Os membros da sua organização são elegíveis para o Bitwarden Famílias Grátis. Você pode financiar o Bitwarden Famílias de graça para funcionários que não são membros da sua organização do Bitwarden. Para financiar um não membro, é necessária uma vaga disponível dentro da sua organização." }, "sponsoredFamiliesRemoveActiveSponsorship": { - "message": "When you remove an active sponsorship, a seat within your organization will be available after the renewal date of the sponsored organization." + "message": "Quando você remove um financiamento ativo, uma vaga dentro da sua organização ficará disponível após a data de renovação da organização financiada." }, "sponsoredFamiliesEligible": { - "message": "Você e sua família estão elegíveis para o Bitwarden Families Gratuito. Resgate com seu e-mail pessoal para manter seus dados seguros mesmo quando você não estiver no trabalho." + "message": "Você e a sua família são elegíveis para o Bitwarden Famílias Grátis. Resgate com seu e-mail pessoal para manter seus dados seguros mesmo quando você não estiver no trabalho." }, "sponsoredFamiliesEligibleCard": { - "message": "Resgate o seu plano Bitwarden for Families Grátis hoje para manter seus dados seguros mesmo quando você não estiver no trabalho." + "message": "Resgate o seu plano Bitwarden Famílias Grátis hoje para manter seus dados seguros mesmo quando não estiver no trabalho." }, "sponsoredFamiliesIncludeMessage": { - "message": "The Bitwarden for Families plan includes" + "message": "O plano Bitwarden Famílias inclui" }, "sponsoredFamiliesPremiumAccess": { - "message": "Acesso premium para até 6 usuários" + "message": "Acesso Premium para até 6 usuários" }, "sponsoredFamiliesSharedCollectionsForFamilyMembers": { - "message": "Shared collections for family members" + "message": "Conjuntos compartilhados para membros da família" }, "memberFamilies": { - "message": "Member families" + "message": "Famílias de membros" }, "noMemberFamilies": { - "message": "No member families" + "message": "Nenhuma família de membros" }, "noMemberFamiliesDescription": { - "message": "Members who have redeemed family plans will display here" + "message": "Os membros que resgataram os planos familiares aparecerão aqui" }, "membersWithSponsoredFamilies": { - "message": "Members of your organization are eligible for Free Bitwarden Families. Here you can see members who have sponsored a Families organization." + "message": "Os membros da sua organização são elegíveis para o Bitwarden Famílias Grátis. Aqui você pode ver os membros que financiaram uma organização do Famílias." }, "organizationHasMemberMessage": { - "message": "A sponsorship cannot be sent to $EMAIL$ because they are a member of your organization.", + "message": "Um financiamento não pode ser enviado para $EMAIL$ porque eles são um membro da sua organização.", "placeholders": { "email": { "content": "$1", @@ -6936,31 +6936,31 @@ } }, "badToken": { - "message": "O link não é mais válido. Peça ao patrocinador para reenviar a oferta." + "message": "O link não é mais válido. Peça ao financiador para reenviar a oferta." }, "reclaimedFreePlan": { - "message": "Plano gratuito recuperado" + "message": "Plano gratuito resgatado" }, "redeem": { "message": "Resgatar" }, "sponsoredFamiliesSelectOffer": { - "message": "Selecione a organização que você gostaria de patrocinar" + "message": "Selecione a organização que você gostaria de financiar" }, "familiesSponsoringOrgSelect": { - "message": "Qual oferta do Families Grátis você gostaria de resgatar?" + "message": "Qual oferta do Famílias Grátis você gostaria de resgatar?" }, "sponsoredFamiliesEmail": { - "message": "Digite seu e-mail pessoal para resgatar o Bitwarden Families" + "message": "Digite o seu e-mail pessoal para resgatar o Bitwarden Famílias" }, "sponsoredFamiliesLeaveCopy": { - "message": "Se você sair ou for removido desta organização, seu plano do Families irá expirar no final do período de cobrança." + "message": "Se você remover uma oferta ou ser removido da organização financiante, o seu financiamento irá expirar na próxima data de renovação." }, "acceptBitwardenFamiliesHelp": { - "message": "Aceite a oferta de uma organização existente ou crie uma nova organização de Famílias." + "message": "Aceite a oferta de uma organização existente ou crie uma organização de Famílias." }, "setupSponsoredFamiliesLoginDesc": { - "message": "Foi oferecida a você uma Organização do Plano Bitwarden Families gratuita. Para continuar, você precisa entrar na conta que recebeu a oferta." + "message": "Foi oferecida a você uma organização do plano Bitwarden Famílias Grátis. Para continuar, você precisa se conectar à conta que recebeu a oferta." }, "sponsoredFamiliesAcceptFailed": { "message": "Não é possível aceitar a oferta. Reenvie o e-mail da oferta da conta corporativa e tente novamente." @@ -6975,10 +6975,10 @@ } }, "sponsoredFamiliesOffer": { - "message": "Resgatar Oferta de Organização do Bitwarden Families Gratuita" + "message": "Aceitar Bitwarden Familías Grátis" }, "sponsoredFamiliesOfferRedeemed": { - "message": "A Oferta Gratuita do Bitwarden Families foi resgatada com sucesso" + "message": "Oferta do Bitwarden Familías Grátis resgatada com sucesso" }, "redeemed": { "message": "Resgatado" @@ -6987,7 +6987,7 @@ "message": "Conta resgatada" }, "revokeAccountMessage": { - "message": "Revoke account $NAME$", + "message": "Revogar conta $NAME$", "placeholders": { "name": { "content": "$1", @@ -6996,7 +6996,7 @@ } }, "resendEmailLabel": { - "message": "Reenviar e-mail de Patrocínio para $NAME$ patrocínio", + "message": "Reenviar o e-mail de financiamento para o financiamento do $NAME$", "placeholders": { "name": { "content": "$1", @@ -7005,7 +7005,7 @@ } }, "freeFamiliesPlan": { - "message": "Plano de famílias gratuitas" + "message": "Plano Famílias grátis" }, "redeemNow": { "message": "Resgatar agora" @@ -7014,37 +7014,37 @@ "message": "Destinatário" }, "removeSponsorship": { - "message": "Remover Patrocínio" + "message": "Remover financiamento" }, "removeSponsorshipConfirmation": { - "message": "Após remover um patrocínio, você será responsável por esta assinatura e faturas relacionadas. Você tem certeza que deseja continuar?" + "message": "Após remover um financiamento, você ficará responsável por esta assinatura e as faturas relacionadas. Você tem certeza que deseja continuar?" }, "sponsorshipCreated": { - "message": "Patrocínio criado" + "message": "Financiamento criado" }, "emailSent": { "message": "E-mail enviado" }, "removeSponsorshipSuccess": { - "message": "Patrocínio Removido" + "message": "Financiamento removido" }, "ssoKeyConnectorError": { - "message": "Erro de Key Connector: certifique-se de que a Key Connector está disponível e funcionando corretamente." + "message": "Erro do Key Connector: certifique-se de que o Key Connector está disponível e funcionando corretamente." }, "keyConnectorUrl": { - "message": "URL de Conector de Chave" + "message": "URL do Key Connector" }, "sendVerificationCode": { "message": "Enviar um código de verificação para o seu e-mail" }, "sendCode": { - "message": "Enviar Código" + "message": "Enviar código" }, "codeSent": { - "message": "Código Enviado" + "message": "Código enviado" }, "verificationCode": { - "message": "Código de Verificação" + "message": "Código de verificação" }, "confirmIdentity": { "message": "Confirme a sua identidade para continuar." @@ -7053,22 +7053,22 @@ "message": "O código de verificação é necessário." }, "webauthnCancelOrTimeout": { - "message": "A autenticação foi cancelada ou demorou muito. Por favor tente novamente." + "message": "A autenticação foi cancelada ou demorou muito. Tente novamente." }, "invalidVerificationCode": { "message": "Código de verificação inválido" }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Uma senha principal não é mais necessária para membros da seguinte organização. Confirme o domínio abaixo com o administrador da sua organização." }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Domínio do Key Connector" }, "leaveOrganization": { - "message": "Sair da Organização" + "message": "Sair da organização" }, "removeMasterPassword": { - "message": "Remover Senha Mestra" + "message": "Remover senha principal" }, "removedMasterPassword": { "message": "Senha principal removida." @@ -7077,52 +7077,52 @@ "message": "Permitir autenticação por SSO" }, "allowSsoDesc": { - "message": "Uma vez definida, sua configuração será salva e os membros poderão se autenticar usando suas credenciais de Provedor de Identidade." + "message": "Uma vez configurada, sua configuração será salva e os membros poderão se autenticar usando suas credenciais do Provedor de Identidade." }, "ssoPolicyHelpStart": { - "message": "Ativar o", + "message": "Use a", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpAnchor": { - "message": "requer política de autenticação de logon único", + "message": "política de aplicação da autenticação única", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { - "message": "para exigir que todos os membros entrem com o SSO.", + "message": "para exigir que todos os membros se conectem com o SSO.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "memberDecryptionOption": { - "message": "Opções de Descriptografia de Membro" + "message": "Opções de descriptografia do membro" }, "memberDecryptionPassDesc": { - "message": "Uma vez autenticados, os membros irão descriptografar os dados do cofre usando suas Senhas Mestras." + "message": "Ao se autenticar, os membros descriptografarão os dados do cofre usando suas senhas principais." }, "keyConnector": { - "message": "Conector de Chave" + "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Conecte o login com SSO ao seu servidor de chave de descriptografia auto-hospedado. Usando essa opção, os membros não precisarão usar suas senhas principais para descriptografar os dados", + "message": "Conecte a autenticação com SSO ao seu servidor de chave de descriptografia auto-hospedado. Usando essa opção, os membros não precisarão usar suas senhas principais para descriptografar os dados dos cofres. As", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "requer autenticação SSO e políticas de organização única", + "message": "políticas de autenticação única e de organização única", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "são necessários para configurar a descriptografia do conector chave. Contacte o suporte do Bitwarden para configurar a assistência.", + "message": "são necessárias para configurar a descriptografia do Key Connector. Entre em contato com o suporte do Bitwarden para assistência na configuração.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { - "message": "\"Entrar com o SSO e Descriptografia de Conector de Chave\" está habilitado. Esta política se aplica apenas a Proprietários e Administradores." + "message": "\"Conectar-se com SSO e descriptografia do Key Connector\" está ativado. Esta política se aplica apenas a proprietários e administradores." }, "enabledSso": { - "message": "Ativado o SSO" + "message": "SSO foi ativado" }, "disabledSso": { - "message": "Desativado o SSO" + "message": "SSO foi desativado" }, "emailMustLoginWithSso": { - "message": "$EMAIL$ must login with Single Sign-on", + "message": "$EMAIL$ deve se conectar com a autenticação única", "placeholders": { "email": { "content": "$1", @@ -7131,58 +7131,58 @@ } }, "enabledKeyConnector": { - "message": "Ativado o Conector de Chave" + "message": "Key Connector foi ativado" }, "disabledKeyConnector": { - "message": "Desativado o Conector de Chave" + "message": "Key Connector foi desativado" }, "keyConnectorWarning": { - "message": "Depois que o Conector de Chave é configurado, as Opções de Descriptografia de Membro não podem ser alteradas." + "message": "Quando os membros começarem a usar o Key Connector, a sua organização não poderá reverter para a descriptografia com a senha principal. Prossiga somente se você está confortável com a implementação e gerenciamento de um servidor de chaves." }, "migratedKeyConnector": { - "message": "Migrado para o Conector de Chave" + "message": "Migrado para o Key Connector" }, "paymentSponsored": { - "message": "Por favor, forneça uma forma de pagamento para associar à organização. Não se preocupe, não cobraremos nada, a menos que você selecione recursos adicionais ou seu patrocínio expire. " + "message": "Forneça uma forma de pagamento para associar à organização. Não se preocupe, não cobraremos nada, a menos que você selecione recursos adicionais ou seu financiamento expire. " }, "orgCreatedSponsorshipInvalid": { - "message": "A oferta de patrocínio expirou, você pode excluir a organização que criou para evitar uma cobrança no final do seu teste de 7 dias. Caso contrário, você pode fechar este alerta para manter a organização e assumir a responsabilidade pela cobrança." + "message": "A oferta de financiamento expirou, você pode apagar a organização que criou para evitar uma cobrança no final do seu teste de 7 dias. Caso contrário, você pode fechar este alerta para manter a organização e assumir a responsabilidade pela cobrança." }, "newFamiliesOrganization": { - "message": "Nova Organização de Famílias" + "message": "Nova organização de Famílias" }, "acceptOffer": { - "message": "Aceitar Oferta" + "message": "Aceitar oferta" }, "sponsoringOrg": { - "message": "Organização Patrocinadora" + "message": "Organização financiante" }, "keyConnectorTest": { "message": "Testar" }, "keyConnectorTestSuccess": { - "message": "Sucesso! Conector de Chave acessado." + "message": "Sucesso! O Key Connector foi contatado." }, "keyConnectorTestFail": { - "message": "Não foi possível acessar o Conector de Chave. Verifique a URL." + "message": "Não é possível acessar o Key Connector. Verifique o URL." }, "sponsorshipTokenHasExpired": { - "message": "A oferta de patrocínio expirou." + "message": "A oferta de financiamento expirou." }, "freeWithSponsorship": { - "message": "GRÁTIS com patrocínio" + "message": "GRÁTIS com financiamento" }, "viewBillingSyncToken": { - "message": "Ver Token de Faturamento Sync" + "message": "Ver token de sincronização de faturamento" }, "generateBillingToken": { "message": "Gerar token de faturamento" }, "copyPasteBillingSync": { - "message": "Copie e cole esse token nas configurações de Faturamento Sync da sua organização auto-hospedada." + "message": "Copie e cole esse token nas configurações de sincronização de faturamento da sua organização auto-hospedada." }, "billingSyncCanAccess": { - "message": "Seu token de faturamento Sync pode acessar e editar as configurações de assinatura desta organização." + "message": "Seu token de sincronização de faturamento pode acessar e editar as configurações de assinatura desta organização." }, "manageBillingTokenSync": { "message": "Gerenciar token de faturamento" @@ -7191,16 +7191,16 @@ "message": "Configurar sincronização de faturamento" }, "generateToken": { - "message": "Gerar o token" + "message": "Gerar token" }, "rotateToken": { - "message": "Renovar Token" + "message": "Rotacionar token" }, "rotateBillingSyncTokenWarning": { - "message": "Se você continuar, precisará re-configurar a sincronização de cobrança no seu servidor auto-hospedado." + "message": "Se você continuar, precisará reconfigurar a sincronização de faturamento no seu servidor auto-hospedado." }, "rotateBillingSyncTokenTitle": { - "message": "Renovar o Token de Sincronização de Cobrança invalidará o token anterior." + "message": "Rotacionar o token de sincronização de faturamento invalidará o token anterior." }, "selfHostedServer": { "message": "auto-hospedado" @@ -7212,49 +7212,49 @@ "message": "Especifique a URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { - "message": "Para usuários avançados. Você pode especificar a URL de base de cada serviço independentemente." + "message": "Para configuração avançada, você pode especificar o URL de base de cada serviço independentemente." }, "selfHostedEnvFormInvalid": { - "message": "Você deve adicionar um URL do servidor de base ou pelo menos um ambiente personalizado." + "message": "Você deve adicionar um URL de base de um servidor ou pelo menos um ambiente personalizado." }, "selfHostedEnvMustUseHttps": { - "message": "URLs must use HTTPS." + "message": "URLs devem usar HTTPS." }, "apiUrl": { - "message": "URL do servidor API" + "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "URL do servidor do Cofre Web" + "message": "URL do servidor do cofre web" }, "identityUrl": { "message": "URL do servidor de identidade" }, "notificationsUrl": { - "message": "URL do servidor notificações" + "message": "URL do servidor de notificações" }, "iconsUrl": { - "message": "URL do Servidor de Ícones" + "message": "URL do servidor de ícones" }, "environmentSaved": { - "message": "URLs para ambiente salvo" + "message": "URLs do ambiente salvas" }, "selfHostingTitle": { - "message": "Auto-hospedado" + "message": "Auto-hospedagem" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "Para configurar sua organização no seu próprio servidor, você precisará fazer o upload do arquivo de licença. Para oferecer suporte a planos de famílias gratuitas e recursos avançados de faturamento para a sua organização auto-hospedada, você precisará configurar a sincronização de cobrança." + "message": "Para configurar sua organização no seu próprio servidor, você precisará enviar o arquivo da licença. Para oferecer suporte a planos do Famílias Grátis e recursos avançados de faturamento para a sua organização auto-hospedada, você precisará configurar a sincronização de faturamento." }, "billingSyncApiKeyRotated": { - "message": "Token renovado" + "message": "Token rotacionado" }, "billingSyncKeyDesc": { - "message": "Um Token de sincronização de faturamento das configurações de assinatura da sua organização da nuvem é necessário para completar este formulário." + "message": "Um token de sincronização de faturamento das configurações de assinatura da sua organização da nuvem é necessário para completar este formulário." }, "billingSyncKey": { - "message": "Token de Sincronização de Faturamento" + "message": "Token de sincronização de faturamento" }, "automaticBillingSyncDesc": { - "message": "Sincronização automática desbloqueia os patrocínios das famílias e permite-lhe sincronizar sua licença sem enviar um arquivo. Depois de fazer atualizações no servidor da nuvem do Bitwarden, selecione Sincronizar licença para aplicar as alterações." + "message": "A sincronização automática desbloqueia o financiamento das famílias e te permite sincronizar sua licença sem enviar um arquivo. Depois de atualizar o servidor da nuvem do Bitwarden, selecione Sincronizar licença para aplicar as alterações." }, "active": { "message": "Ativo" @@ -7263,13 +7263,13 @@ "message": "Inativo" }, "sentAwaitingSync": { - "message": "Enviado (Aguardando Sincronização)" + "message": "Enviado (aguardando sincronização)" }, "sent": { "message": "Enviado" }, "requestRemoved": { - "message": "Removido (Aguardando Sincronização)" + "message": "Removido (aguardando sincronização)" }, "requested": { "message": "Solicitado" @@ -7321,7 +7321,7 @@ } }, "idpSingleSignOnServiceUrlRequired": { - "message": "Necessário se o ID da Entidade não for um URL." + "message": "Necessário se o ID da entidade não for um URL." }, "offerNoLongerValid": { "message": "Esta oferta não é mais válida. Entre em contato com os administradores da sua organização para obter mais informações." @@ -7333,19 +7333,19 @@ "message": "Necessário se a autoridade não for válida." }, "separateMultipleWithComma": { - "message": "Separe várias tags com vírgula." + "message": "Separe vários com uma vírgula." }, "sessionTimeout": { - "message": "Sua sessão expirou. Volte e tente iniciar a sessão novamente." + "message": "Sua sessão expirou. Volte e tente se conectar novamente." }, "exportingPersonalVaultTitle": { - "message": "Exportando Cofre Pessoal" + "message": "Exportando cofre individual" }, "exportingOrganizationVaultTitle": { - "message": "Exportando o Cofre da Organização" + "message": "Exportando cofre da organização" }, "exportingIndividualVaultDescription": { - "message": "Apenas os itens individuais do cofre associados a $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos. Apenas as informações de item do cofre serão exportadas e não incluirão anexos associados.", + "message": "Apenas os itens do cofre individual associados a $EMAIL$ serão exportados. Os itens do cofre de organizações não serão incluídos. Apenas as informações dos itens do cofre serão exportadas e não incluirão anexos associados.", "placeholders": { "email": { "content": "$1", @@ -7354,7 +7354,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Apenas os itens individuais do cofre, incluindo anexos associados ao $EMAIL$ serão exportados. Os itens do cofre da organização não serão incluídos", + "message": "Apenas os itens do cofre individual, incluindo anexos associados com $EMAIL$ serão exportados. Os itens do cofre de organizações não serão incluídos", "placeholders": { "email": { "content": "$1", @@ -7363,7 +7363,7 @@ } }, "exportingOrganizationVaultDesc": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre pessoal e itens de outras organizações não serão incluídos.", + "message": "Apenas o cofre da organização associado a $ORGANIZATION$ será exportado. Itens de cofres individuais e de outras organizações não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -7372,7 +7372,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado.", "placeholders": { "organization": { "content": "$1", @@ -7381,7 +7381,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Os itens dos meus conjuntos não serão incluídos.", "placeholders": { "organization": { "content": "$1", @@ -7393,10 +7393,10 @@ "message": "Acesso negado. Você não tem permissão para ver esta página." }, "noPageAccess": { - "message": "You do not have access to this page" + "message": "Você não tem acesso a esta página" }, "masterPassword": { - "message": "Senha Mestra" + "message": "Senha principal" }, "security": { "message": "Segurança" @@ -7405,10 +7405,10 @@ "message": "Chaves" }, "billingHistory": { - "message": "Histórico de Cobrança" + "message": "Histórico de cobrança" }, "backToReports": { - "message": "Voltar para Relatórios" + "message": "Voltar aos relatórios" }, "organizationPicker": { "message": "Seletor de organização" @@ -7427,35 +7427,35 @@ } }, "accountSettings": { - "message": "Configurações da Conta" + "message": "Configurações da conta" }, "generator": { "message": "Gerador", "description": "Short for 'credential generator'." }, "generateUsername": { - "message": "Gerar Usuário" + "message": "Gerar nome de usuário" }, "generateEmail": { "message": "Gerar e-mail" }, "generatePassword": { - "message": "Gerar Senha" + "message": "Gerar senha" }, "generatePassphrase": { "message": "Gerar frase secreta" }, "passwordGenerated": { - "message": "Password generated" + "message": "Senha gerada" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Frase secreta gerada" }, "usernameGenerated": { - "message": "Username generated" + "message": "Nome de usuário gerado" }, "emailGenerated": { - "message": "Email generated" + "message": "E-mail gerado" }, "spinboxBoundariesHint": { "message": "Valor deve ser entre $MIN$ e $MAX$.", @@ -7472,7 +7472,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ caracteres ou mais para gerar uma senha forte.", + "message": " Utilize $RECOMMENDED$ ou mais caracteres para gerar um senha forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -7482,7 +7482,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use palavras $RECOMMENDED$ ou mais para gerar uma frase secreta forte.", + "message": " Utilize $RECOMMENDED$ ou mais palavras para gerar uma frase secreta forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -7492,7 +7492,7 @@ } }, "plusAddressedEmail": { - "message": "E-mail alternativo (com um +)", + "message": "E-mail endereçado com +", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -7502,7 +7502,7 @@ "message": "E-mail pega-tudo" }, "catchallEmailDesc": { - "message": "Use o catch-all configurado no seu domínio." + "message": "Use a caixa de entrada pega-tudo configurada no seu domínio." }, "useThisEmail": { "message": "Usar este e-mail" @@ -7512,25 +7512,25 @@ "description": "Generates domain-based username using random letters" }, "randomWord": { - "message": "Palavra Aleatória" + "message": "Palavra aleatória" }, "usernameGenerator": { - "message": "Gerador de usuário" + "message": "Gerador de nome de usuário" }, "useThisPassword": { - "message": "Use esta senha" + "message": "Usar esta senha" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Usar esta frase secreta" }, "useThisUsername": { - "message": "Use este nome de usuário" + "message": "Usar este nome de usuário" }, "securePasswordGenerated": { - "message": "Senha segura gerada! Não se esqueça de atualizar também sua senha no site." + "message": "Senha segura gerada! Não se esqueça de atualizar sua senha no site também." }, "useGeneratorHelpTextPartOne": { - "message": "Usar o gerador", + "message": "Use o gerador", "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'" }, "useGeneratorHelpTextPartTwo": { @@ -7541,19 +7541,19 @@ "message": "Serviço" }, "unknownCipher": { - "message": "Item desconhecido, talvez você precise fazer login com outra conta para acessar este item." + "message": "Item desconhecido, talvez você precise pedir permissão para acessar este item." }, "unknownSecret": { - "message": "Unknown secret, you may need to request permission to access this secret." + "message": "Segredo desconhecido, talvez você precise pedir permissão para acessar este segredo." }, "unknownServiceAccount": { - "message": "Unknown machine account, you may need to request permission to access this machine account." + "message": "Conta de máquina desconhecida, talvez você precise pedir permissão para acessar esta conta de máquina." }, "unknownProject": { - "message": "Unknown project, you may need to request permission to access this project." + "message": "Projeto desconhecido, talvez você precise pedir permissão para acessar este projeto." }, "cannotSponsorSelf": { - "message": "Você não pode resgatar a conta ativa. Digite um e-mail diferente." + "message": "Você não pode resgatar para conta ativa. Digite um e-mail diferente." }, "revokeWhenExpired": { "message": "Expira em $DATE$", @@ -7565,7 +7565,7 @@ } }, "awaitingSyncSingular": { - "message": "Token renovado há $DAYS$ dia atrás. Atualize o token de sincronização de cobrança nas configurações da organização auto-hospedada.", + "message": "Token rotacionado há $DAYS$ dia atrás. Atualize o token de sincronização de faturamento nas configurações da organização auto-hospedada.", "placeholders": { "days": { "content": "$1", @@ -7574,7 +7574,7 @@ } }, "awaitingSyncPlural": { - "message": "Token renovado há $DAYS$ dias. Atualize o token de sincronização de cobrança nas configurações da sua organização auto-hospedada.", + "message": "Token rotacionado há $DAYS$ dias atrás. Atualize o token de sincronização de faturamento nas configurações da organização auto-hospedada.", "placeholders": { "days": { "content": "$1", @@ -7583,11 +7583,11 @@ } }, "lastSync": { - "message": "Última Sincronização", + "message": "Última sincronização", "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." + "message": "Faturamentos auto-hospedados sincronizados." }, "billingManagedByProvider": { "message": "Gerenciado por $PROVIDER$", @@ -7599,11 +7599,11 @@ } }, "billingContactProviderForAssistance": { - "message": "Por favor, entre em contato com eles para obter mais ajuda", + "message": "Entre em contato com eles para obter mais ajuda", "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { - "message": "Alias de E-mail Encaminhado" + "message": "Alias de encaminhamento de e-mail" }, "forwardedEmailDesc": { "message": "Gere um alias de e-mail com um serviço externo de encaminhamento." @@ -7617,7 +7617,7 @@ "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { - "message": "Erro $SERVICENAME$ : $ERRORMESSAGE$", + "message": "Erro do $SERVICENAME$: $ERRORMESSAGE$", "description": "Reports an error returned by a forwarding service to the user.", "placeholders": { "servicename": { @@ -7645,7 +7645,7 @@ } }, "forwaderInvalidToken": { - "message": "Token de API $SERVICENAME$ inválido", + "message": "Token de API do $SERVICENAME$ inválido", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -7655,7 +7655,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Token de API $SERVICENAME$ inválido: $ERRORMESSAGE$", + "message": "Token de API da $SERVICENAME$ inválido: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -7693,7 +7693,7 @@ } }, "forwarderNoAccountId": { - "message": "Não foi possível obter a máscara do ID da conta de email $SERVICENAME$.", + "message": "Não é possível obter o ID da conta de e-mail mascarado do $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -7703,7 +7703,7 @@ } }, "forwarderNoDomain": { - "message": "Domínio $SERVICENAME$ inválido.", + "message": "Domínio inválido do $SERVICENAME$.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -7713,7 +7713,7 @@ } }, "forwarderNoUrl": { - "message": "URL $SERVICENAME$ inválida.", + "message": "URL inválido do $SERVICENAME$.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -7723,7 +7723,7 @@ } }, "forwarderUnknownError": { - "message": "Ocorreu um erro $SERVICENAME$ desconhecido.", + "message": "Ocorreu um erro desconhecido do $SERVICENAME$.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -7743,23 +7743,23 @@ } }, "hostname": { - "message": "Hostname", + "message": "Nome do servidor", "description": "Part of a URL." }, "deviceVerification": { - "message": "Verificação do dispositivo" + "message": "Verificação de dispositivo" }, "enableDeviceVerification": { - "message": "Habilitar Verificação do Dispositivo" + "message": "Ativar verificação de dispositivo" }, "deviceVerificationDesc": { - "message": "Quando ativado, são enviados códigos de verificação para o seu endereço de e-mail ao fazer login a partir de um dispositivo não reconhecido" + "message": "Códigos de recuperação serão enviados ao seu endereço de e-mail ao se conectar a partir de um dispositivo desconhecido" }, "updatedDeviceVerification": { - "message": "Verificação do Dispositivo Atualizada" + "message": "Verificação de dispositivo atualizada" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Tem certeza de que deseja habilitar o Verificação do Dispositivo? O código de verificação de e-mail chegarão em: $EMAIL$", + "message": "Tem certeza de que deseja ativar a verificação de dispositivo? Os e-mails dos códigos de verificação chegarão em: $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -7768,41 +7768,41 @@ } }, "premiumSubcriptionRequired": { - "message": "Assinatura Premium necessária" + "message": "Plano Premium necessário" }, "scim": { "message": "Provisionamento de SCIM", "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", + "message": "Provisione automaticamente usuários e grupos com seu provedor de identidade preferido via provisionamento de SCIM", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimIntegrationDescription": { - "message": "Provisionar automaticamente usuários e grupos com seu provedor de identidade preferido via provisionamento de SCIM. Encontre suporte para as integrações", + "message": "Provisione automaticamente usuários e grupos com seu provedor de identidade preferido via provisionamento de SCIM. Procure integrações suportadas", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { - "message": "Habilitar SCIM", + "message": "Ativar SCIM", "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", + "message": "Configure seu provedor de identidade preferido, configurando a URL e a chave da API do SCIM", "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", + "message": "Copie a chave da API do SCIM para a área de transferência", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { - "message": "Rotacionar a chave API SCIM", + "message": "Rotacionar a chave de API do SCIM", "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.", + "message": "Você tem certeza que deseja rotacionar a chave de API do SCIM? A chave atual não funcionará mais para quaisquer integrações existentes.", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { @@ -7813,7 +7813,7 @@ "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", + "message": "Copie a URL do endpoint do SCIM para a área de transferência", "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { @@ -7821,11 +7821,11 @@ "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { - "message": "A chave de API SCIM foi rotacionada com sucesso", + "message": "A chave da API do SCIM foi rotacionada com sucesso", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { - "message": "As configurações de SCIM foram salvas com sucesso", + "message": "Configurações do SCIM salvas", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { @@ -7892,7 +7892,7 @@ } }, "fieldsNeedAttention": { - "message": "$COUNT$ campos(s) acima precisam de sua atenção.", + "message": "$COUNT$ campo(s) acima precisam de sua atenção.", "placeholders": { "count": { "content": "$1", @@ -7904,7 +7904,7 @@ "message": "1 campo precisa de sua atenção." }, "multipleFieldsNeedAttention": { - "message": "Campos $COUNT$ precisam de sua atenção.", + "message": "$COUNT$ campos precisam da sua atenção.", "placeholders": { "count": { "content": "$1", @@ -7919,34 +7919,34 @@ "message": "A autenticação em duas etapas do Duo é necessária para sua conta." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "A autenticação de dois fatores do Duo é necessária para sua conta. Siga os passos abaixo para conseguir entrar." + "message": "A autenticação de duas etapas do Duo é necessária para sua conta. Siga os passos abaixo para conseguir se conectar." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Siga os passos abaixo para finalizar o login." + "message": "Siga os passos abaixo para terminar de se conectar." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Siga os passos abaixo para terminar de se conectar com a sua chave de segurança." }, "launchDuo": { - "message": "Abrir o Duo" + "message": "Abrir Duo" }, "turnOn": { - "message": "Ligar" + "message": "Ativar" }, "on": { - "message": "Ligado" + "message": "Ativado" }, "off": { - "message": "Desligado" + "message": "Desativado" }, "connected": { - "message": "Connected" + "message": "Conectado" }, "members": { "message": "Membros" }, "reporting": { - "message": "Reportando" + "message": "Relatórios" }, "numberOfUsers": { "message": "Número de usuários" @@ -7997,16 +7997,16 @@ "message": "-- Digite para filtrar --" }, "multiSelectLoading": { - "message": "Carrgando Opções..." + "message": "Carrgando opções..." }, "multiSelectNotFound": { "message": "Nenhum item encontrado" }, "multiSelectClearAll": { - "message": "Limpar todos" + "message": "Limpar tudo" }, "toggleCharacterCount": { - "message": "Alternar contagem de caracteres", + "message": "Habilitar contagem de caracteres", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "passwordCharacterCount": { @@ -8041,18 +8041,18 @@ "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Excluir segredo", + "message": "Apagar segredo", "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Excluir segredos", + "message": "Apagar segredos", "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { - "message": "Excluir permanentemente o segredo" + "message": "Apagar segredo permanentemente" }, "hardDeleteSecrets": { - "message": "Excluir permanentemente os segredos" + "message": "Apagar segredos permanentemente" }, "secretProjectAssociationDescription": { "message": "Selecione os projetos aos quais o segredo será associado. Somente os usuários da organização com acesso a estes projetos poderão ver o segredo.", @@ -8063,11 +8063,11 @@ "description": "A label for a type-to-filter input field to choose projects." }, "searchProjects": { - "message": "Pesquisar projetos", + "message": "Buscar nos projetos", "description": "Label for the search bar used to search projects." }, "project": { - "message": "Projecto", + "message": "Projeto", "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { @@ -8079,11 +8079,11 @@ "description": "The action to view details of a project." }, "deleteProject": { - "message": "Excluir projeto", + "message": "Apagar projeto", "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Excluir projetos", + "message": "Apagar projetos", "description": "The action to delete multiple projects from the system." }, "secret": { @@ -8095,7 +8095,7 @@ "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Contas de Serviço", + "message": "Contas de serviço", "description": "The title for the section that deals with service accounts." }, "secrets": { @@ -8103,11 +8103,11 @@ "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Par de Nome/Valor", + "message": "Par de nome/valor", "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secreto editado", + "message": "Segredo editado", "description": "Notification for the successful editing of a secret." }, "secretCreated": { @@ -8123,7 +8123,7 @@ "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "Sem segredos para mostrar", + "message": "Nenhum segredo para mostrar", "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { @@ -8131,10 +8131,10 @@ "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { - "message": "Não há segredos no lixo." + "message": "Não há segredos na lixeira." }, "serviceAccountsNoItemsMessage": { - "message": "Crie uma nova conta de serviço para começar a automatizar o acesso secreto.", + "message": "Crie uma nova conta de serviço para começar a automatizar o acesso aos segredos.", "description": "Message to encourage the user to start creating service accounts." }, "serviceAccountsNoItemsTitle": { @@ -8142,15 +8142,15 @@ "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Pesquisar segredos", + "message": "Buscar nos segredos", "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Excluir contas de serviço", + "message": "Apagar contas de serviço", "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Excluir conta de serviço", + "message": "Apagar conta de serviço", "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { @@ -8158,7 +8158,7 @@ "description": "Action to view the details of a service account." }, "deleteServiceAccountDialogMessage": { - "message": "Excluir conta de serviço $SERVICE_ACCOUNT$ é permanente e irreversível.", + "message": "Apagar a conta de serviço $SERVICE_ACCOUNT$ é permanente e irreversível.", "placeholders": { "service_account": { "content": "$1", @@ -8167,10 +8167,10 @@ } }, "deleteServiceAccountsDialogMessage": { - "message": "A exclusão de projetos é permanente e irreversível." + "message": "O apagamento de contas de serviço é permanente e irreversível." }, "deleteServiceAccountsConfirmMessage": { - "message": "Excluir $COUNT$ contas de serviço", + "message": "Apagar $COUNT$ contas de serviço", "placeholders": { "count": { "content": "$1", @@ -8179,13 +8179,13 @@ } }, "deleteServiceAccountToast": { - "message": "Conta de serviço excluída" + "message": "Conta de serviço apagada" }, "deleteServiceAccountsToast": { - "message": "Contas de serviço excluídas" + "message": "Contas de serviço apagadas" }, "searchServiceAccounts": { - "message": "Pesquisar contas de serviço", + "message": "Buscar nas contas de serviço", "description": "Placeholder text for searching service accounts." }, "editServiceAccount": { @@ -8217,7 +8217,7 @@ "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Excluir segredos pode afetar integrações existentes.", + "message": "Apagar segredos pode afetar integrações existentes.", "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { @@ -8225,13 +8225,13 @@ "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { - "message": "Tem certeza de que deseja excluir permanentemente este segredo?" + "message": "Tem certeza de que deseja apagar permanentemente este segredo?" }, "hardDeleteSecretsConfirmation": { - "message": "Tem certeza que deseja excluir estes segredos permanentemente?" + "message": "Tem certeza que deseja apagar estes segredos permanentemente?" }, "hardDeletesSuccessToast": { - "message": "Segredos excluídos permanentemente" + "message": "Segredos apagados permanentemente" }, "smAccess": { "message": "Acesso", @@ -8254,7 +8254,7 @@ "description": "Notifies that a service account has been updated" }, "typeOrSelectProjects": { - "message": "Type or select projects", + "message": "Digite ou selecione projetos", "description": "Instructions for selecting projects for a service account" }, "newSaTypeToFilter": { @@ -8262,15 +8262,15 @@ "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projetos excluídos", + "message": "Projetos apagados", "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "O projeto e todos os segredos associados foram excluídos", + "message": "Projeto apagado", "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { - "message": "Excluir o projeto $PROJECT$ é permanente e irreversível.", + "message": "Apagar o projeto $PROJECT$ é permanente e irreversível.", "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { @@ -8290,7 +8290,7 @@ } }, "deleteProjectConfirmMessage": { - "message": "Excluir $PROJECT$", + "message": "Apagar $PROJECT$", "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { @@ -8300,7 +8300,7 @@ } }, "deleteProjectsConfirmMessage": { - "message": "Excluir $COUNT$ Projetos", + "message": "Apagar $COUNT$ projetos", "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { @@ -8310,7 +8310,7 @@ } }, "deleteProjectsDialogMessage": { - "message": "A exclusão de projetos é permanente e irreversível.", + "message": "Apagar projetos é permanente e irreversível.", "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { @@ -8326,7 +8326,7 @@ "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "Os seguintes projetos não puderam ser excluídos:", + "message": "Os seguintes projetos não puderam ser apagados:", "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { @@ -8334,14 +8334,14 @@ "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { - "message": "Segredo excluído permanentemente" + "message": "Segredo apagado permanentemente" }, "accessTokens": { "message": "Tokens de acesso", "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Create access token", + "message": "Criar token de acesso", "description": "Button label for creating a new access token." }, "expires": { @@ -8353,7 +8353,7 @@ "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Nenhum token de acesso para exibir", + "message": "Nenhum token de acesso para mostrar", "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { @@ -8381,7 +8381,7 @@ "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Data de validade requerida", + "message": "Data de validade necessária", "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { @@ -8410,10 +8410,10 @@ "message": "Submenu" }, "from": { - "message": "De" + "message": "Desde" }, "to": { - "message": "Para" + "message": "Até" }, "member": { "message": "Membro" @@ -8422,7 +8422,7 @@ "message": "Atualizar" }, "plusNMore": { - "message": "+ $QUANTITY$ mais", + "message": "+ mais $QUANTITY$", "placeholders": { "quantity": { "content": "$1", @@ -8434,34 +8434,34 @@ "message": "Informações do grupo" }, "editGroupMembersDesc": { - "message": "Conceder acesso às coleções atribuídas ao grupo." + "message": "Conceda acesso dos conjuntos atribuídos do grupo aos membros." }, "editGroupCollectionsDesc": { - "message": "Conceder acesso às coleções adicionando-as a este grupo." + "message": "Conceda acesso aos conjuntos adicionando-os a este grupo." }, "restrictedCollectionAssignmentDesc": { - "message": "Você só pode atribuir coleções que você gerencia." + "message": "Você só pode atribuir conjuntos que você gerencia." }, "selectMembers": { "message": "Selecionar membros" }, "selectCollections": { - "message": "Selecionar coleções" + "message": "Selecionar conjuntos" }, "role": { - "message": "Função" + "message": "Cargo" }, "removeMember": { "message": "Remover membro" }, "collection": { - "message": "Coleção" + "message": "Conjunto" }, "noCollection": { - "message": "Sem coleções" + "message": "Sem conjunto" }, "noCollectionsAdded": { - "message": "Nenhuma coleção adicionada" + "message": "Nenhum conjunto adicionado" }, "noMembersAdded": { "message": "Nenhum membro adicionado" @@ -8473,7 +8473,7 @@ "message": "Grupo" }, "domainVerification": { - "message": "Verificação de Domínio" + "message": "Verificação de domínio" }, "newDomain": { "message": "Novo domínio" @@ -8482,13 +8482,13 @@ "message": "Sem domínio" }, "noDomainsSubText": { - "message": "Conectar um domínio permite que os membros pulem o campo identificador SSO durante o Login com SSO." + "message": "Conectar um domínio permite que os membros pulem o campo do identificador de SSO durante a autenticação única." }, "copyDnsTxtRecord": { - "message": "Copiar registro do DNS TXT" + "message": "Copiar registro TXT do DNS" }, "dnsTxtRecord": { - "message": "Registro DNS TXT" + "message": "Registro TXT do DNS" }, "dnsTxtRecordInputHint": { "message": "Copie e cole o registro TXT no seu provedor de DNS." @@ -8521,10 +8521,10 @@ "message": "Nome" }, "domainStatusTh": { - "message": "Status" + "message": "Estado" }, "lastChecked": { - "message": "Última verificação:" + "message": "Última verificação" }, "editDomain": { "message": "Editar domínio" @@ -8551,25 +8551,25 @@ } }, "verificationRequiredForActionSetPinToContinue": { - "message": "Verificação necessária para esta ação. Defina um PIN para continuar." + "message": "Verificação necessária para esta ação. Configure um PIN para continuar." }, "setPin": { - "message": "Definir PIN" + "message": "Configurar PIN" }, "verifyWithBiometrics": { - "message": "Desbloquear com a biometria" + "message": "Verificar com biometria" }, "awaitingConfirmation": { "message": "Aguardando confirmação" }, "couldNotCompleteBiometrics": { - "message": "Não foi possível completar a biometria." + "message": "Não foi possível concluir a biometria." }, "needADifferentMethod": { "message": "Precisa de um método diferente?" }, "useMasterPassword": { - "message": "Usar a senha principal" + "message": "Usar senha principal" }, "usePin": { "message": "Usar PIN" @@ -8578,7 +8578,7 @@ "message": "Usar biometria" }, "enterVerificationCodeSentToEmail": { - "message": "Digite o código de verificação que foi enviado para o seu e-mail." + "message": "Digite o código de verificação enviado para o seu e-mail." }, "resendCode": { "message": "Reenviar código" @@ -8590,40 +8590,40 @@ "message": "Grupo/Membro" }, "selectGroupsAndMembers": { - "message": "Selecione grupos e membros" + "message": "Selecionar grupos e membros" }, "selectGroups": { - "message": "Selecione grupos" + "message": "Selecionar grupos" }, "userPermissionOverrideHelperDesc": { - "message": "Permissões definidas para um membro substituirão as permissões definidas pelo grupo desse membro." + "message": "As permissões configuradas para um membro substituirão as permissões configuradas pelo grupo desse membro." }, "noMembersOrGroupsAdded": { "message": "Nenhum membro ou grupo adicionado" }, "deleted": { - "message": "Excluído" + "message": "Apagado" }, "memberStatusFilter": { - "message": "Filtro de status de membros" + "message": "Filtro do estado de membros" }, "inviteMember": { "message": "Convidar membro" }, "addSponsorship": { - "message": "Add sponsorship" + "message": "Adicionar financiamento" }, "needsConfirmation": { "message": "Precisa de confirmação" }, "memberRole": { - "message": "Função de membro" + "message": "Cargo do membro" }, "moreFromBitwarden": { "message": "Mais do Bitwarden" }, "switchProducts": { - "message": "Trocar Produtos" + "message": "Trocar de produto" }, "freeOrgInvLimitReachedManageBilling": { "message": "Organizações gratuitas podem ter até $SEATCOUNT$ membros. Faça upgrade para um plano pago para convidar mais membros.", @@ -8644,7 +8644,7 @@ } }, "teamsStarterPlanInvLimitReachedManageBilling": { - "message": "Planos de Times Starter podem ter até $SEATCOUNT$ membros. Atualize para o seu plano para convidar mais membros.", + "message": "Planos do Equipes Iniciantes podem ter até $SEATCOUNT$ membros. Faça upgrade do seu plano para convidar mais membros.", "placeholders": { "seatcount": { "content": "$1", @@ -8653,7 +8653,7 @@ } }, "teamsStarterPlanInvLimitReachedNoManageBilling": { - "message": "Planos para Equipes Iniciantes podem ter até $SEATCOUNT$ membros. Entre em contato com o proprietário da organização para melhorar o seu plano e convidar mais membros.", + "message": "Planos do Equipes Iniciantes podem ter até $SEATCOUNT$ membros. Entre em contato com o proprietário da organização para fazer upgrade do seu plano e convidar mais membros.", "placeholders": { "seatcount": { "content": "$1", @@ -8662,7 +8662,7 @@ } }, "freeOrgMaxCollectionReachedManageBilling": { - "message": "Organizações gratuitas podem ter até $COLLECTIONCOUNT$ coleções. Faça o upgrade para um plano pago para adicionar mais coleções.", + "message": "Organizações gratuitas podem ter até $COLLECTIONCOUNT$ conjuntos. Faça upgrade para um plano pago para adicionar mais conjuntos.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -8671,7 +8671,7 @@ } }, "freeOrgMaxCollectionReachedNoManageBilling": { - "message": "Organizações gratuitas podem ter até $COLLECTIONCOUNT$ membros. Entre em contato com o proprietário da sua organização para fazer upgrade.", + "message": "Organizações gratuitas podem ter até $COLLECTIONCOUNT$ conjuntos. Entre em contato com o proprietário da sua organização para fazer upgrade.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -8686,10 +8686,10 @@ "message": "Exportar dados" }, "exportingOrganizationSecretDataTitle": { - "message": "Exportando dados secretos da organização" + "message": "Exportando dados de segredos da organização" }, "exportingOrganizationSecretDataDescription": { - "message": "Apenas o cofre da organização associado com $ORGANIZATION$ será exportado. Itens do cofre pessoal e itens de outras organizações não serão incluídos.", + "message": "Apenas os dados do Gerenciador de Segredos associados com $ORGANIZATION$ serão exportados. Itens em outros produtos ou de outras organizações não serão incluídos.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -8698,28 +8698,28 @@ } }, "fileUpload": { - "message": "Enviar de arquivo" + "message": "Envio de arquivo" }, "upload": { - "message": "Fazer upload" + "message": "Enviar" }, "acceptedFormats": { - "message": "Formatos Aceitos:" + "message": "Formatos aceitos:" }, "copyPasteImportContents": { - "message": "Copiar e colar conteúdo para importação:" + "message": "Copie e cole o conteúdo de importação:" }, "or": { "message": "ou" }, "unlockWithBiometrics": { - "message": "Desbloquear com a biometria" + "message": "Desbloquear com biometria" }, "unlockWithPin": { - "message": "Desbloquear com o PIN" + "message": "Desbloquear com PIN" }, "unlockWithMasterPassword": { - "message": "Desbloquear com a senha principal" + "message": "Desbloquear com senha principal" }, "licenseAndBillingManagement": { "message": "Gerenciamento da licença e faturamento" @@ -8728,10 +8728,10 @@ "message": "Sincronização automática" }, "manualUpload": { - "message": "Upload manual" + "message": "Envio manual" }, "manualBillingTokenUploadDesc": { - "message": "Se você não deseja optar pela sincronização de faturamento, carregue sua licença manualmente aqui. Isto não desbloqueará automaticamente os patrocinadores das Famílias." + "message": "Se você não deseja optar pela sincronização de faturamento, envie sua licença manualmente aqui. Isto não desbloqueará automaticamente os financiamentos do Famílias." }, "syncLicense": { "message": "Sincronizar licença" @@ -8746,13 +8746,13 @@ "message": "Última sincronização de licença" }, "billingSyncHelp": { - "message": "Ajuda da Sincronização de faturamento" + "message": "Ajuda com sincronização de faturamento" }, "licensePaidFeaturesHelp": { - "message": "Ajuda dos recursos de licença paga" + "message": "Ajuda com recursos de licença paga" }, "selfHostGracePeriodHelp": { - "message": "Após a expiração da assinatura, você tem 60 dias para aplicar um arquivo de licença atualizado à sua organização. Fim do período de carência $GRACE_PERIOD_END_DATE$.", + "message": "Após a expiração da assinatura, você tem 60 dias para aplicar um arquivo de licença atualizado à sua organização. O fim do período de tolerância é em $GRACE_PERIOD_END_DATE$.", "placeholders": { "GRACE_PERIOD_END_DATE": { "content": "$1", @@ -8764,13 +8764,13 @@ "message": "Enviar licença" }, "projectPeopleDescription": { - "message": "Conceder acesso a este projeto ou grupos de pessoas." + "message": "Conceda acesso ao projeto para grupos ou pessoas." }, "projectPeopleSelectHint": { "message": "Digite ou selecione pessoas ou grupos" }, "projectServiceAccountsDescription": { - "message": "Conceder acesso a contas de serviço a este projeto." + "message": "Conceda acesso a contas de serviço a este projeto." }, "projectServiceAccountsSelectHint": { "message": "Digite ou selecione contas de serviço" @@ -8782,13 +8782,13 @@ "message": "Adicione contas de serviço para conceder acesso" }, "serviceAccountPeopleDescription": { - "message": "Conceder acesso a esta conta de serviço a grupos ou pessoas." + "message": "Conceda acesso a esta conta de serviço a grupos ou pessoas." }, "serviceAccountProjectsDescription": { - "message": "Atribuir projetos para esta conta de serviço. " + "message": "Atribua projetos a esta conta de serviço. " }, "serviceAccountEmptyProjectAccesspolicies": { - "message": "Adicionar projetos para conceder acesso" + "message": "Adicione projetos para conceder acesso" }, "canReadWrite": { "message": "Pode ler e gravar" @@ -8797,22 +8797,22 @@ "message": "Grupo/Usuário" }, "kdfSettingsChangeLogoutWarning": { - "message": "O processo desconectará você de todas as sessões ativas. Você precisará iniciar a sessão novamente e concluir o login em duas etapas, se houver. Recomendamos exportar seu cofre antes de alterar suas configurações de criptografia para evitar perda de dados." + "message": "O processo desconectará você de todas as sessões ativas. Você precisará se conectar novamente, e fazer a autenticação em duas etapas, se configurada. Recomendamos exportar seu cofre antes de alterar suas configurações de criptografia para evitar perda de dados." }, "secretsManager": { "message": "Gerenciador de Segredos" }, "secretsManagerAccessDescription": { - "message": "Ative o acesso do usuário ao Gerenciador Secretos." + "message": "Ative o acesso de usuários ao Gerenciador de Segredos." }, "userAccessSecretsManagerGA": { - "message": "Este usuário pode acessar o gerente secreto" + "message": "Este usuário pode acessar o Gerenciador de Segredos" }, "important": { "message": "Importante:" }, "viewAll": { - "message": "Visualizar tudo" + "message": "Ver tudo" }, "showingPortionOfTotal": { "message": "Mostrando $PORTION$ de $TOTAL$", @@ -8837,7 +8837,7 @@ "message": "Ocorreu um erro ao tentar ler o arquivo de importação" }, "accessedSecretWithId": { - "message": "Accessed a secret with identifier: $SECRET_ID$", + "message": "Acessou um segredo com o identificador: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8846,7 +8846,7 @@ } }, "accessedSecret": { - "message": "$SECRET_ID$ secreto acessado.", + "message": "Acessou o segredo $SECRET_ID$.", "placeholders": { "secret_id": { "content": "$1", @@ -8855,7 +8855,7 @@ } }, "editedSecretWithId": { - "message": "Edited a secret with identifier: $SECRET_ID$", + "message": "Editou um segredo com o identificador: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8864,7 +8864,7 @@ } }, "deletedSecretWithId": { - "message": "Deleted a secret with identifier: $SECRET_ID$", + "message": "Apagou um segredo com o identificador: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8873,7 +8873,7 @@ } }, "permanentlyDeletedSecretWithId": { - "message": "Permanently deleted a secret with identifier: $SECRET_ID$", + "message": "Apagou permanentemente um segredo com o identificador: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8882,7 +8882,7 @@ } }, "restoredSecretWithId": { - "message": "Restored a secret with identifier: $SECRET_ID$", + "message": "Restaurou o segredo com o identificador: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8891,7 +8891,7 @@ } }, "createdSecretWithId": { - "message": "Created a new secret with identifier: $SECRET_ID$", + "message": "Criou um segredo com o identificador: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8900,7 +8900,7 @@ } }, "accessedProjectWithIdentifier": { - "message": "Accessed a project with identifier: $PROJECT_ID$.", + "message": "Acessou um projeto com o identificador: $PROJECT_ID$.", "placeholders": { "project_id": { "content": "$1", @@ -8909,7 +8909,7 @@ } }, "nameUnavailableProjectDeleted": { - "message": "Deleted project Id: $PROJECT_ID$", + "message": "Apagou o projeto com ID: $PROJECT_ID$", "placeholders": { "project_id": { "content": "$1", @@ -8918,7 +8918,7 @@ } }, "nameUnavailableSecretDeleted": { - "message": "Deleted secret Id: $SECRET_ID$", + "message": "Apagou segredo com o ID: $SECRET_ID$", "placeholders": { "secret_id": { "content": "$1", @@ -8927,7 +8927,7 @@ } }, "nameUnavailableServiceAccountDeleted": { - "message": "Deleted machine account Id: $SERVICE_ACCOUNT_ID$", + "message": "Apagou conta de máquina com o ID: $SERVICE_ACCOUNT_ID$", "placeholders": { "service_account_id": { "content": "$1", @@ -8936,7 +8936,7 @@ } }, "editedProjectWithId": { - "message": "Edited a project with identifier: $PROJECT_ID$", + "message": "Editou um projeto com o identificador: $PROJECT_ID$", "placeholders": { "project_id": { "content": "$1", @@ -8945,7 +8945,7 @@ } }, "addedUserToServiceAccountWithId": { - "message": "Added user: $USER_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Adicionou o usuário: $USER_ID$ a conta de máquina com identificador: $SERVICE_ACCOUNT_ID$", "placeholders": { "user_id": { "content": "$1", @@ -8958,7 +8958,7 @@ } }, "removedUserToServiceAccountWithId": { - "message": "Removed user: $USER_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Removeu o usuário: $USER_ID$ da conta de máquina com identificador: $SERVICE_ACCOUNT_ID$", "placeholders": { "user_id": { "content": "$1", @@ -8971,7 +8971,7 @@ } }, "removedGroupFromServiceAccountWithId": { - "message": "Removed group: $GROUP_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Removeu o grupo: $GROUP_ID$ da conta de máquina com identificador: $SERVICE_ACCOUNT_ID$", "placeholders": { "group_id": { "content": "$1", @@ -8984,7 +8984,7 @@ } }, "serviceAccountCreatedWithId": { - "message": "Created machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Criou a conta de máquina com identificador: $SERVICE_ACCOUNT_ID$", "placeholders": { "service_account_id": { "content": "$1", @@ -8993,7 +8993,7 @@ } }, "addedGroupToServiceAccountId": { - "message": "Added group: $GROUP_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Adicionou o grupo: $GROUP_ID$ a conta de máquina com identificador: $SERVICE_ACCOUNT_ID$", "placeholders": { "group_id": { "content": "$1", @@ -9006,7 +9006,7 @@ } }, "serviceAccountDeletedWithId": { - "message": "Deleted machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Apagou a conta de máquina com identificador: $SERVICE_ACCOUNT_ID$", "placeholders": { "service_account_id": { "content": "$1", @@ -9015,7 +9015,7 @@ } }, "deletedProjectWithId": { - "message": "Deleted a project with identifier: $PROJECT_ID$", + "message": "Apagou um projeto com o identificador: $PROJECT_ID$", "placeholders": { "project_id": { "content": "$1", @@ -9024,7 +9024,7 @@ } }, "createdProjectWithId": { - "message": "Created a new project with identifier: $PROJECT_ID$", + "message": "Criou um projeto com o identificador: $PROJECT_ID$", "placeholders": { "project_id": { "content": "$1", @@ -9037,16 +9037,16 @@ "description": "Software Development Kit" }, "createAnAccount": { - "message": "Criar uma conta" + "message": "Crie uma conta" }, "createSecret": { "message": "Crie um segredo" }, "createProject": { - "message": "Criar um projeto" + "message": "Crie um projeto" }, "createServiceAccount": { - "message": "Criar conta de serviço" + "message": "Crie uma conta de serviço" }, "downloadThe": { "message": "Baixe o", @@ -9062,7 +9062,7 @@ "message": "Vamos começar" }, "complete": { - "message": "$COMPLETED$/$TOTAL$ Completos", + "message": "$COMPLETED$ concluídos dos $TOTAL$", "placeholders": { "COMPLETED": { "content": "$1", @@ -9102,13 +9102,13 @@ "message": "Remover pessoas de uma conta de serviço não remove os tokens de acesso que criaram. Para a melhor prática de segurança, é recomendável revogar os tokens de acesso criados por pessoas removidas de uma conta de serviço." }, "smAccessRemovalWarningProjectTitle": { - "message": "Remover acesso para esse projeto" + "message": "Remova o acesso a esse projeto" }, "smAccessRemovalWarningProjectMessage": { "message": "Esta ação removerá seu acesso ao projeto." }, "smAccessRemovalWarningSaTitle": { - "message": "Remover acesso a essa conta de serviço" + "message": "Remova o acesso a essa conta de serviço" }, "smAccessRemovalWarningSaMessage": { "message": "Essa ação removerá seu acesso à conta de serviço." @@ -9117,16 +9117,16 @@ "message": "Remover acesso" }, "checkForBreaches": { - "message": "Verificar se essa senha aparece em vazamento de dados conhecidos" + "message": "Conferir vazamentos de dados conhecidos por esta senha" }, "exposedMasterPassword": { "message": "Senha principal exposta" }, "exposedMasterPasswordDesc": { - "message": "A senha foi encontrada em violação de dados. Use uma senha única para proteger sua conta. Tem certeza de que deseja usar uma senha exposta?" + "message": "Senha encontrada em um vazamento de dados. Use uma senha única para proteger sua conta. Tem certeza que quer usar uma senha exposta?" }, "weakAndExposedMasterPassword": { - "message": "Senha Mestra Fraca e Exposta" + "message": "Senha principal fraca e comprometida" }, "weakAndBreachedMasterPasswordDesc": { "message": "Senha fraca identificada e encontrada em um vazamento de dados. Use uma senha forte e única para proteger a sua conta. Tem certeza de que deseja usar essa senha?" @@ -9157,31 +9157,31 @@ "message": "Descartar" }, "notAvailableForFreeOrganization": { - "message": "Este recurso não está disponível para organizações gratuitas. Entre em contato com o seu proprietário para atualizar." + "message": "Este recurso não está disponível para organizações gratuitas. Entre em contato com o seu proprietário para fazer upgrade." }, "smProjectSecretsNoItemsNoAccess": { "message": "Entre em contato com o administrador da sua organização para gerenciar segredos para este projeto.", "description": "The message shown to the user under a project's secrets tab when the user only has read access to the project." }, "enforceOnLoginDesc": { - "message": "Exigir que os membros existentes alterem suas senhas" + "message": "Exija que membros existentes alterem suas senhas" }, "smProjectDeleteAccessRestricted": { - "message": "Você não tem permissão para excluir este projeto", + "message": "Você não tem permissão para apagar este projeto", "description": "The individual description shown to the user when the user doesn't have access to delete a project." }, "smProjectsDeleteBulkConfirmation": { - "message": "Os projetos a seguir não podem ser excluídos. Deseja continuar?", + "message": "Os projetos a seguir não podem ser apagados. Deseja continuar?", "description": "The message shown to the user when bulk deleting projects and the user doesn't have access to some projects." }, "updateKdfSettings": { - "message": "Atualizar as definições do KDF" + "message": "Atualizar configurações da KDF" }, "loginInitiated": { "message": "Autenticação iniciada" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Lembre-se deste dispositivo para permanecer conectado" + "message": "Lembrar deste dispositivo para tornar futuras autenticações simples" }, "deviceApprovalRequired": { "message": "Aprovação do dispositivo necessária. Selecione uma opção de aprovação abaixo:" @@ -9205,35 +9205,35 @@ "message": "Solicitar aprovação do administrador" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "Não é possível concluir a autenticação" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "Você precisa se conectar com um dispositivo confiado ou solicitar ao administrador que lhe atribua uma senha." }, "trustedDeviceEncryption": { - "message": "Criptografia de dispositivo confiável" + "message": "Criptografia de dispositivo confiado" }, "trustedDevices": { - "message": "Dispositivos confiáveis" + "message": "Dispositivos confiados" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Os membros não precisarão de uma senha principal ao fazer login com SSO. A senha principal é substituída por uma chave de criptografia armazenada no dispositivo, fazendo com que esse dispositivo seja confiável. O primeiro dispositivo que um membro cria sua conta e os logins serão confiáveis. Novos dispositivos precisarão ser aprovados por um dispositivo confiável existente ou por um administrador. O", + "message": "Os membros não precisarão de uma senha principal ao se conectar com SSO. A senha principal é substituída por uma chave de criptografia armazenada no dispositivo, fazendo com que esse dispositivo seja confiado. O primeiro dispositivo que um membro cria sua conta e se conecta serão confiados. Novos dispositivos precisarão ser aprovados por um dispositivo confiado existente ou por um administrador. A", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "organização única", + "message": "política de", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "política,", + "message": "organização única,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "Necessário SSO", + "message": "política de", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "política, e", + "message": "SSO obrigatória, e a política de", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { @@ -9241,19 +9241,19 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "política será ativada quando esta opção for utilizada.", + "message": "ativarão quando esta opção for utilizada.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "As permissões da sua organização foram atualizadas, exigindo que você defina uma senha principal.", + "message": "As permissões da sua organização foram atualizadas, exigindo que você configure uma senha principal.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "Sua organização requer que você defina uma senha principal.", + "message": "Sua organização requer que você configure uma senha principal.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "fora do $TOTAL$", + "message": "dos $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -9262,7 +9262,7 @@ } }, "notFound": { - "message": "$RESOURCE$ não encontrado", + "message": "$RESOURCE$ não encontrado(a)", "placeholders": { "resource": { "content": "$1", @@ -9288,7 +9288,7 @@ "message": "Ativar acesso" }, "bulkEnableSecretsManagerDescription": { - "message": "Conceda aos seguintes membros acesso ao Gerenciador de Segredos. A função concedida no Gerenciador de Senhas será aplicada ao Gerenciador de Segredos.", + "message": "Conceda aos seguintes membros acesso ao Gerenciador de Segredos. O cargo concedido no Gerenciador de Senhas será aplicado ao Gerenciador de Segredos.", "description": "This description is shown to an admin when they are attempting to add more users to Secrets Manager." }, "activateSecretsManager": { @@ -9299,10 +9299,10 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their organization's public key with another user, for the purposes of sharing." }, "deviceApprovals": { - "message": "Aprovações do dispositivo" + "message": "Aprovações de dispositivo" }, "deviceApprovalsDesc": { - "message": "Aprovar as solicitações de login abaixo para permitir que o membro solicitante termine o login. Solicitações não aprovadas expiram após 1 semana. Verifique as informações do membro antes de aprovar." + "message": "Aprove as solicitações de acesso abaixo para permitir que o membro solicitante se conecte. Solicitações não aprovadas expiram após 1 semana. Verifique as informações do membro antes de aprovar." }, "deviceInfo": { "message": "Informações do dispositivo" @@ -9314,7 +9314,7 @@ "message": "Negar todas as solicitações" }, "denyRequest": { - "message": "Negar pedido" + "message": "Negar solicitação" }, "approveRequest": { "message": "Aprovar solicitação" @@ -9332,25 +9332,25 @@ "message": "Tem certeza de que deseja remover este dispositivo?" }, "noDeviceRequests": { - "message": "Nenhum pedido de dispositivo" + "message": "Nenhuma solicitação de dispositivo" }, "noDeviceRequestsDesc": { - "message": "Os pedidos de aprovação de dispositivo de membro aparecerão aqui" + "message": "As solicitações de aprovação de dispositivo dos membros aparecerão aqui" }, "loginRequestDenied": { - "message": "Solicitação de login negada" + "message": "Solicitação de acesso negada" }, "allLoginRequestsDenied": { - "message": "Todas as solicitações de login negadas" + "message": "Todas as solicitações de autenticação foram negadas" }, "loginRequestApproved": { - "message": "Solicitação de login aprovada" + "message": "Solicitação de acesso aprovada" }, "removeOrgUserNoMasterPasswordTitle": { "message": "A conta não tem uma senha principal" }, "removeOrgUserNoMasterPasswordDesc": { - "message": "Remover $USER$ sem definir uma senha principal pode restringir o acesso deles à conta toda. Tem certeza de que deseja continuar?", + "message": "Remover $USER$ sem configurar uma senha principal para eles pode restringir o acesso à conta toda. Tem certeza de que deseja continuar?", "placeholders": { "user": { "content": "$1", @@ -9359,10 +9359,10 @@ } }, "noMasterPassword": { - "message": "Nenhuma senha principal" + "message": "Sem senha principal" }, "removeMembersWithoutMasterPasswordWarning": { - "message": "Remover membros que não têm senhas principais sem definir uma para eles pode restringir o acesso à sua conta completa." + "message": "Remover membros que não têm senhas principais sem configurar uma para eles pode restringir o acesso à conta toda." }, "approvedAuthRequest": { "message": "Dispositivo aprovado para $ID$.", @@ -9386,10 +9386,10 @@ "message": "Aprovação do dispositivo solicitada." }, "tdeOffboardingPasswordSet": { - "message": "Usuário definiu uma senha principal durante o offboard TDE." + "message": "Usuário configurou uma senha principal durante o offboarding da criptografia de dispositivo confiado." }, "startYour7DayFreeTrialOfBitwardenFor": { - "message": "Comece o seu período de teste gratuito de 7 dias do Bitwarden para $ORG$", + "message": "Comece o seu teste grátis de 7 dias do Bitwarden para $ORG$", "placeholders": { "org": { "content": "$1", @@ -9398,7 +9398,7 @@ } }, "startYour7DayFreeTrialOfBitwardenSecretsManagerFor": { - "message": "Inicie o seu período de teste gratuito de 7 dias do Bitwarden Secrets Manager para $ORG$", + "message": "Comece o seu teste grátis de 7 dias do Bitwarden Gerenciador de Segredos para $ORG$", "placeholders": { "org": { "content": "$1", @@ -9410,10 +9410,10 @@ "message": "Avançar" }, "ssoLoginIsRequired": { - "message": "Login SSO é obrigatório" + "message": "Autenticação com SSO é necessário" }, "selectedRegionFlag": { - "message": "Sinalização de região selecionada" + "message": "Bandeira da região selecionada" }, "accountSuccessfullyCreated": { "message": "Conta criada com sucesso!" @@ -9422,10 +9422,10 @@ "message": "Aprovação do administrador necessária" }, "adminApprovalRequestSentToAdmins": { - "message": "Seu pedido foi enviado para seu administrador." + "message": "Sua solicitação foi enviada para seu administrador." }, "troubleLoggingIn": { - "message": "Problemas em efetuar login?" + "message": "Problemas para acessar?" }, "loginApproved": { "message": "Autenticação aprovada" @@ -9434,16 +9434,16 @@ "message": "E-mail do usuário ausente" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Endereço eletrônico de usuário ativo não encontrado. Você será desconectado" + "message": "E-mail do usuário ativo não encontrado. Desconectando você." }, "deviceTrusted": { - "message": "Dispositivo confiável" + "message": "Dispositivo confiado" }, "inviteUsers": { "message": "Convidar usuários" }, "secretsManagerForPlan": { - "message": "Gerenciador de segredos para $PLAN$", + "message": "Gerenciador de Segredos para $PLAN$", "placeholders": { "plan": { "content": "$1", @@ -9455,7 +9455,7 @@ "message": "Para equipes de engenharia e DevOps gerenciar segredos durante todo o ciclo de vida do desenvolvimento de software." }, "free2PersonOrganization": { - "message": "Organizações gratuitas com 2 pessoas" + "message": "Organizações grátis de 2 pessoas" }, "unlimitedSecrets": { "message": "Segredos ilimitados" @@ -9491,10 +9491,10 @@ } }, "subscribeToSecretsManager": { - "message": "Assine o Gerenciador de Segredos" + "message": "Assinar o Gerenciador de Segredos" }, "addSecretsManagerUpgradeDesc": { - "message": "Adicione o Gerenciador de Segredos ao seu plano atualizado para manter o acesso a todos os segredos criados com seu plano anterior." + "message": "Adicione o Gerenciador de Segredos ao seu plano com upgrade para manter o acesso a todos os segredos criados com seu plano anterior." }, "additionalServiceAccounts": { "message": "Contas de serviço adicionais" @@ -9518,94 +9518,94 @@ } }, "collectionManagement": { - "message": "Gerenciamento da coleção" + "message": "Gerenciamento de conjuntos" }, "collectionManagementDescription": { - "message": "Configure the collection behavior for the organization" + "message": "Configure o comportamento dos conjuntos da organização" }, "allowAdminAccessToAllCollectionItemsDescription": { - "message": "Allow owners and admins to manage all collections and items from the Admin Console" + "message": "Permita que proprietários e administradores gerenciem todos os conjuntos e itens pelo painel de administração" }, "restrictCollectionCreationDescription": { - "message": "Restrict collection creation to owners and admins" + "message": "Restrinja a criação de conjuntos a proprietários e administradores" }, "restrictCollectionDeletionDescription": { - "message": "Restrict collection deletion to owners and admins" + "message": "Restrinja o apagamento de conjuntos a proprietários e administradores" }, "restrictItemDeletionDescriptionStart": { - "message": "Restrict item deletion to members with the ", + "message": "Restrinja o apagamento de itens a membros com a permissão de ", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "restrictItemDeletionDescriptionEnd": { - "message": " permission", + "message": "‎", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "updatedCollectionManagement": { - "message": "Configuração da gestão de coleção atualizada" + "message": "Configuração de gerenciamento de conjuntos atualizada" }, "passwordManagerPlanPrice": { - "message": "Preço do plano do Gerenciador de Senha" + "message": "Preço do plano do Gerenciador de Senhas" }, "secretsManagerPlanPrice": { "message": "Preço do plano do Gerenciador de Segredos" }, "passwordManager": { - "message": "Gerenciador de senha" + "message": "Gerenciador de Senhas" }, "freeOrganization": { - "message": "Organização gratuita" + "message": "Organização Grátis" }, "limitServiceAccounts": { "message": "Limitar contas de serviço (opcional)" }, "limitServiceAccountsDesc": { - "message": "Defina um limite para suas contas de máquina. Quando este limite for atingido, você não poderá criar novas contas de máquina." + "message": "Configure um limite para suas contas de serviço. Quando este limite for atingido, você não poderá criar novas contas de serviço." }, "serviceAccountLimit": { "message": "Limite de contas de serviço (opcional)" }, "maxServiceAccountCost": { - "message": "Custo máximo da conta de serviço potencial" + "message": "Custo potencial máximo de contas de serviço" }, "loggedInExclamation": { "message": "Conectado!" }, "assignCollectionAccess": { - "message": "Atribuir acesso à coleção" + "message": "Atribuir acesso a conjuntos" }, "editedCollections": { - "message": "Coleções editadas" + "message": "Conjuntos editados" }, "baseUrl": { - "message": "URL do Servidor" + "message": "URL do servidor" }, "selfHostBaseUrl": { - "message": "URL do servidor auto-host", + "message": "URL do servidor auto-hospedado", "description": "Label for field requesting a self-hosted integration service URL" }, "alreadyHaveAccount": { "message": "Já tem uma conta?" }, "toggleSideNavigation": { - "message": "Ativar/desativar navegação lateral" + "message": "Habilitar navegação lateral" }, "skipToContent": { - "message": "Pular para o conteúdo" + "message": "Ir para o conteúdo" }, "managePermissionRequired": { - "message": "Pelo menos um membro ou grupo deve ter poder gerenciar a permissão." + "message": "Pelo menos um membro ou grupo deve ter permissões de gerenciamento." }, "typePasskey": { "message": "Chave de acesso" }, "passkeyNotCopied": { - "message": "A senha não será copiada" + "message": "A chave de acesso não será copiada" }, "passkeyNotCopiedAlert": { - "message": "A senha não será copiada para o item clonado. Deseja continuar clonando este item?" + "message": "A chave de acesso não será copiada para o item clonado. Deseja continuar clonando este item?" }, "modifiedCollectionManagement": { - "message": "Definição de gerenciamento da coleção $ID$ modificada.", + "message": "Modificou a configuração de gerenciamento de conjuntos $ID$.", "placeholders": { "id": { "content": "$1", @@ -9614,7 +9614,7 @@ } }, "limitCollectionCreationEnabled": { - "message": "Turned on Restrict collection creation setting $ID$.", + "message": "Ativou a configuração de restrição de criação de conjuntos $ID$.", "placeholders": { "id": { "content": "$1", @@ -9623,7 +9623,7 @@ } }, "limitCollectionCreationDisabled": { - "message": "Turned off Restrict collection creation setting $ID$.", + "message": "Desativou a configuração de restrição de criação de conjuntos $ID$.", "placeholders": { "id": { "content": "$1", @@ -9632,7 +9632,7 @@ } }, "limitCollectionDeletionEnabled": { - "message": "Turned on Restrict collection deletion setting $ID$.", + "message": "Ativou a configuração de restrição de apagamento de conjuntos $ID$.", "placeholders": { "id": { "content": "$1", @@ -9641,7 +9641,7 @@ } }, "limitCollectionDeletionDisabled": { - "message": "Turned off Restrict collection deletion setting $ID$.", + "message": "Desativou a configuração de restrição de apagamento de conjuntos $ID$.", "placeholders": { "id": { "content": "$1", @@ -9650,7 +9650,7 @@ } }, "limitItemDeletionEnabled": { - "message": "Turned on Restrict item deletion setting $ID$.", + "message": "Ativou a configuração de restrição de apagamento de itens $ID$.", "placeholders": { "id": { "content": "$1", @@ -9659,7 +9659,7 @@ } }, "limitItemDeletionDisabled": { - "message": "Turned off Restrict item deletion setting $ID$.", + "message": "Desativou a configuração de restrição de apagamento de itens $ID$.", "placeholders": { "id": { "content": "$1", @@ -9668,7 +9668,7 @@ } }, "allowAdminAccessToAllCollectionItemsEnabled": { - "message": "Turned on Allow owners and admins to manage all collections and items setting $ID$.", + "message": "Ativou a configuração de permitir que todos os proprietários e administradores gerenciem todos os conjuntos e itens $ID$.", "placeholders": { "id": { "content": "$1", @@ -9677,7 +9677,7 @@ } }, "allowAdminAccessToAllCollectionItemsDisabled": { - "message": "Turned off Allow owners and admins to manage all collections and items setting $ID$.", + "message": "Desativou a configuração de permitir que todos os proprietários e administradores gerenciem todos os conjuntos e itens $ID$.", "placeholders": { "id": { "content": "$1", @@ -9690,80 +9690,80 @@ "description": "This is followed a by a hyperlink to the help website." }, "installBrowserExtension": { - "message": "Instalar extensões de navegador" + "message": "Instalar extensão de navegador" }, "installBrowserExtensionDetails": { - "message": "Use a extensão para salvar rapidamente credenciais e formulários de autopreenchimento sem abrir o aplicativo web." + "message": "Use a extensão para salvar credenciais e preencher automaticamente formulários de forma rápida, sem abrir o aplicativo web." }, "projectAccessUpdated": { "message": "Acesso ao projeto atualizado" }, "unexpectedErrorSend": { - "message": "Ocorreu um erro inesperado ao carregar este Envio. Tente novamente mais tarde." + "message": "Ocorreu um erro inesperado ao carregar este Send. Tente novamente mais tarde." }, "seatLimitReached": { - "message": "Limite de lugares foi atingido" + "message": "Limite de vagas foi atingido" }, "contactYourProvider": { - "message": "Entre em contato com seu provedor para comprar lugares adicionais." + "message": "Entre em contato com seu provedor para comprar vagas adicionais." }, "seatLimitReachedContactYourProvider": { - "message": "O limite de lugares foi atingido. Entre em contato com seu provedor para comprar lugares adicionais." + "message": "O limite de vagas foi atingido. Entre em contato com seu provedor para comprar vagas adicionais." }, "collectionAccessRestricted": { - "message": "O acesso à coleção está restrito" + "message": "O acesso ao conjunto está restrito" }, "readOnlyCollectionAccess": { - "message": "Você não tem acesso para gerenciar esta coleção." + "message": "Você não tem acesso para gerenciar este conjunto." }, "grantManageCollectionWarningTitle": { - "message": "Faltando Permissões para Gerenciar Coleção" + "message": "Permissões de gerenciamento de conjunto ausentes" }, "grantManageCollectionWarning": { - "message": "Conceda permissões de Gerenciamento de Coleções para permitir o gerenciamento completo da coleção, incluindo a exclusão da coleção." + "message": "Conceda permissões de gerenciamento de conjuntos para permitir o gerenciamento completo do conjunto, incluindo o apagamento do conjunto." }, "grantCollectionAccess": { - "message": "Conceder acesso de grupos ou membros a esta coleção." + "message": "Conceda o acesso de grupos ou membros a este conjunto." }, "grantCollectionAccessMembersOnly": { - "message": "Conceder acesso a essa coleção." + "message": "Conceda acesso de membros a este conjunto." }, "adminCollectionAccess": { - "message": "Os administradores podem acessar e gerenciar coleções." + "message": "Os administradores podem acessar e gerenciar conjuntos." }, "serviceAccountAccessUpdated": { - "message": "Acesso à conta de serviço atualizado" + "message": "Acesso da conta de serviço atualizado" }, "commonImportFormats": { "message": "Formatos comuns", "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "Detecção de correspondência de URI é como o Bitwarden identifica sugestões de preenchimento automático.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "message": "\"Expressão regular\" é uma opção avançada com maior risco de exposição das credenciais.", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { - "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "message": "\"Começa com\" é uma opção avançada com maior risco de exposição de credenciais.", "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "Mais sobre a detecção de correspondência", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "Opções avançadas", "description": "Advanced option placeholder for uri option component" }, "warningCapitalized": { - "message": "Warning", + "message": "Atenção", "description": "Warning (should maintain locale-relevant capitalization)" }, "maintainYourSubscription": { - "message": "Para manter sua assinatura para $ORG$, ", + "message": "Para manter sua assinatura de $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": { @@ -9777,13 +9777,13 @@ "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": "Informação da Organização" + "message": "Informações da organização" }, "confirmationDetails": { "message": "Detalhes da confirmação" }, "smFreeTrialThankYou": { - "message": "Obrigado por se inscrever no Bitwarden Secrets Manager!" + "message": "Obrigado por se inscrever no Bitwarden Gerenciador de Segredos!" }, "smFreeTrialConfirmationEmail": { "message": "Enviamos um e-mail de confirmação para seu e-mail em " @@ -9805,7 +9805,7 @@ "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "movingToAnotherTool": { - "message": "Trocando de ferramenta", + "message": "Migrando para outra ferramenta", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "tooDifficultToUse": { @@ -9813,21 +9813,29 @@ "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "notUsingEnough": { - "message": "Não está usando o suficiente", + "message": "Falta de uso", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "tooExpensive": { "message": "Muito caro", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Migrando para o plano grátis", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Migrando para uma organização grátis", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Grátis por 1 ano" }, "newWebApp": { - "message": "Bem-vindo ao novo e melhorado aplicativo da web. Saiba mais sobre o que mudou." + "message": "Boas-vindas ao novo e melhorado aplicativo web. Saiba mais sobre o que mudou." }, "releaseBlog": { - "message": "Ler o blog do lançamento" + "message": "Ler o post do lançamento no blog" }, "adminConsole": { "message": "Painel de administração" @@ -9842,37 +9850,37 @@ "message": "Você não pode se adicionar aos grupos." }, "cannotAddYourselfToCollections": { - "message": "Você não pode se adicionar às coleções." + "message": "Você não pode se adicionar aos conjuntos." }, "assign": { "message": "Atribuir" }, "assignTasks": { - "message": "Assign tasks" + "message": "Atribuir tarefas" }, "assignSecurityTasksToMembers": { - "message": "Send notifications to change passwords" + "message": "Envie notificações para alteração de senhas" }, "assignToCollections": { - "message": "Atribuir à coleções" + "message": "Atribuir a conjuntos" }, "assignToTheseCollections": { - "message": "Atribuir a estas coleções" + "message": "Atribuir a estes conjuntos" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Apenas membros da organização com acesso a essas coleções poderão ver o item." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver o item." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Apenas membros da organização com acesso à essas coleções poderão ver os itens." + "message": "Apenas membros da organização com acesso a estes conjuntos poderão ver os itens." }, "selectCollectionsToAssign": { - "message": "Selecione as coleções para atribuir" + "message": "Selecione conjuntos a atribuir" }, "noCollectionsAssigned": { - "message": "Nenhuma coleção foi atribuída" + "message": "Nenhum conjunto foi atribuído" }, "successfullyAssignedCollections": { - "message": "Coleções atribuídas com sucesso" + "message": "Conjuntos atribuídos com sucesso" }, "bulkCollectionAssignmentWarning": { "message": "Você selecionou $TOTAL_COUNT$ itens. Você não pode atualizar $READONLY_COUNT$ destes itens porque você não tem permissão para edição.", @@ -9897,44 +9905,44 @@ "message": "Itens" }, "assignedSeats": { - "message": "Lugares Atribuídos" + "message": "Vagas atribuídas" }, "assigned": { - "message": "Atribuído" + "message": "Atribuídas" }, "used": { - "message": "Utilizado" + "message": "Usadas" }, "remaining": { - "message": "Restante" + "message": "Restantes" }, "unlinkOrganization": { "message": "Desvincular organização" }, "manageSeats": { - "message": "GERENCIAR LUGARES" + "message": "GERENCIAR VAGAS" }, "manageSeatsDescription": { - "message": "Os ajustes nos lugares serão refletidos no próximo ciclo de faturamento." + "message": "Os ajustes nas vagas serão refletidos no próximo ciclo de faturamento." }, "unassignedSeatsDescription": { - "message": "Assinatura de assentos desvinculada" + "message": "Vagas não atribuídas" }, "purchaseSeatDescription": { - "message": "Assentos adicionais comprados" + "message": "Vagas adicionais compradas" }, "assignedSeatCannotUpdate": { - "message": "Os assentos atribuídos não podem ser atualizados. Por favor, entre em contato com o proprietário da sua organização para obter assistência." + "message": "Os assentos atribuídos não podem ser atualizados. Entre em contato com o proprietário da sua organização para obter assistência." }, "subscriptionUpdateFailed": { "message": "Atualização da assinatura falhou" }, "trial": { - "message": "Avaliação", + "message": "Teste grátis", "description": "A subscription status label." }, "pastDue": { - "message": "Atrasado", + "message": "Atrasada", "description": "A subscription status label" }, "subscriptionExpired": { @@ -9942,7 +9950,7 @@ "description": "The date header used when a subscription is past due." }, "pastDueWarningForChargeAutomatically": { - "message": "Você tem um período de carência de $DAYS$ dias a contar da data de expiração para manter sua assinatura. Por favor, resolva as faturas vencidas até $SUSPENSION_DATE$.", + "message": "Você tem um período de tolerância de $DAYS$ dias a contar da data de expiração para manter sua assinatura. Resolva as faturas atrasadas até $SUSPENSION_DATE$.", "placeholders": { "days": { "content": "$1", @@ -9956,7 +9964,7 @@ "description": "A warning shown to the user when their subscription is past due and they are charged automatically." }, "pastDueWarningForSendInvoice": { - "message": "Você tem um período de licença de $DAYS$, contados a partir da data de vencimento da sua primeira fatura em aberto para manter a sua assinatura. Por favor, resolva as faturas vencidas até $SUSPENSION_DATE$.", + "message": "Você tem um período de tolerância de $DAYS$ dias para manter a sua assinatura, contados a partir da data de vencimento da sua primeira fatura em aberto. Resolva as faturas atrasadas até $SUSPENSION_DATE$.", "placeholders": { "days": { "content": "$1", @@ -9974,7 +9982,7 @@ "description": "The header of a warning box shown to a user whose subscription is unpaid." }, "toReactivateYourSubscription": { - "message": "Para reativar sua assinatura, por favor resolva as faturas vencidas.", + "message": "Para reativar sua assinatura, resolva as faturas atrasadas.", "description": "The body of a warning box shown to a user whose subscription is unpaid." }, "cancellationDate": { @@ -9997,19 +10005,19 @@ "description": "Title for creating a new machine account." }, "machineAccountsNoItemsMessage": { - "message": "Crie uma nova conta de máquina para começar a automatizar o acesso secreto.", + "message": "Crie uma conta de máquina para começar a automatizar o acesso aos segredos.", "description": "Message to encourage the user to start creating machine accounts." }, "machineAccountsNoItemsTitle": { - "message": "Ainda não há nada a ser exibido", + "message": "Nada para mostrar ainda", "description": "Title to indicate that there are no machine accounts to display." }, "deleteMachineAccounts": { - "message": "Excluir contas de máquina", + "message": "Apagar contas de serviço", "description": "Title for the action to delete one or multiple machine accounts." }, "deleteMachineAccount": { - "message": "Excluir conta de máquina", + "message": "Apagar conta de serviço", "description": "Title for the action to delete a single machine account." }, "viewMachineAccount": { @@ -10017,7 +10025,7 @@ "description": "Action to view the details of a machine account." }, "deleteMachineAccountDialogMessage": { - "message": "A exclusão da conta de máquina $MACHINE_ACCOUNT$ é permanente e irreversível.", + "message": "Apagar a conta de máquina $MACHINE_ACCOUNT$ é permanente e irreversível.", "placeholders": { "machine_account": { "content": "$1", @@ -10026,10 +10034,10 @@ } }, "deleteMachineAccountsDialogMessage": { - "message": "Excluir contas de máquina é permanente e irreversível." + "message": "Apagar contas de máquina é permanente e irreversível." }, "deleteMachineAccountsConfirmMessage": { - "message": "Excluir $COUNT$ contas de máquina", + "message": "Apagar $COUNT$ contas de máquina", "placeholders": { "count": { "content": "$1", @@ -10038,17 +10046,17 @@ } }, "deleteMachineAccountToast": { - "message": "Conta de máquina excluída" + "message": "Conta de máquina apagada" }, "deleteMachineAccountsToast": { - "message": "Contas de máquina excluídas" + "message": "Contas de máquina apagadas" }, "searchMachineAccounts": { - "message": "Pesquisar contas de máquina", + "message": "Buscar contas de máquina", "description": "Placeholder text for searching machine accounts." }, "editMachineAccount": { - "message": "Editar conta da máquina", + "message": "Editar conta de máquina", "description": "Title for editing a machine account." }, "machineAccountName": { @@ -10064,7 +10072,7 @@ "description": "Notifies that a machine account has been updated" }, "projectMachineAccountsDescription": { - "message": "Conceder acesso a contas de máquina a este projeto." + "message": "Conceda acesso do projeto a contas de máquina." }, "projectMachineAccountsSelectHint": { "message": "Digite ou selecione contas de máquina" @@ -10073,13 +10081,13 @@ "message": "Adicione contas de máquina para conceder acesso" }, "machineAccountPeopleDescription": { - "message": "Conceder acesso de grupos ou pessoas a esta conta de máquina." + "message": "Conceda acesso a esta conta de máquina a grupos ou pessoas." }, "machineAccountProjectsDescription": { - "message": "Atribuir projetos a esta conta de máquina. " + "message": "Atribua projetos a esta conta de máquina. " }, "createMachineAccount": { - "message": "Criar uma conta de máquina" + "message": "Crie uma conta de serviço" }, "maPeopleWarningMessage": { "message": "Remover pessoas de uma conta de máquina não remove os tokens de acesso que elas criaram. Por melhores práticas de segurança, é recomendado revogar os tokens de acesso criados por pessoas que foram removidas de uma conta de máquina." @@ -10091,7 +10099,7 @@ "message": "Esta ação irá remover seu acesso à conta de máquina." }, "machineAccountsIncluded": { - "message": "$COUNT$ contas de serviço incluídas", + "message": "$COUNT$ contas de máquina incluídas", "placeholders": { "count": { "content": "$1", @@ -10100,7 +10108,7 @@ } }, "additionalMachineAccountCost": { - "message": "$COST$ mensal para contas de máquina adicionais", + "message": "$COST$ mensais por contas de máquina adicionais", "placeholders": { "cost": { "content": "$1", @@ -10121,7 +10129,7 @@ } }, "addAdditionalMachineAccounts": { - "message": "Você pode adicionar contas de máquina extras por $COST$ mensais.", + "message": "Você pode adicionar contas de máquina adicionais por $COST$ mensais.", "placeholders": { "cost": { "content": "$1", @@ -10133,28 +10141,28 @@ "message": "Limitar contas de máquina (opcional)" }, "limitMachineAccountsDesc": { - "message": "Defina um limite para suas contas de máquina. Quando este limite for atingido, você não poderá criar novas contas de máquina." + "message": "Configure um limite para suas contas de máquina. Quando este limite for atingido, você não poderá criar contas de máquina." }, "machineAccountLimit": { - "message": "Limite de conta de máquina (opcional)" + "message": "Limite de contas de máquina (opcional)" }, "maxMachineAccountCost": { - "message": "Custo máximo de conta de máquina" + "message": "Custo potencial máximo de contas de máquina" }, "machineAccountAccessUpdated": { - "message": "Acesso a conta de máquina atualizado" + "message": "Acesso da conta de máquina atualizado" }, "restrictedGroupAccessDesc": { - "message": "Você não pode adicionar você mesmo a um grupo." + "message": "Você não pode se adicionar a um grupo." }, "deleteProvider": { - "message": "Excluir Provedor" + "message": "Apagar provedor" }, "deleteProviderConfirmation": { - "message": "A exclusão de um provedor é permanente e irreversível. Digite sua senha principal para confirmar a exclusão do provedor e de todos os dados associados." + "message": "Apagar um provedor é permanente e irreversível. Digite sua senha principal para confirmar o apagamento do provedor e de todos os dados associados." }, "deleteProviderName": { - "message": "Não é possível excluir $ID$", + "message": "Não é possível apagar $ID$", "placeholders": { "id": { "content": "$1", @@ -10163,7 +10171,7 @@ } }, "deleteProviderWarningDescription": { - "message": "Você deve desvincular todos os clientes antes de excluir $ID$.", + "message": "Você deve desvincular todos os clientes antes de apagar $ID$.", "placeholders": { "id": { "content": "$1", @@ -10172,19 +10180,19 @@ } }, "providerDeleted": { - "message": "Provedor excluído" + "message": "Provedor apagado" }, "providerDeletedDesc": { - "message": "O provedor e todos os dados associados foram excluídos." + "message": "O provedor e todos os dados associados foram apagados." }, "deleteProviderRecoverConfirmDesc": { - "message": "Você pediu para excluir este Provedor. Clique no botão abaixo para confirmar." + "message": "Você pediu para apagar este provedor. Clique no botão abaixo para confirmar." }, "deleteProviderWarning": { - "message": "A exclusão do seu provedor é permanente. Não pode ser desfeita." + "message": "O apagamento do seu provedor é permanente. Não pode ser desfeito." }, "errorAssigningTargetCollection": { - "message": "Erro ao atribuir coleção de destino." + "message": "Erro ao atribuir conjunto de destino." }, "errorAssigningTargetFolder": { "message": "Erro ao atribuir pasta de destino." @@ -10197,20 +10205,20 @@ "message": "Integrações" }, "integrationsDesc": { - "message": "Sincronize automaticamente segredos do Bitwarden Secrets Manager para um serviço de terceiros." + "message": "Sincronize segredos do Bitwarden Gerenciador de Segredos automaticamente para um serviço de terceiros." }, "sdks": { "message": "SDKs" }, "sdksDesc": { - "message": "Utilize o Bitwarden Secrets Manager SDK nas seguintes linguagens de programação para construir seus próprios aplicativos." + "message": "Utilize o SDK do Bitwarden Gerenciador de Segredos nas seguintes linguagens de programação para construir seus próprios aplicativos." }, "ssoDescStart": { - "message": "Configurar", + "message": "Configure a", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { - "message": "Para o Bitwarden usar o guia de implementação Para o seu provedor de identidade.", + "message": "para o BItwarden usando o guia de implementação do seu provedor de identidade.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "userProvisioning": { @@ -10220,63 +10228,63 @@ "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configurar", + "message": "Configure o", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { - "message": "(Sistema de Gerenciamento de Identidade de Domínio) para fornecer automaticamente usuários e grupos ao Bitwarden usando o guia de implementação do seu Provedor de Identidade.", + "message": "(Sistema de Gerenciamento de Identidade Entre Domínios) para provisionar automaticamente usuários e grupos ao Bitwarden usando o guia de implementação do seu provedor de identidade.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "bwdc": { - "message": "Conector de Diretório Bitwarden" + "message": "Bitwarden Conector de Diretório" }, "bwdcDesc": { - "message": "Configure o conector de diretório do Bitwarden para fornecer automaticamente usuários e grupos usando o guia de implementação para o seu provedor de identidade." + "message": "Configure o Bitwarden Conector de Diretório para provisionar automaticamente usuários e grupos usando o guia de implementação para o seu provedor de identidade." }, "eventManagement": { - "message": "Gerenciador de eventos" + "message": "Gerenciamento de eventos" }, "eventManagementDesc": { - "message": "Integre os logs de eventos do Bitwarden ao seu sistema SIEM (informações do sistema e gerenciamento de eventos) utilizando o guia de implementação da sua plataforma." + "message": "Integre os registros de eventos do Bitwarden ao seu sistema SIEM (gerenciamento de eventos e informações do sistema) utilizando o guia de implementação da sua plataforma." }, "deviceManagement": { - "message": "Gerenciamento do dispositivo" + "message": "Gerenciamento de dispositivos" }, "deviceManagementDesc": { "message": "Configure o gerenciamento de dispositivos para o Bitwarden usando o guia de implementação da sua plataforma." }, "crowdstrikeEventIntegrationDesc": { - "message": "Send event data to your Logscale instance" + "message": "Envie dados de eventos a sua instância do Logscale" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "Envie dados de eventos do cofre a sua instância do Datadog" }, "failedToSaveIntegration": { - "message": "Failed to save integration. Please try again later." + "message": "Falha ao salvar a integração. Tente novamente mais tarde." }, "mustBeOrgOwnerToPerformAction": { - "message": "You must be the organization owner to perform this action." + "message": "Você precisa ser o proprietário da organização para executar esta ação." }, "failedToDeleteIntegration": { - "message": "Failed to delete integration. Please try again later." + "message": "Falha ao apagar a integração. Tente novamente mais tarde." }, "deviceIdMissing": { "message": "ID do dispositivo está faltando" }, "deviceTypeMissing": { - "message": "O tipo de dispositivo está faltando" + "message": "O tipo do dispositivo está faltando" }, "deviceCreationDateMissing": { - "message": "Data de criação do dispositivo ausente" + "message": "A data de criação do dispositivo está faltando" }, "desktopRequired": { - "message": "Desktop necessário" + "message": "Computador necessário" }, "reopenLinkOnDesktop": { - "message": "Reabra este link a partir do seu e-mail em um desktop." + "message": "Reabra este link a partir do seu e-mail em um computador." }, "connectIntegrationButtonDesc": { - "message": "Connect $INTEGRATION$", + "message": "Conectar $INTEGRATION$", "placeholders": { "integration": { "content": "$1", @@ -10285,7 +10293,7 @@ } }, "updateIntegrationButtonDesc": { - "message": "Update $INTEGRATION$", + "message": "Atualizar $INTEGRATION$", "placeholders": { "integration": { "content": "$1", @@ -10294,7 +10302,7 @@ } }, "integrationCardTooltip": { - "message": "Inicie o guia de implementação $INTEGRATION$.", + "message": "Abra o guia de implementação do $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -10303,7 +10311,7 @@ } }, "smIntegrationTooltip": { - "message": "Configure $INTEGRATION$.", + "message": "Configure o $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -10312,7 +10320,7 @@ } }, "smSdkTooltip": { - "message": "Visualizar repositório Rust", + "message": "Ver repositório do $SDK$", "placeholders": { "sdk": { "content": "$1", @@ -10321,7 +10329,7 @@ } }, "integrationCardAriaLabel": { - "message": "Abrir guia de implementação $INTEGRATION$ em uma nova aba.", + "message": "abra o guia de implementação do $INTEGRATION$ em uma nova aba.", "placeholders": { "integration": { "content": "$1", @@ -10330,7 +10338,7 @@ } }, "smSdkAriaLabel": { - "message": "Veja o repositório $SDK$ em uma nova guia.", + "message": "veja o repositório do $SDK$ em uma nova guia.", "placeholders": { "sdk": { "content": "$1", @@ -10339,7 +10347,7 @@ } }, "smIntegrationCardAriaLabel": { - "message": "Configurar guia de implementação $INTEGRATION$ em uma nova aba.", + "message": "configure o guia de implementação do $INTEGRATION$ em uma nova aba.", "placeholders": { "integration": { "content": "$1", @@ -10348,25 +10356,25 @@ } }, "createNewClientToManageAsProvider": { - "message": "Crie uma nova organização de cliente para gerenciar como um Provedor. Posições adicionais serão refletidas no próximo ciclo de faturamento." + "message": "Crie uma nova organização de cliente para gerenciar como um provedor. Vagas adicionais serão refletidas no próximo ciclo de faturamento." }, "url": { "message": "URL" }, "bearerToken": { - "message": "Bearer Token" + "message": "Token de portador" }, "repositoryNameHint": { - "message": "Name of the repository to ingest into" + "message": "Nome do repositório que irá ser ingerido" }, "index": { - "message": "Index" + "message": "Índice" }, "selectAPlan": { "message": "Selecione um plano" }, "thirtyFivePercentDiscount": { - "message": "35% de Desconto" + "message": "Desconto de 35%" }, "monthPerMember": { "message": "mês por membro" @@ -10375,10 +10383,10 @@ "message": "mês por membro cobrado anualmente" }, "seats": { - "message": "Lugares" + "message": "Vagas" }, "addOrganization": { - "message": "Adicionar Organização" + "message": "Adicionar organização" }, "createdNewClient": { "message": "Novo cliente criado com sucesso" @@ -10387,49 +10395,49 @@ "message": "Sem acesso" }, "collectionAdminConsoleManaged": { - "message": "Esta coleção só é acessível a partir do console de administração" + "message": "Este conjunto só é acessível a partir do painel de administração" }, "organizationOptionsMenu": { - "message": "Alternar Menu da Organização" + "message": "Habilitar menu da organização" }, "vaultItemSelect": { "message": "Selecionar item do cofre" }, "collectionItemSelect": { - "message": "Selecionar item da coleção" + "message": "Selecionar item do conjunto" }, "manageBillingFromProviderPortalMessage": { - "message": "Gerenciar faturamento a partir do Portal do Provedor" + "message": "Gerenciar faturamento pelo Portal do Provedor" }, "continueSettingUp": { - "message": "Continue setting up Bitwarden" + "message": "Continuar configurando o Bitwarden" }, "continueSettingUpFreeTrial": { - "message": "Continue a configurar a sua avaliação gratuita do Bitwarden" + "message": "Continuar configurando o seu teste grátis do Bitwarden" }, "continueSettingUpPasswordManager": { - "message": "Continue setting up Bitwarden Password Manager" + "message": "Continuar configurando o Bitwarden Gerenciador de Senhas" }, "continueSettingUpFreeTrialPasswordManager": { - "message": "Continue a configurar sua avaliação gratuita do Gerenciador de Senhas do Bitwarden" + "message": "Continuar configurando o teste grátis do Bitwarden Gerenciador de Senhas" }, "continueSettingUpSecretsManager": { - "message": "Continue setting up Bitwarden Secrets Manager" + "message": "Continuar configurando o Bitwarden Gerenciador de Segredos" }, "continueSettingUpFreeTrialSecretsManager": { - "message": "Continue configurando seu teste gratuito do Gerenciador de Segredos do Bitwarden" + "message": "Continuar configurando seu teste grátis do Bitwarden Gerenciador de Segredos" }, "enterTeamsOrgInfo": { - "message": "Insira as informações da organização de suas equipes" + "message": "Digite as informações da organização do Equipes" }, "enterFamiliesOrgInfo": { - "message": "Digite as informações da organização das suas famílias" + "message": "Digite as informações da organização do Famílias" }, "enterEnterpriseOrgInfo": { - "message": "Insira suas informações da organização empresarial" + "message": "Digite as informações da sua organização do Empresarial" }, "viewItemsIn": { - "message": "Visualizar itens em $NAME$", + "message": "Ver itens em $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -10466,10 +10474,10 @@ "message": "Ver informações" }, "viewAccess": { - "message": "Acesso à visualização" + "message": "Ver acesso" }, "noCollectionsSelected": { - "message": "Você não selecionou nenhuma coleção." + "message": "Você não selecionou nenhum conjunto." }, "updateName": { "message": "Atualizar nome" @@ -10481,13 +10489,13 @@ "message": "Provedor de Serviços Gerenciados" }, "managedServiceProvider": { - "message": "Provedor de serviço gerenciado" + "message": "Provedor de serviços gerenciados" }, "multiOrganizationEnterprise": { - "message": "multi-empresa organizacional" + "message": "Empresa multi-organizacional" }, "orgSeats": { - "message": "Lugares da Organização" + "message": "Vagas da organização" }, "providerDiscount": { "message": "Desconto de $AMOUNT$%", @@ -10505,16 +10513,16 @@ "message": "Proteja sua família ou empresa" }, "upgradeOrganizationCloseSecurityGaps": { - "message": "Fechar lacunas de segurança com relatórios de monitoramento" + "message": "Resolva problemas de segurança com relatórios de monitoramento" }, "upgradeOrganizationCloseSecurityGapsDesc": { - "message": "Fique à frente das vulnerabilidades de segurança atualizando para um plano pago para um monitoramento melhorado." + "message": "Fique à frente das vulnerabilidades de segurança fazendo upgrade para um plano pago para um monitoramento aprimorado." }, "approveAllRequests": { "message": "Aprovar todas as solicitações" }, "allLoginRequestsApproved": { - "message": "Todas as solicitações de login aprovadas" + "message": "Todas as solicitações de acesso aprovadas" }, "payPal": { "message": "PayPal" @@ -10526,13 +10534,13 @@ "message": "Informações fiscais atualizadas" }, "billingInvalidTaxIdError": { - "message": "CPF/CNPJ inválido, se você acredita que isto é um erro, contate o suporte." + "message": "ID de imposto (tax ID) inválido, se você acredita que isto é um erro, entre em contato com o suporte." }, "billingTaxIdTypeInferenceError": { - "message": "Não foi possível validar seu CPF/CNPJ, se você acredita que isto é um erro, contate o suporte." + "message": "Não foi possível validar seu ID de imposto (tax ID), se você acredita que isto é um erro, entre em contato com o suporte." }, "billingPreviewInvalidTaxIdError": { - "message": "CPF/CNPJ inválido, se você acredita que isto é um erro, contate o suporte." + "message": "ID de imposto (tax ID) inválido, se você acredita que isto é um erro, entre em contato com o suporte." }, "billingPreviewInvoiceError": { "message": "Ocorreu um erro ao pré-visualizar a fatura. Tente novamente mais tarde." @@ -10554,10 +10562,10 @@ "description": "A hint that shows up on the Provider setup page to inform the admin the billing email will receive the provider's invoices." }, "upgradeOrganizationEnterprise": { - "message": "Identifique os riscos de segurança ao verificar o acesso de membros" + "message": "Identifique riscos de segurança verificando o acesso dos membros" }, "onlyAvailableForEnterpriseOrganization": { - "message": "Visualize rapidamente o acesso de membros em toda a organização atualizando para um plano empresarial." + "message": "Veja o acesso de membros em toda a organização de forma rápida fazendo upgrade para um plano Empresarial." }, "date": { "message": "Data" @@ -10566,55 +10574,55 @@ "message": "Exportar relatório do cliente" }, "memberAccessReport": { - "message": "Acesso de membros" + "message": "Acesso dos membros" }, "memberAccessReportDesc": { - "message": "Garanta que membros tenham acesso às credenciais certas e que suas contas estejam seguras. Utilize este relatório para obter um CSV do acesso de membros e configurações de conta." + "message": "Garanta que membros tenham acesso às credenciais certas e que suas contas estejam seguras. Utilize este relatório para obter um CSV do acesso e configurações das contas dos membros." }, "memberAccessReportPageDesc": { - "message": "Avalie o acesso de membros da organização entre grupos, coleções e itens de coleções. O exporte CSV fornece informações detalhadas por membro, incluindo informações sobre permissões de coleção e configurações de conta." + "message": "Fiscalize o acesso dos membros da organização entre grupos, conjuntos e os itens dos conjuntos. A exportação em CSV fornece informações detalhadas por membro, incluindo informações sobre permissões de conjuntos e configurações de conta." }, "memberAccessReportNoCollection": { - "message": "(Sem coleção)" + "message": "(Sem conjunto)" }, "memberAccessReportNoCollectionPermission": { - "message": "(Nenhuma permissão de coleção)" + "message": "(Sem permissão de conjunto)" }, "memberAccessReportNoGroup": { - "message": "(Sem Grupo)" + "message": "(Sem grupo)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "Ligado" + "message": "Ativada" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Desligado" + "message": "Desativada" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "Ligado" + "message": "Ativada" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Desligado" + "message": "Desativada" }, "kdfIterationRecommends": { "message": "Recomendamos 600.000 ou mais" }, "providerReinstate": { - "message": " Contate o Atendimento ao Cliente para restabelecer sua assinatura." + "message": " Contate o suporte ao cliente para restabelecer sua assinatura." }, "secretPeopleDescription": { - "message": "Conceder acesso a este segredo a grupos ou pessoas. As permissões definidas para pessoas irão substituir as permissões definidas por grupos." + "message": "Conceda acesso a este segredo a grupos ou pessoas. As permissões configuradas para pessoas substituirão as permissões configuradas por grupos." }, "secretPeopleEmptyMessage": { "message": "Adicione pessoas ou grupos para compartilhar o acesso a este segredo" }, "secretMachineAccountsDescription": { - "message": "Conceda contas de máquinas acesso a este segredo." + "message": "Conceda contas de máquina acesso a este segredo." }, "secretMachineAccountsEmptyMessage": { "message": "Adicione contas de máquina para conceder acesso a este segredo" }, "smAccessRemovalWarningSecretTitle": { - "message": "Remover acesso a este segredo" + "message": "Remova acesso a este segredo" }, "smAccessRemovalSecretMessage": { "message": "Esta ação removerá seu acesso a este segredo." @@ -10633,18 +10641,18 @@ "description": "A message showing how many unassigned seats are available for a provider." }, "contactYourProviderForAdditionalSeats": { - "message": "Entre em contato com o administrador do seu provedor para comprar lugares adicionais." + "message": "Entre em contato com o administrador do seu provedor para comprar vagas adicionais." }, "open": { - "message": "Abrir", + "message": "Em aberto", "description": "The status of an invoice." }, "uncollectible": { - "message": "Incolecionável", + "message": "Incobrável", "description": "The status of an invoice." }, "clientDetails": { - "message": "Detalhes de cliente" + "message": "Detalhes do cliente" }, "downloadCSV": { "message": "Baixar CSV" @@ -10656,15 +10664,15 @@ "message": "Os ajustes à sua assinatura resultarão em cobranças rateadas em um ciclo de faturamento mensal. " }, "billingHistoryDescription": { - "message": "Baixe um CSV para obter detalhes do cliente para cada data de faturamento. As taxas pagas não estão incluídas no CSV e podem variar da factura vinculada. Para obter dados de faturamento mais precisos, consulte suas faturas mensais.", + "message": "Baixe um CSV para obter detalhes do cliente para cada data de faturamento. As taxas rateadas não estão incluídas no CSV e podem variar da fatura vinculada. Para obter dados de faturamento mais precisos, consulte suas faturas mensais.", "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "noInvoicesToList": { - "message": "Não há itens para listar", + "message": "Não há faturas para listar", "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "providerClientVaultPrivacyNotification": { - "message": "Aviso: No final deste mês, a privacidade do cofre cliente será melhorada e os membros do provedor não terão mais acesso direto aos itens do cofre do cliente. Para dúvidas,", + "message": "Atenção: No final deste mês, a privacidade do cofre dos clientes será melhorada e os membros do provedor não terão mais acesso direto aos itens do cofre do cliente. Para dúvidas,", "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": { @@ -10672,10 +10680,10 @@ "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": { - "message": "Patrocinado" + "message": "Financiado" }, "licenseAndBillingManagementDesc": { - "message": "Após fazer atualizações no servidor da nuvem do Bitwarden, envie o arquivo de licença para aplicar as alterações mais recentes." + "message": "Após fazer atualizações no servidor da nuvem do Bitwarden, envie o arquivo da sua licença para aplicar as alterações mais recentes." }, "addToFolder": { "message": "Adicionar à pasta" @@ -10684,10 +10692,10 @@ "message": "Selecionar pastas" }, "personalItemTransferWarningSingular": { - "message": "1 item será transferido permanentemente para a organização selecionada. Você não irá mais possuir este item." + "message": "1 item será transferido permanentemente para a organização selecionada. Você não irá mais ser o proprietário deste item." }, "personalItemsTransferWarningPlural": { - "message": "Itens $PERSONAL_ITEMS_COUNT$ serão transferidos permanentemente para a organização selecionada. Você não irá mais possuir esses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para a organização selecionada. Você não irá mais ser o proprietário desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -10696,7 +10704,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item será transferido permanentemente para $ORG$. Você não irá mais possuir este item.", + "message": "1 item será transferido permanentemente para $ORG$. Você não irá mais ser o proprietário deste item.", "placeholders": { "org": { "content": "$1", @@ -10705,7 +10713,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "Os itens $PERSONAL_ITEMS_COUNT$ serão transferidos permanentemente para $ORG$. Você não irá mais possuir esses itens.", + "message": "$PERSONAL_ITEMS_COUNT$ itens serão transferidos permanentemente para $ORG$. Você não irá mais ser o proprietário desses itens.", "placeholders": { "personal_items_count": { "content": "$1", @@ -10718,55 +10726,55 @@ } }, "data": { - "message": "Dado" + "message": "Dados" }, "purchasedSeatsRemoved": { - "message": "assentos comprados removidos" + "message": "vagas compradas removidas" }, "environmentVariables": { - "message": "Variáveis de ambiente" + "message": "Variáveis do ambiente" }, "organizationId": { - "message": "ID da Organização" + "message": "ID da organização" }, "projectIds": { "message": "IDs do projeto" }, "projectId": { - "message": "ID do Projeto" + "message": "ID do projeto" }, "projectsAccessedByMachineAccount": { "message": "Os seguintes projetos podem ser acessados por esta conta de máquina." }, "config": { - "message": "Configuraçao" + "message": "Configuração" }, "learnMoreAboutEmergencyAccess": { - "message": "Saiba mais sobre acesso de emergência" + "message": "Saiba mais sobre o acesso de emergência" }, "learnMoreAboutMatchDetection": { - "message": "Saiba mais sobre a detecção de partidas" + "message": "Saiba mais sobre a detecção de correspondência" }, "learnMoreAboutMasterPasswordReprompt": { - "message": "Saiba mais sobre a redefinição da senha principal" + "message": "Saiba mais sobre a resolicitação da senha principal" }, "learnMoreAboutSearchingYourVault": { - "message": "Saiba mais sobre como pesquisar no seu cofre" + "message": "Saiba mais sobre buscar no seu cofre" }, "learnMoreAboutYourAccountFingerprintPhrase": { - "message": "Saiba mais sobre a sua frase biométrica" + "message": "Saiba mais sobre a frase biométrica da sua conta" }, "impactOfRotatingYourEncryptionKey": { - "message": "Impacto ao girar sua chave de criptografia" + "message": "Consequências de rotacionar sua chave de criptografia" }, "learnMoreAboutEncryptionAlgorithms": { "message": "Saiba mais sobre os algoritmos de criptografia" }, "learnMoreAboutKDFIterations": { - "message": "Aprenda mais sobre iterações KDF" + "message": "Saiba mais sobre as iterações da KDF" }, "learnMoreAboutLocalization": { - "message": "Saiba mais sobre a localização" + "message": "Saiba mais sobre a tradução" }, "learnMoreAboutWebsiteIcons": { "message": "Saiba mais sobre como usar os ícones dos sites" @@ -10775,22 +10783,22 @@ "message": "Saiba mais sobre o acesso aos usuários" }, "learnMoreAboutMemberRoles": { - "message": "Saiba mais sobre os papéis e permissões dos membros" + "message": "Saiba mais sobre os cargos e permissões dos membros" }, "whatIsACvvNumber": { - "message": "O que é um número CVVV?" + "message": "O que é um número de CVV?" }, "learnMoreAboutApi": { "message": "Saiba mais sobre a API do Bitwarden" }, "fileSends": { - "message": "Arquivos enviados" + "message": "Sends de arquivo" }, "textSends": { - "message": "Texto enviado" + "message": "Sends de texto" }, "includesXMembers": { - "message": "para $COUNT$ membro", + "message": "por $COUNT$ membro(s)", "placeholders": { "count": { "content": "$1", @@ -10811,7 +10819,7 @@ "message": "Hospedagem local opcional" }, "upgradeFreeOrganization": { - "message": "Atualize sua organização $NAME$ ", + "message": "Faça upgrade da sua organização do $NAME$ ", "placeholders": { "name": { "content": "$1", @@ -10820,10 +10828,10 @@ } }, "includeSsoAuthenticationMessage": { - "message": "Autenticação SSO" + "message": "Autenticação única" }, "familiesPlanInvLimitReachedManageBilling": { - "message": "Organizações familiares podem ter até membros da $SEATCOUNT$. Faça o upgrade para um plano pago para convidar mais membros.", + "message": "Organizações familiares podem ter até $SEATCOUNT$ membros. Faça upgrade para um plano pago para convidar mais membros.", "placeholders": { "seatcount": { "content": "$1", @@ -10832,7 +10840,7 @@ } }, "familiesPlanInvLimitReachedNoManageBilling": { - "message": "Organizações familiares podem ter até membros $SEATCOUNT$. Entre em contato com o proprietário da sua organização para atualizar.", + "message": "Organizações familiares podem ter até $SEATCOUNT$ membros. Entre em contato com o proprietário da sua organização para fazer upgrade.", "placeholders": { "seatcount": { "content": "$1", @@ -10841,7 +10849,7 @@ } }, "upgradePlans": { - "message": "Atualize o seu plano para convidar membros e experimentar poderosos recursos de segurança." + "message": "Faça upgrade do seu plano para convidar membros e experimentar poderosos recursos de segurança." }, "upgradeDiscount": { "message": "Economize $AMOUNT$%", @@ -10853,25 +10861,25 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Recursos avançados para organizações maiores" + "message": "Capacidades avançadas para organizações maiores" }, "teamsPlanUpgradeMessage": { - "message": "Proteção residencial para o cultivo das equipes" + "message": "Proteção resiliente para o crescimento das equipes" }, "teamsInviteMessage": { - "message": "Convide membros ilimitados" + "message": "Convide ilimitados membros" }, "accessToCreateGroups": { "message": "Acesso para criar grupos" }, "syncGroupsAndUsersFromDirectory": { - "message": "Sincronizar grupos e usuários de um diretório" + "message": "Sincronize grupos e usuários de um diretório" }, "familyPlanUpgradeMessage": { - "message": "Proteja seus logins familiares" + "message": "Proteja as credenciais da sua família" }, "accessToPremiumFeatures": { - "message": "Acesso às funcionalidades Premium" + "message": "Acesso aos recursos do Premium" }, "additionalStorageGbMessage": { "message": "GB de armazenamento adicional" @@ -10901,40 +10909,40 @@ "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA de 2048 bits" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA de 3072 bits" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA de 4096 bits" }, "premiumAccounts": { - "message": "6 contas premium" + "message": "6 contas Premium" }, "unlimitedSharing": { "message": "Compartilhamento ilimitado" }, "unlimitedCollections": { - "message": "Coleções ilimitadas" + "message": "Conjuntos ilimitados" }, "secureDataSharing": { - "message": "Compartilhamento de dados seguro" + "message": "Compartilhamento seguro de dados" }, "eventLogMonitoring": { "message": "Monitoramento do registro de eventos" }, "directoryIntegration": { - "message": "Integração de diretório" + "message": "Integração de diretórios" }, "passwordLessSso": { - "message": "SSO Senha-Chaves" + "message": "Autenticação sem senha" }, "accountRecovery": { "message": "Recuperação de conta" }, "customRoles": { - "message": "Funções personalizadas" + "message": "Cargos personalizados" }, "unlimitedSecretsStorage": { "message": "Armazenamento ilimitado de segredos" @@ -10952,13 +10960,13 @@ "message": "Atual" }, "secretsManagerSubscriptionInfo": { - "message": "Sua assinatura do Gerenciador de Segredos será atualizada com base no plano selecionado" + "message": "Sua assinatura do Gerenciador de Segredos terá o upgrade feito de acordo com o plano selecionado" }, "bitwardenPasswordManager": { - "message": "Gerenciador de Senhas Bitwarden" + "message": "Bitwarden Gerenciador de Senhas" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Sua cortesia de um ano de assinatura do Gerenciador de Senhas vai atualizar para o plano selecionado. Você não será cobrado até que o período complementar acabe." + "message": "Sua assinatura de cortesia de um ano do Gerenciador de Senhas terá o upgrade feito para o plano selecionado. Você não será cobrado até que o período de cortesia acabe." }, "fileSavedToDevice": { "message": "Arquivo salvo no dispositivo. Gerencie a partir das transferências do seu dispositivo." @@ -10968,28 +10976,28 @@ "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Mostrar contagem de caracteres" + "message": "Mostrar número de caracteres" }, "hideCharacterCount": { - "message": "Esconder contagem de caracteres" + "message": "Ocultar número de caracteres" }, "editAccess": { "message": "Editar acesso" }, "textHelpText": { - "message": "Utilize campos de texto para dados como perguntas de segurança" + "message": "Use campos de texto para dados como questões de segurança" }, "hiddenHelpText": { - "message": "Use campos ocultos para dados confidenciais como uma senha" + "message": "Use campos ocultos para dados sensíveis como senhas" }, "checkBoxHelpText": { - "message": "Use caixas de seleção se gostaria de preencher automaticamente a caixa de seleção de um formulário, como um e-mail de lembrança" + "message": "Use caixas de seleção se gostaria de preencher automaticamente a caixa de seleção de um formulário, como um lembrar e-mail" }, "linkedHelpText": { "message": "Use um campo vinculado quando estiver enfrentando problemas com o preenchimento automático em um site específico." }, "linkedLabelHelpText": { - "message": "Digite o Id html do campo, nome, nome aria-label, ou marcador de posição" + "message": "Digite o ID html, nome, aria-label, ou placeholder do campo." }, "uppercaseDescription": { "message": "Incluir caracteres maiúsculos", @@ -11012,7 +11020,7 @@ "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { - "message": "0 – 9", + "message": "0-9", "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { @@ -11026,26 +11034,26 @@ "message": "O tamanho máximo do arquivo é 500 MB" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Tem certeza de que deseja excluir permanentemente esse anexo?" + "message": "Tem certeza de que deseja apagar esse anexo permanentemente?" }, "manageSubscriptionFromThe": { - "message": "Gerenciar assinatura do", + "message": "Gerenciar assinatura pelo", "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "Para hospedar o Bitwarden no seu próprio servidor, você precisará enviar seu arquivo de licença. Para apoiar planos de famílias gratuitas e recursos avançados de faturamento para sua organização auto-hospedada, você precisará configurar a sincronização automática em sua organização auto-hospedada." + "message": "Para hospedar o Bitwarden no seu próprio servidor, você precisará enviar o arquivo da sua licença. Para apoiar planos grátis do Famílias e recursos avançados de faturamento para sua organização auto-hospedada, você precisará configurar a sincronização automática nela." }, "selfHostingTitleProper": { - "message": "Auto-hospedado" + "message": "Auto-hospedagem" }, "claim-domain-single-org-warning": { - "message": "Reivindicar um domínio ligará a política de organização única." + "message": "Reivindicar um domínio ativará a política de organização única." }, "single-org-revoked-user-warning": { "message": "Membros não conformes serão revogados. Os administradores podem restaurar os membros assim que saírem de todas as outras organizações." }, "deleteOrganizationUser": { - "message": "Excluir $NAME$", + "message": "Apagar $NAME$", "placeholders": { "name": { "content": "$1", @@ -11055,7 +11063,7 @@ } }, "deleteOrganizationUserWarningDesc": { - "message": "Isto irá excluir permanentemente todos os itens pertencentes a $NAME$. Os itens de coleção não são impactados.", + "message": "Isto apagará permanentemente todos os itens pertencentes a $NAME$. Os itens de conjuntos não são impactados.", "description": "Warning description for the delete organization user dialog", "placeholders": { "name": { @@ -11065,11 +11073,11 @@ } }, "deleteManyOrganizationUsersWarningDesc": { - "message": "Isto irá excluir permanentemente todos os itens pertencentes a $NAME$. Os itens de coleção não são impactados.", + "message": "Isso apagará permanentemente todos os itens pertencentes aos seguintes membros. Os itens de conjuntos não são impactados.", "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { - "message": "$NAME$ Excluído", + "message": "Apagou $NAME$", "placeholders": { "name": { "content": "$1", @@ -11078,10 +11086,10 @@ } }, "organizationUserDeletedDesc": { - "message": "O usuário foi removido da organização e todos os dados de usuários associados foram excluídos." + "message": "O usuário foi removido da organização e todos os dados de usuários associados foram apagados." }, "deletedUserIdEventMessage": { - "message": "Deleted user $ID$", + "message": "Apagou o usuário $ID$", "placeholders": { "id": { "content": "$1", @@ -11099,7 +11107,7 @@ } }, "suspendedOrganizationTitle": { - "message": "O $ORGANIZATION$ está suspenso", + "message": "A $ORGANIZATION$ está suspensa", "placeholders": { "organization": { "content": "$1", @@ -11114,31 +11122,31 @@ "message": "Para recuperar o acesso à sua organização, adicione um método de pagamento." }, "deleteMembers": { - "message": "Excluir membros" + "message": "Apagar membros" }, "noSelectedMembersApplicable": { "message": "Esta ação não se aplica a nenhum dos membros selecionados." }, "deletedSuccessfully": { - "message": "Excluído com sucesso" + "message": "Apagado com sucesso" }, "freeFamiliesSponsorship": { - "message": "Remova o patrocínio das famílias do Bitwarden" + "message": "Remover financiamento do Bitwarden Famílias grátis" }, "freeFamiliesSponsorshipPolicyDesc": { - "message": "Não permita que os membros resgatem um plano de Famílias por meio desta organização." + "message": "Não permita que os membros resgatem um plano do Famílias por meio desta organização." }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você será obrigado a verificar sua conta bancária. Nós faremos um micro-depósito nos próximos 1-2 dias úteis. Digite o código do descritor da instrução a partir deste depósito na página de faturamento da organização para verificar a conta bancária. A não verificação da conta bancária resultará em um pagamento não atendido e sua assinatura será suspensa." + "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você precisará verificar sua conta bancária. Faremos um micro-depósito nos próximos 1-2 dias úteis. Digite o código descritor do extrato deste depósito na página de faturamento da organização para verificar a conta bancária. A falha na verificação da conta bancária resultará em um pagamento atrasado e a sua assinatura será suspensa." }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "Fizemos um microdepósito em sua conta bancária (isso pode levar 1-2 dias úteis). Digite o código de seis dígitos começando com 'SM' encontrado na descrição de depósito. A não verificação da conta bancária resultará em um pagamento não atendido e sua assinatura será suspensa." + "message": "Fizemos um micro-depósito em sua conta bancária (isso pode levar 1-2 dias úteis). Digite o código de seis dígitos começando com 'SM' encontrado na descrição do depósito. A falha da verificação da conta bancária resultará em um pagamento atrasado, e a sua assinatura será suspensa." }, "descriptorCode": { - "message": "Código do descritor" + "message": "Código descritor" }, "cannotRemoveViewOnlyCollections": { - "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", + "message": "Você não pode remover conjuntos com permissões de Apenas ver: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -11147,7 +11155,7 @@ } }, "removeMembers": { - "message": "Remover membro?" + "message": "Remover membros" }, "devices": { "message": "Dispositivos" @@ -11168,16 +11176,16 @@ "message": "Recuperar domínio" }, "claimDomainNameInputHint": { - "message": "Exemplo: meudominio.com. Subdomínios requerem entradas separadas para serem reivindicadas." + "message": "Exemplo: meudominio.com. Subdomínios requerem entradas separadas para serem reivindicados." }, "automaticClaimedDomains": { - "message": "Domínios Reivindicados Automaticamente" + "message": "Domínios reivindicados automaticamente" }, "automaticDomainClaimProcess": { - "message": "O Bitwarden tentará reivindicar o domínio 3 vezes durante as primeiras 72 horas. Se o domínio não puder ser reivindicado, verifique o registro DNS no seu host e reivindique manualmente. O domínio será removido da sua organização em 7 dias, se não for reivindicado." + "message": "O Bitwarden tentará reivindicar o domínio 3 vezes durante as primeiras 72 horas. Se o domínio não poder ser reivindicado, confira o registro de DNS no seu servidor e reivindique manualmente. Se não for reivindicado, o domínio será removido da sua organização em 7 dias." }, "domainNotClaimed": { - "message": "$DOMAIN$ não reivindicado. Verifique seus registros DNS.", + "message": "$DOMAIN$ não reivindicado. Confira os seus registros de DNS.", "placeholders": { "DOMAIN": { "content": "$1", @@ -11192,10 +11200,10 @@ "message": "Em verificação" }, "claimedDomainsDescription": { - "message": "Claim a domain to own member accounts. The SSO identifier page will be skipped during login for members with claimed domains and administrators will be able to delete claimed accounts." + "message": "Reivindique um domínio para ser o proprietário das contas dos membros. A página do identificador do SSO será pulada durante a autenticação dos membros com os domínios reivindicados, e os administradores poderão apagar contas reivindicadas." }, "invalidDomainNameClaimMessage": { - "message": "Entrada não é um formato válido. Formato: meudominio.com. Subdomínios requerem entradas separadas para serem reivindicados." + "message": "A entrada não está em um formato válido. Formato: meudominio.com. Subdomínios requerem entradas separadas a serem reivindicadas." }, "domainClaimedEvent": { "message": "$DOMAIN$ reivindicado", @@ -11216,7 +11224,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "Se você remover $EMAIL$, o pagamento deste plano Família não poderá ser resgatado. Tem certeza que deseja continuar?", + "message": "Se você remover $EMAIL$, o pagamento deste plano familiar não poderá ser resgatado. Tem certeza que deseja continuar?", "placeholders": { "email": { "content": "$1", @@ -11225,7 +11233,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "Se remover $EMAIL$, o pagamento para este plano Família terminará e o método de pagamento salvo será cobrado por US$ 40 + imposto aplicável em $DATE$. Você não poderá resgatar um novo pagamento até $DATE$. Tem certeza que deseja continuar?", + "message": "Se remover $EMAIL$, o financiamento deste plano familiar terminará e o método de pagamento salvo será cobrado por 40$ USD + impostos aplicáveis em $DATE$. Você não poderá resgatar um novo financiamento até $DATE$. Tem certeza que deseja continuar?", "placeholders": { "email": { "content": "$1", @@ -11241,13 +11249,13 @@ "message": "Domínio reivindicado" }, "itemAddedToFavorites": { - "message": "Item added to favorites" + "message": "Item adicionado aos favoritos" }, "itemRemovedFromFavorites": { - "message": "Item removed from favorites" + "message": "Item removido dos favoritos" }, "copyNote": { - "message": "Copy note" + "message": "Copiar anotação" }, "organizationNameMaxLength": { "message": "O nome da organização não pode exceder 50 caracteres." @@ -11262,49 +11270,49 @@ "message": "Confiar e confirmar usuário" }, "trustOrganization": { - "message": "Organização de confiança" + "message": "Confiar na organização" }, "trust": { - "message": "Confiança" + "message": "Confiar" }, "doNotTrust": { "message": "Não confiar" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "Organização não é confiada" }, "emergencyAccessTrustWarning": { - "message": "Para a segurança de sua conta, só confirme se você concedeu acesso de emergência a este usuário e sua impressão digital corresponde ao que é exibido na conta dele" + "message": "Para a segurança da sua conta, apenas confirme que você permitiu o acesso de emergência a esse usuário e se a frase biométrica dele coincide com a que é exibida na conta deles" }, "orgTrustWarning": { - "message": "Para a segurança da sua conta, prossiga somente se você for um membro desta organização, tem a recuperação de conta ativada, e a impressão digital exibida abaixo corresponde à impressão digital da organização." + "message": "Para a segurança da sua conta, prossiga apenas se você for um membro dessa organização, tem a recuperação de conta ativa, e a frase biométrica exibida abaixo corresponde com a da organização." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Esta organização tem uma política empresarial que lhe inscreverá na recuperação de conta. A inscrição permitirá que os administradores da organização alterem sua senha. Prossiga somente se você reconhecer esta organização e se a frase biométrica exibida abaixo corresponde com a da organização." }, "trustUser": { "message": "Confiar no usuário" }, "sshKeyWrongPassword": { - "message": "A senha está incorreta." + "message": "A senha que você digitou está incorreta." }, "importSshKey": { "message": "Importar" }, "confirmSshKeyPassword": { - "message": "Confirme a senha" + "message": "Confirmar senha" }, "enterSshKeyPasswordDesc": { - "message": "Insira a senha da chave SSH." + "message": "Digite a senha da chave SSH." }, "enterSshKeyPassword": { - "message": "Insira a senha" + "message": "Digitar senha" }, "invalidSshKey": { "message": "A chave SSH é inválida" }, "sshKeyTypeUnsupported": { - "message": "O tipo de chave SSH não é compatível" + "message": "O tipo de chave SSH não é suportado" }, "importSshKeyFromClipboard": { "message": "Importar chave da área de transferência" @@ -11316,36 +11324,28 @@ "message": "Copiar chave privada" }, "openingExtension": { - "message": "Abrir a extensão do navegador Bitwarden" + "message": "Abrindo a extensão de navegador do Bitwarden" }, "somethingWentWrong": { - "message": "Ocorreu um problema..." + "message": "Algo deu errado..." }, "openingExtensionError": { - "message": "Tivemos problemas ao abrir a extensão Bitwarden. Clique no botão para abri-la agora." + "message": "Tivemos problemas ao abrir a extensão de navegador do Bitwarden. Clique no botão para abri-la agora." }, "openExtension": { "message": "Abrir extensão" }, "doNotHaveExtension": { - "message": "Não tem a extensão do Bitwarden?" + "message": "Não tem a extensão de navegador do Bitwarden?" }, "installExtension": { - "message": "Instalar a extensão" + "message": "Instalar extensão" }, "openedExtension": { - "message": "Abriu a extensão do navegador" + "message": "Extensão de navegador foi aberta" }, "openedExtensionViewAtRiskPasswords": { - "message": "A extensão do Bitwarden foi aberta com sucesso. Agora você pode rever suas senhas em risco." - }, - "openExtensionManuallyPart1": { - "message": "Tivemos problemas ao abrir a extensão Bitwarden. Abra o ícone do Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "da barra de ferramentas.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" + "message": "A extensão de navegador do Bitwarden foi aberta com sucesso. Agora você pode revisar suas senhas em risco." }, "resellerRenewalWarningMsg": { "message": "Sua assinatura será renovada em breve. Para garantir o serviço sem interrupções, entre em contato com $RESELLER$ para confirmar sua renovação antes de $RENEWAL_DATE$.", @@ -11361,7 +11361,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "Uma fatura para sua assinatura foi emitida em $ISSUED_DATE$. Para garantir o serviço ininterrupto, entre em contato com $RESELLER$ para confirmar a sua renovação antes de $DUE_DATE$.", + "message": "Uma fatura para sua assinatura foi emitida em $ISSUED_DATE$. Para garantir o serviço sem interrupções, entre em contato com $RESELLER$ para confirmar a sua renovação antes de $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -11378,7 +11378,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "A fatura da sua assinatura não foi paga. Para garantir o serviço ininterrupto, entre em contato com $RESELLER$ para confirmar sua renovação antes de $GRACE_PERIOD_END$.", + "message": "A fatura da sua assinatura não foi paga. Para garantir o serviço sem interrupções, entre em contato com $RESELLER$ para confirmar sua renovação antes de $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -11397,7 +11397,7 @@ "message": "Reinicie sua assinatura" }, "suspendedManagedOrgMessage": { - "message": "Entre em contato com $PROVIDER$ para assistência.", + "message": "Entre em contato com $PROVIDER$ para ter assistência.", "placeholders": { "provider": { "content": "$1", @@ -11406,16 +11406,16 @@ } }, "accountDeprovisioningNotification": { - "message": "Os administradores agora têm a capacidade de excluir contas de membros que pertencem a um domínio reivindicado." + "message": "Os administradores agora conseguem apagar contas de membros que pertencem a um domínio reivindicado." }, "deleteManagedUserWarningDesc": { - "message": "Esta ação irá excluir a conta de membro, incluindo todos os itens do seu cofre. Isso substitui a ação de Remover anterior." + "message": "Esta ação irá apagar a conta do membro, incluindo todos os itens do seu cofre. Isso substitui a ação anterior de Remover." }, "deleteManagedUserWarning": { - "message": "Excluir é uma nova ação!" + "message": "Apagar é uma nova ação!" }, "seatsRemaining": { - "message": "Você tem $REMAINING$ assentos restantes de $TOTAL$ atribuídos a essa organização. Entre em contato com seu provedor para gerenciar sua assinatura.", + "message": "Você tem $REMAINING$ vagas restantes das $TOTAL$ atribuídas para esta organização. Entre em contato com seu provedor para gerenciar sua assinatura.", "placeholders": { "remaining": { "content": "$1", @@ -11431,7 +11431,7 @@ "message": "Organização existente" }, "selectOrganizationProviderPortal": { - "message": "Selecione uma organização para adicionar ao seu Portal do Provedor." + "message": "Selecione uma organização para adicionar ao seu portal de provedor." }, "noOrganizations": { "message": "Não há organizações para listar" @@ -11452,10 +11452,10 @@ "message": "Organização existente adicionada" }, "assignedExceedsAvailable": { - "message": "Os assentos atribuídos excedem os disponíveis." + "message": "As vagas atribuídas excedem as disponíveis." }, "userkeyRotationDisclaimerEmergencyAccessText": { - "message": "Frase de impressão digital para contatos $NUM_USERS$ para os quais você ativou o acesso de emergência.", + "message": "A frase biométrica dos $NUM_USERS$ contatos para os quais você ativou o acesso de emergência.", "placeholders": { "num_users": { "content": "$1", @@ -11464,7 +11464,7 @@ } }, "userkeyRotationDisclaimerAccountRecoveryOrgsText": { - "message": "Frase de impressão digital para a organização $ORG_NAME$ para a qual você ativou a recuperação de conta.", + "message": "A frase biométrica da organização $ORG_NAME$ para a qual você ativou a recuperação de conta.", "placeholders": { "org_name": { "content": "$1", @@ -11473,95 +11473,95 @@ } }, "userkeyRotationDisclaimerDescription": { - "message": "Girar suas chaves de criptografia exigirá que você confie nas chaves de qualquer organização que possa recuperar sua conta, e quaisquer contatos que você ativou o acesso de emergência. Para continuar, certifique-se de que pode verificar o seguinte:" + "message": "Rotacionar suas chaves de criptografia exigirá que você confie nas chaves de quaisquer organizações que possam recuperar sua conta, e quaisquer contatos que você ativou o acesso de emergência. Para continuar, certifique-se de que pode verificar o seguinte:" }, "userkeyRotationDisclaimerTitle": { - "message": "Chaves criptográficas não confiáveis" + "message": "Chaves criptográficas não confiadas" }, "changeAtRiskPassword": { - "message": "Alterar senhas vulneráveis" + "message": "Alterar senhas em risco" }, "changeAtRiskPasswordAndAddWebsite": { - "message": "This login is at-risk and missing a website. Add a website and change the password for stronger security." + "message": "Esta credencial está em risco e está sem um site. Adicione um site e altere a senha para segurança melhor." }, "missingWebsite": { - "message": "Missing website" + "message": "Site ausente" }, "removeUnlockWithPinPolicyTitle": { - "message": "Remover desbloqueio com o PIN" + "message": "Remover desbloqueio com PIN" }, "removeUnlockWithPinPolicyDesc": { - "message": "Não permitir que os membros desbloqueiem sua conta com um PIN." + "message": "Não permita que os membros desbloqueiem sua conta com um PIN." }, "upgradeForFullEventsMessage": { - "message": "Event logs are not stored for your organization. Upgrade to a Teams or Enterprise plan to get full access to organization event logs." + "message": "O registro de eventos não é armazenado para a sua organização. Faça upgrade para um plano Equipes ou Empresarial para ter acesso completo ao registro de eventos da organização." }, "upgradeEventLogTitleMessage": { - "message": "Upgrade to see event logs from your organization." + "message": "Faça upgrade para ver o registro de eventos da sua organização." }, "upgradeEventLogMessage": { "message": "Esses eventos são apenas exemplos e não refletem eventos reais na sua organização do Bitwarden." }, "viewEvents": { - "message": "View Events" + "message": "Ver eventos" }, "cannotCreateCollection": { - "message": "Organizações gratuitas podem ter até duas coleções. Faça o upgrade para um plano pago para adicionar mais coleções." + "message": "Organizações gratuitas podem ter até dois conjuntos. Faça upgrade para um plano pago para adicionar mais conjuntos." }, "searchArchive": { - "message": "Search archive" + "message": "Buscar no arquivo" }, "archiveNoun": { - "message": "Archive", + "message": "Arquivo", "description": "Noun" }, "archiveVerb": { - "message": "Archive", + "message": "Arquivar", "description": "Verb" }, "unArchive": { - "message": "Unarchive" + "message": "Desarquivar" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Itens no arquivo" }, "noItemsInArchive": { - "message": "No items in archive" + "message": "Nenhum item no arquivo" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Os itens arquivados aparecerão aqui e serão excluídos dos resultados gerais de busca e das sugestões de preenchimento automático." }, "itemWasSentToArchive": { - "message": "Item was sent to archive" + "message": "O item foi enviado para o arquivo" }, "itemsWereSentToArchive": { - "message": "Items were sent to archive" + "message": "Itens foram enviados para o arquivo" }, "itemUnarchived": { - "message": "Item was unarchived" + "message": "O item foi desarquivado" }, "bulkArchiveItems": { - "message": "Items archived" + "message": "Itens arquivados" }, "bulkUnarchiveItems": { - "message": "Items unarchived" + "message": "Itens desarquivados" }, "archiveItem": { - "message": "Archive item", + "message": "Arquivar item", "description": "Verb" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Itens arquivados são excluídos dos resultados gerais de busca e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar este item?" }, "archiveBulkItems": { - "message": "Archive items", + "message": "Arquivar itens", "description": "Verb" }, "archiveBulkItemsConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + "message": "Itens arquivados são excluídos dos resultados gerais de busca e das sugestões de preenchimento automático. Tem certeza de que deseja arquivar esses itens?" }, "businessUnit": { - "message": "Unidades de Negócio" + "message": "Unidade de négocio" }, "businessUnits": { "message": "Unidades de Negócio" @@ -11570,141 +11570,146 @@ "message": "Nova unidade de negócio" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Envie informações sensíveis com segurança", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Compartilhe dados e arquivos com segurança com qualquer pessoa, em qualquer plataforma. Suas informações permanecerão criptografadas de ponta a ponta, limitando a exposição.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Crie senhas de forma rápida" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Crie senhas únicas e fortes com facilidade clicando em", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "para ajudá-lo a manter suas credenciais seguras.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Crie senhas únicas e fortes com facilidade clicando no botão de gerar senha para ajudá-lo a manter suas credenciais seguras.", "description": "Aria label for the body content of the generator nudge" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Economize tempo com o preenchimento automático" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Inclua um", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Site", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "para que esta credencial apareça como uma sugestão de preenchimento automático.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Pagamento on-line simplificado" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Preencha automaticamente formulários de pagamento com cartões de forma segura e precisa." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Simplifique a criação de contas" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Com identidades, preencha formulários de cadastro ou contato longos rapidamente, de forma automática." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Mantenha seus dados sensíveis seguros" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Com anotações, armazene com segurança dados sensíveis como detalhes de informações bancárias ou de seguro." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Acesso SSH amigável para desenvolvedores" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Armazene suas chaves e conecte com o agente SSH para uma autenticação rápida e criptografada.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Saiba mais sobre o agente SSH", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "setupExtensionPageTitle": { - "message": "Autofill your passwords securely with one click" + "message": "Autopreencha com segurança as suas senhas com um clique" }, "setupExtensionPageDescription": { - "message": "Get the Bitwarden browser extension and start autofilling today" + "message": "Baixe a extensão de navegador do Bitwarden e use o preenchimento automático hoje" }, "getTheExtension": { - "message": "Get the extension" + "message": "Baixar extensão" }, "addItLater": { - "message": "Add it later" + "message": "Adicionar mais tarde" }, "cannotAutofillPasswordsWithoutExtensionTitle": { - "message": "You can't autofill passwords without the browser extension" + "message": "Você não pode preencher senhas automaticamente sem a extensão de navegador" }, "cannotAutofillPasswordsWithoutExtensionDesc": { - "message": "Are you sure you don't want to add the extension now?" + "message": "Você tem certeza de que não quer adicionar a extensão agora?" }, "skipToWebApp": { - "message": "Skip to web app" + "message": "Ir para o aplicativo web" }, "bitwardenExtensionInstalled": { - "message": "Bitwarden extension installed!" + "message": "Extensão do Bitwarden instalada!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "A extensão do Bitwarden está instalada!" }, "openExtensionToAutofill": { - "message": "Open the extension to log in and start autofilling." + "message": "Abra a extensão, se conecte, e comece a usar o preenchimento automático." }, "openBitwardenExtension": { - "message": "Open Bitwarden extension" + "message": "Abrir extensão do Bitwarden" }, "gettingStartedWithBitwardenPart1": { - "message": "For tips on getting started with Bitwarden visit the", + "message": "Para dicas em começar a usar o Bitwarden, visite o", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "gettingStartedWithBitwardenPart2": { - "message": "Learning Center", + "message": "Centro de Aprendizagem", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Se a extensão não abrir, você pode precisar abrir o Bitwarden pelo ícone ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " na barra de ferramentas.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { - "message": "Help Center", + "message": "Central de Ajuda", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "setupExtensionContentAlt": { - "message": "With the Bitwarden browser extension you can easily create new logins, access your saved logins directly from your browser toolbar, and sign in to accounts quickly using Bitwarden autofill." + "message": "Com a extensão de navegador do Bitwarden, você pode criar credenciais, acessar suas credenciais salvas diretamente pela barra do seu navegador, e se conectar a contas rapidamente usando o preenchimento automático do Bitwarden." }, "restart": { - "message": "Restart" + "message": "Reiniciar" }, "verifyProviderBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the provider's subscription page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você precisará verificar sua conta bancária. Faremos um micro-depósito nos próximos 1-2 dias úteis. Digite o código descritor do extrato deste depósito na página de assinatura do provedor para verificar a conta bancária. A falha na verificação da conta bancária resultará em um pagamento atrasado e a sua assinatura será suspensa." }, "clickPayWithPayPal": { - "message": "Please click the Pay with PayPal button to add your payment method." + "message": "Clique no botão de Pagar com PayPal para adicionar seu método de pagamento." }, "revokeActiveSponsorshipConfirmation": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end. A seat within your organization will become available for members or sponsorships after the sponsored organization renewal date on $DATE$.", + "message": "Se remover $EMAIL$, o financiamento deste plano familiar terminará. Uma vaga na sua organização ficará disponível para membros ou financiamentos após a data de renovação da organização financiada em $DATE$.", "placeholders": { "email": { "content": "$1", @@ -11717,56 +11722,56 @@ } }, "billingAddressRequiredToAddCredit": { - "message": "Billing address required to add credit.", + "message": "O endereço de cobrança é necessário para adicionar créditos.", "description": "Error message shown when trying to add credit to a trialing organization without a billing address." }, "aboutThisSetting": { - "message": "About this setting" + "message": "Sobre esta configuração" }, "permitCipherDetailsDescription": { - "message": "Bitwarden will use saved login URIs to identify which icon or change password URL should be used to improve your experience. No information is collected or saved when you use this service." + "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de alteração de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." }, "billingAddress": { - "message": "Billing address" + "message": "Endereço de cobrança" }, "addBillingAddress": { - "message": "Add billing address" + "message": "Adicionar endereço de cobrança" }, "editBillingAddress": { - "message": "Edit billing address" + "message": "Editar endereço de cobrança" }, "noBillingAddress": { - "message": "No address on file." + "message": "Nenhum endereço cadastrado." }, "billingAddressUpdated": { - "message": "Your billing address has been updated." + "message": "Seu endereço de cobrança foi atualizado." }, "paymentDetails": { - "message": "Payment details" + "message": "Detalhes de pagamento" }, "paymentMethodUpdated": { - "message": "Your payment method has been updated." + "message": "Seu método de pagamento foi atualizado." }, "bankAccountVerified": { - "message": "Your bank account has been verified." + "message": "Sua conta bancária foi verificada." }, "availableCreditAppliedToInvoice": { - "message": "Any available credit will be automatically applied towards invoices generated for this account." + "message": "Qualquer crédito disponível será automaticamente aplicado em faturas geradas para esta conta." }, "mustBePositiveNumber": { - "message": "Must be a positive number" + "message": "Deve ser um número positivo" }, "cardSecurityCode": { - "message": "Card security code" + "message": "Código de segurança do cartão" }, "cardSecurityCodeDescription": { - "message": "Card security code, also known as CVV or CVC, is typically a 3 digit number printed on the back of your credit card or 4 digit number printed on the front above your card number." + "message": "O código de segurança do cartão, também conhecido como CVV ou CVC, normalmente é um número de 3 dígitos impresso no verso do seu cartão de crédito ou um número de 4 dígitos impresso na frente acima do número do seu cartão." }, "verifyBankAccountWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the Payment Details page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você precisará verificar sua conta bancária. Faremos um micro-depósito nos próximos 1-2 dias úteis. Digite o código descritor do extrato deste depósito na página de detalhes de pagamento para verificar a conta bancária. A falha na verificação da conta bancária resultará em um pagamento atrasado e a sua assinatura será suspensa." }, "taxId": { - "message": "Tax ID: $TAX_ID$", + "message": "ID de imposto (Tax ID): $TAX_ID$", "placeholders": { "tax_id": { "content": "$1", @@ -11775,14 +11780,14 @@ } }, "unpaidInvoices": { - "message": "Unpaid invoices" + "message": "Faturas não pagas" }, "unpaidInvoicesForServiceUser": { - "message": "Your subscription has not been paid. Contact your provider administrator to restore service to you and your clients.", + "message": "Sua assinatura não foi paga. Contate o administrador do seu provedor para restaurar o serviço a você e aos seus clientes.", "description": "A message shown in a non-dismissible dialog to service users of unpaid providers." }, "providerSuspended": { - "message": "$PROVIDER$ is suspended", + "message": "$PROVIDER$ está suspenso", "placeholders": { "provider": { "content": "$1", @@ -11791,11 +11796,11 @@ } }, "restoreProviderPortalAccessViaCustomerSupport": { - "message": "To restore access to your provider portal, contact Bitwarden Customer Support to renew your subscription.", + "message": "Para restaurar o acesso ao portal do seu provedor, contacte o suporte ao cliente do Bitwarden para renovar sua assinatura.", "description": "A message shown in a non-dismissible dialog to any user of a suspended providers." }, "restoreProviderPortalAccessViaPaymentMethod": { - "message": "Your subscription has not been paid. To restore service to you and your clients, add a payment method by $CANCELLATION_DATE$.", + "message": "Sua assinatura não foi paga. Para restaurar o serviço a você e aos seus clientes, adicione um método de pagamento até $CANCELLATION_DATE$.", "placeholders": { "cancellation_date": { "content": "$1", @@ -11805,7 +11810,7 @@ "description": "A message shown in a non-dismissible dialog to admins of unpaid providers." }, "subscribetoEnterprise": { - "message": "Subscribe to $PLAN$", + "message": "Assinar o $PLAN$", "placeholders": { "plan": { "content": "$1", @@ -11814,7 +11819,7 @@ } }, "subscribeEnterpriseSubtitle": { - "message": "Your 7-day $PLAN$ trial starts today. Add a payment method now to continue using these features after your trial ends: ", + "message": "O seu teste grátis de 7 dias do $PLAN$ começa hoje. Adicione um método de pagamento agora para continuar usando esses recursos quando o teste terminar: ", "placeholders": { "plan": { "content": "$1", @@ -11823,13 +11828,13 @@ } }, "unlimitedSecretsAndProjects": { - "message": "Unlimited secrets and projects" + "message": "Segredos e projetos ilimitados" }, "providersubscriptionCanceled": { - "message": "Subscription canceled" + "message": "Assinatura cancelada" }, "providersubCanceledmessage": { - "message": "To resubscribe, contact Bitwarden Customer Support." + "message": "Para assinar novamente, entre em contato com o suporte ao cliente do Bitwarden." }, "showMore": { "message": "Mostrar mais" @@ -11838,44 +11843,44 @@ "message": "Mostrar menos" }, "missingTaxId": { - "message": "Missing Tax ID" + "message": "ID de imposto (Tax ID) ausente" }, "missingTaxIdWarning": { - "message": "Action required: You're missing a Tax ID number in payment details. If a Tax ID is not added, your invoices may include additional tax." + "message": "Ação necessária: está faltando o número do ID de imposto (Tax ID) nos detalhes de pagamento. Se um ID de imposto não for adicionado, suas faturas podem incluir impostos adicionais." }, "moreBreadcrumbs": { - "message": "More breadcrumbs", + "message": "Mais trilhas", "description": "This is used in the context of a breadcrumb navigation, indicating that there are more items in the breadcrumb trail that are not currently displayed." }, "addTaxId": { - "message": "Add a Tax ID" + "message": "Adicione um ID de imposto" }, "missingTaxIdCalloutTitle": { - "message": "Action required: Missing Tax ID" + "message": "Ação necessária: ID de imposto ausente" }, "missingTaxIdCalloutDescription": { - "message": "If a Tax ID is not added, your invoices may include additional tax." + "message": "Se um ID de imposto não for adicionado, as suas faturas podem incluir impostos adicionais." }, "unverifiedTaxIdWarning": { - "message": "Action required: Your Tax ID number is unverified. If your Tax ID is left unverified, your invoices may include additional tax." + "message": "Ação necessária: O número do seu ID de imposto não foi verificado. Se o seu ID de imposto não for verificado, as suas faturas podem incluir impostos adicionais." }, "editTaxId": { - "message": "Edit your Tax ID" + "message": "Edite seu ID de imposto" }, "unverifiedTaxIdCalloutTitle": { - "message": "Tax ID unverified" + "message": "ID de imposto não verificado" }, "unverifiedTaxIdCalloutDescription": { - "message": "Check your Tax ID to verify the format is correct and there are no typos." + "message": "Confira o seu ID de imposto para verificar se o formato está correto e não há erros de digitação." }, "pendingVerification": { - "message": "Pending verification" + "message": "Verificação pendente" }, "checkInputFormat": { - "message": "Check input format for typos." + "message": "Confira o formato de entrada por erros de digitação." }, "exampleTaxIdFormat": { - "message": "Example $CODE$ format: $EXAMPLE$", + "message": "Exemplo do formato de $CODE$: $EXAMPLE$", "placeholders": { "code": { "content": "$1", @@ -11888,46 +11893,46 @@ } }, "confirmKeyConnectorDomain": { - "message": "Confirm Key Connector domain" + "message": "Confirmar domínio do Key Connector" }, "requiredToVerifyBankAccountWithStripe": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "O pagamento com uma conta bancária só está disponível para clientes nos Estados Unidos. Você precisará verificar sua conta bancária. Faremos um micro-depósito nos próximos 1-2 dias úteis. A falha na verificação da conta bancária resultará em um pagamento atrasado e a sua assinatura será suspensa." }, "verifyBankAccountWithStripe": { - "message": "We have made a micro-deposit to your bank account. This may take 1-2 business days. When you see the deposit in your account, you can verify your bank account. Failure to verify your bank account will result in a missed payment and your subscription will be suspended." + "message": "Fizemos um micro-depósito em sua conta bancária. Isso pode levar 1-2 dias úteis. Quando ver o depósito na sua conta, você poderá verificar a sua conta bancária. A falha da verificação da conta bancária resultará em um pagamento atrasado, e a sua assinatura será suspensa." }, "verifyNow": { - "message": "Verify now." + "message": "Verifique agora." }, "additionalStorageGB": { - "message": "Additional storage GB" + "message": "GB de armazenamento adicional" }, "additionalServiceAccountsV2": { - "message": "Additional machine accounts" + "message": "Contas de máquina adicionais" }, "secretsManagerSeats": { - "message": "Secrets Manager seats" + "message": "Vagas do Gerenciador de Segredos" }, "additionalStorage": { - "message": "Additional Storage" + "message": "Armazenamento adicional" }, "expandPurchaseDetails": { - "message": "Expand purchase details" + "message": "Expandir detalhes da compra" }, "collapsePurchaseDetails": { - "message": "Collapse purchase details" + "message": "Recolher detalhes da compra" }, "familiesMembership": { - "message": "Families membership" + "message": "Assinatura do Famílias" }, "planDescPremium": { - "message": "Complete online security" + "message": "Segurança on-line completa" }, "planDescFamiliesV2": { - "message": "Premium security for your family" + "message": "Segurança Premium para a sua família" }, "planDescFreeV2": { - "message": "Share with $COUNT$ other user", + "message": "Compartilhe com $COUNT$ usuário(s)", "placeholders": { "count": { "content": "$1", @@ -11936,37 +11941,37 @@ } }, "planDescEnterpriseV2": { - "message": "Advanced capabilities for any organization" + "message": "Capacidades avançadas para qualquer organização" }, "planNameCustom": { - "message": "Custom plan" + "message": "Plano personalizado" }, "planDescCustom": { - "message": "Bitwarden scales with businesses of all sizes to secure passwords and sensitive information. If you're part of a large enterprise, contact sales to request a quote." + "message": "O Bitwarden escala com empresas de todos os tamanos para proteger senhas e informações sensíveis. Se faz parte de uma grande empresa, entre em contato com o setor financeiro para solicitar um orçamento." }, "builtInAuthenticator": { - "message": "Built-in authenticator" + "message": "Autenticador integrado" }, "breachMonitoring": { - "message": "Breach monitoring" + "message": "Monitoramento de vazamentos" }, "andMoreFeatures": { - "message": "And more!" + "message": "E mais!" }, "secureFileStorage": { - "message": "Secure file storage" + "message": "Armazenamento seguro de arquivos" }, "familiesUnlimitedSharing": { - "message": "Unlimited sharing - choose who sees what" + "message": "Compartilhamento ilimitado - escolha quem vê o quê" }, "familiesUnlimitedCollections": { - "message": "Unlimited family collections" + "message": "Conjuntos familiares ilimitados" }, "familiesSharedStorage": { - "message": "Shared storage for important family info" + "message": "Armazenamento compartilhado para informações importantes da família" }, "limitedUsersV2": { - "message": "Up to $COUNT$ members", + "message": "Até $COUNT$ membros", "placeholders": { "count": { "content": "$1", @@ -11975,7 +11980,7 @@ } }, "limitedCollectionsV2": { - "message": "Up to $COUNT$ collections", + "message": "Até $COUNT$ conjuntos", "placeholders": { "count": { "content": "$1", @@ -11984,13 +11989,13 @@ } }, "alwaysFree": { - "message": "Always free" + "message": "Grátis para sempre" }, "twoSecretsIncluded": { - "message": "2 secrets" + "message": "2 segredos" }, "projectsIncludedV2": { - "message": "$COUNT$ project(s)", + "message": "$COUNT$ projeto(s)", "placeholders": { "count": { "content": "$1", @@ -11999,13 +12004,13 @@ } }, "secureItemSharing": { - "message": "Secure item sharing" + "message": "Compartilhamento seguro de itens" }, "scimSupport": { - "message": "SCIM support" + "message": "Suporte a SCIM" }, "includedMachineAccountsV2": { - "message": "$COUNT$ machine accounts", + "message": "$COUNT$ contas de máquina", "placeholders": { "count": { "content": "$1", @@ -12014,142 +12019,142 @@ } }, "enterpriseSecurityPolicies": { - "message": "Enterprise security policies" + "message": "Políticas empresariais de segurança" }, "selfHostOption": { - "message": "Self-host option" + "message": "Opção auto-hospedada" }, "complimentaryFamiliesPlan": { - "message": "Complimentary families plan for all users" + "message": "Plano de cortesia para famílias de todos os usuários" }, "strengthenCybersecurity": { - "message": "Strengthen cybersecurity" + "message": "Fortaleça a cibersegurança" }, "boostProductivity": { - "message": "Boost productivity" + "message": "Aumente a produtividade" }, "seamlessIntegration": { - "message": "Seamless integration" + "message": "Integração harmoniosa" }, "families": { - "message": "Families" + "message": "Famílias" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Fazer upgrade para o Famílias" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Fazer upgrade para o Premium" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Você fez upgrade para o Famílias!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Houve um erro ao calcular o imposto para a sua localização. Tente novamente." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Boas-vindas ao Bitwarden" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Desbloqueie mais recursos de segurança com o Premium, ou comece a compartilhar itens com o Famílias" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Os preços excluem os impostos e são cobrados anualmente." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "O nome da sua organização aparecerá nos convites que você enviar para os membros." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Continuar sem fazer upgrade" }, "upgradeYourPlan": { - "message": "Upgrade your plan" + "message": "Faça upgrade do seu plano" }, "upgradeNow": { - "message": "Upgrade now" + "message": "Fazer upgrade agora" }, "formWillCreateNewFamiliesOrgMessage": { - "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + "message": "Completar este formulário criará uma organização do Famílias. Você pode fazer upgrade da sua organização grátis pelo painel de administração." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Encontramos um erro ao processar seu upgrade. Tente novamente." }, "bitwardenFreeplanMessage": { - "message": "You have the Bitwarden Free plan" + "message": "Você tem o plano grátis do Bitwarden" }, "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "message": "Faça upgrade para segurança completa" }, "viewbusinessplans": { - "message": "View business plans" + "message": "Ver planos empresariais" }, "updateEncryptionSettings": { - "message": "Update encryption settings" + "message": "Atualizar configurações de criptografia" }, "updateYourEncryptionSettings": { - "message": "Update your encryption settings" + "message": "Atualize suas configurações de criptografia" }, "updateSettings": { - "message": "Update settings" + "message": "Atualizar configurações" }, "algorithm": { - "message": "Algorithm" + "message": "Algoritmo" }, "encryptionKeySettingsHowShouldWeEncryptYourData": { - "message": "Choose how Bitwarden should encrypt your vault data. All options are secure, but stronger methods offer better protection - especially against brute-force attacks. Bitwarden recommends the default setting for most users." + "message": "Escolha como que o Bitwarden deve criptografar os dados do seu cofre. Todas as opções são seguras, mas métodos mais fortes oferecem proteção melhor - especialmente contra ataques de força bruta. O Bitwarden recomenda a pré-configuração para a maioria dos usuários." }, "encryptionKeySettingsIncreaseImproveSecurity": { - "message": "Increasing the values above the default will improve security, but your vault may take longer to unlock as a result." + "message": "Aumentar os valores acima do padrão melhorará a segurança, mas como resultado, o seu cofre pode demorar mais tempo para ser desbloqueado." }, "encryptionKeySettingsAlgorithmPopoverTitle": { - "message": "About encryption algorithms" + "message": "Sobre algoritmos de criptografia" }, "encryptionKeySettingsAlgorithmPopoverPBKDF2": { - "message": "PBKDF2-SHA256 is a well-tested encryption method that balances security and performance. Good for all users." + "message": "O PBKDF2-SHA256 é um método de criptografia bem testado que equilibra a segurança e o desempenho. Bom para todos os usuários." }, "encryptionKeySettingsAlgorithmPopoverArgon2Id": { - "message": "Argon2id offers stronger protection against modern attacks. Best for advanced users with powerful devices." + "message": "O Argon2id oferece uma proteção mais forte contra ataques modernos. É melhor para usuários avançados com dispositivos robustos." }, "zipPostalCodeLabel": { - "message": "ZIP / Postal code" + "message": "CEP / Código postal" }, "cardNumberLabel": { - "message": "Card number" + "message": "Número do cartão" }, "startFreeFamiliesTrial": { - "message": "Start free Families trial" + "message": "Iniciar teste grátis do Famílias" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Bloquear criação de conta para domínios reivindicados" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Impeça que os usuários criem contas fora da sua organização usando endereços de e-mail de domínios reivindicados." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Um domínio deve ser reivindicado antes de ativar esta política." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Configure um método de desbloqueio para alterar a ação do tempo limite do cofre." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Os requisitos de política empresarial foram aplicados às suas opções de tempo limite" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Ao usar o \"Nunca\", a chave de criptografia do seu cofre é armazenada no seu dispositivo. Se você usar esta opção, deve garantir que mantém seu dispositivo devidamente protegido." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Ação do tempo limite" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Tempo limite da sessão" }, "appearance": { - "message": "Appearance" + "message": "Aparência" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "O tempo limite excede a restrição configurada pela sua organização: máximo de $HOURS$ hora(s) e $MINUTES$ minuto(s)", "placeholders": { "hours": { "content": "$1", @@ -12162,9 +12167,12 @@ } }, "confirmNoSelectedCriticalApplicationsTitle": { - "message": "No critical applications are selected" + "message": "Nenhum aplicativo crítico foi selecionado" }, "confirmNoSelectedCriticalApplicationsDesc": { - "message": "Are you sure you want to continue?" + "message": "Tem certeza que deseja continuar?" + }, + "userVerificationFailed": { + "message": "Falha na verificação do usuário." } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 4e240bafc19..2227710d093 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -3050,7 +3050,7 @@ "message": "O crédito da sua conta pode ser utilizado para efetuar compras. Qualquer crédito disponível será automaticamente aplicado às faturas geradas para esta conta." }, "goPremium": { - "message": "Tornar-se Premium", + "message": "Torne-se Premium", "description": "Another way of saying \"Get a Premium membership\"" }, "premiumUpdated": { @@ -9820,6 +9820,14 @@ "message": "Demasiado caro", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "A passar para o plano gratuito", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "A passar para uma organização gratuita", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratuito durante 1 ano" }, @@ -10766,7 +10774,7 @@ "message": "Saiba mais sobre as iterações do KDF" }, "learnMoreAboutLocalization": { - "message": "Saiba mais sobre a localização" + "message": "Saiba mais sobre a tradução" }, "learnMoreAboutWebsiteIcons": { "message": "Saiba mais sobre a utilização de ícones de sites" @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Abriu com sucesso a extensão de navegador Bitwarden. Pode agora rever as suas palavras-passe em risco." }, - "openExtensionManuallyPart1": { - "message": "Tivemos problemas ao abrir a extensão de navegador Bitwarden. Abra o ícone do Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "da barra de ferramentas.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "A sua subscrição será renovada em breve. Para garantir um serviço ininterrupto, contacte a $RESELLER$ para confirmar a sua renovação antes de $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Extensão Bitwarden instalada!" }, - "openTheBitwardenExtension": { - "message": "Abrir a extensão Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "A extensão Bitwarden está instalada! Abra a extensão para iniciar sessão e começar o preenchimento automático." + "bitwardenExtensionIsInstalled": { + "message": "A extensão Bitwarden está instalada!" }, "openExtensionToAutofill": { "message": "Abra a extensão para iniciar sessão e começar o preenchimento automático." @@ -11687,6 +11684,14 @@ "message": "Centro de aprendizagem", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Se a extensão não tiver sido aberta, poderá ter de abrir o Bitwarden através do ícone ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " na barra de ferramentas.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Centro de ajuda", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Tem a certeza de que deseja continuar?" + }, + "userVerificationFailed": { + "message": "Falha na verificação do utilizador." } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 5b03a1b7440..c3c2b7d9c4b 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index f2b9856e97a..c1b2e3f1dc1 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -9820,6 +9820,14 @@ "message": "Слишком дорого", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Переход на бесплатный план", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Переключение на бесплатную организацию", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Бесплатно на 1 год" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Расширение для браузера Bitwarden успешно открыто. Теперь вы можете просмотреть свои пароли, подверженные риску." }, - "openExtensionManuallyPart1": { - "message": "У нас возникли проблемы с открытием расширения для браузера Bitwarden. Нажмите на значок Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "на панели инструментов.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Ваша подписка скоро будет продлена. Чтобы обеспечить непрерывность сервиса, свяжитесь с $RESELLER$ для подтверждения продления до $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Расширение Bitwarden установлено!" }, - "openTheBitwardenExtension": { - "message": "Открыть расширение Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Расширение Bitwarden установлено! Откройте расширение, чтобы авторизоваться и начать автозаполнение." + "bitwardenExtensionIsInstalled": { + "message": "Расширение Bitwarden установлено!" }, "openExtensionToAutofill": { "message": "Откройте расширение, чтобы авторизоваться и начать использовать автозаполнение." @@ -11687,6 +11684,14 @@ "message": "База знаний", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Если расширение не открылось, возможно, вам потребуется открыть Bitwarden с помощью значка ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " на панели инструментов.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Центр поддержки", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Вы действительно хотите продолжить?" + }, + "userVerificationFailed": { + "message": "Проверка пользователя не удалась." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 65838aec607..03f68be3c03 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 933a3494404..3e19422e07e 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Rozšírenie pre prehliadač Bitwarden úspešne otvorené. Teraz môžete skontrolovať vaše ohrozene heslá." }, - "openExtensionManuallyPart1": { - "message": "Mali sme problém otvoriť Bitwarden rozšírenie pre prehliadač. Otvorte ikonu Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "na paneli nástrojov.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Vaše predplatné sa čoskoro obnoví. Aby ste si zabezpečili nepretržitú prevádzku, kontaktujte $RESELLER$ a potvrďte obnovenie pred $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Rozšírenie Bitwarden nainštalované!" }, - "openTheBitwardenExtension": { - "message": "Otvoriť rozšírenie Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Rozšírenie Bitwarden je nainštalované! Otvorte rozšírenie, prihláste sa a začnite automaticky vypĺňať." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Otvorte rozšírenie, prihláste sa a začnite automatické vypĺňanie." @@ -11687,6 +11684,14 @@ "message": "Vzdelávacie centrum", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Centrum pomoci", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Ste si istí, že chcete pokračovať?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index b1d5da3db34..09a882fe7e5 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 9052035c174..367d4ddbace 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json index c7dd63b5805..aea5a1d9733 100644 --- a/apps/web/src/locales/sr_CY/messages.json +++ b/apps/web/src/locales/sr_CY/messages.json @@ -9820,6 +9820,14 @@ "message": "Превише скупо", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Бесплатно 1 годину" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Успешно је отворен додатак. Сада можете да прегледате своје ризичне лозинке." }, - "openExtensionManuallyPart1": { - "message": "Имали смо проблема са отварањем додатка. Отворите Bitwarden иконицу", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "са алатне траке.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Ваша претплата ће ускоро бити обновљена. Да бисте обезбедили непрекинуто пружање услуге, контактирајте $RESELLER$ ради потврде обновљења пре $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden екстензија инсталираана!" }, - "openTheBitwardenExtension": { - "message": "Отворити Bitwarden екстензију" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Отворите екстензију да бисте се пријавили и започели ауто-попуњавање." @@ -11687,6 +11684,14 @@ "message": "Центар за учење", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Центар за помоћ", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index a90524b95bc..6432029d219 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -9820,6 +9820,14 @@ "message": "För dyrt", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Växlar till kostnadsfri plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Växlar till kostnadsfri organisation", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Gratis i 1 år" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Framgångsrikt öppnat webbläsartillägget Bitwarden. Du kan nu granska dina risklösenord." }, - "openExtensionManuallyPart1": { - "message": "Vi hade problem med att öppna webbläsartillägget Bitwarden. Öppna Bitwarden-ikonen", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "från verktygsfältet.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Din prenumeration kommer snart att förnyas. För att säkerställa oavbruten service, kontakta $RESELLER$ för att bekräfta din förnyelse före $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden-tillägg installerat!" }, - "openTheBitwardenExtension": { - "message": "Öppna Bitwarden-tillägget" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Bitwarden-tillägget är installerat! Öppna tillägget för att logga in och starta autofyllning." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden-tillägget är installerat!" }, "openExtensionToAutofill": { "message": "Öppna tillägget för att logga in och starta autofyllning." @@ -11687,6 +11684,14 @@ "message": "Lärcentrum", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Om tillägget inte öppnades kan du behöva öppna Bitwarden från ikonen ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " på verktygsfältet.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Hjälpcenter", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Är du säker på att du vill fortsätta?" + }, + "userVerificationFailed": { + "message": "Verifiering av användare misslyckades." } } diff --git a/apps/web/src/locales/ta/messages.json b/apps/web/src/locales/ta/messages.json index eabda4c7611..d6154ae9fcb 100644 --- a/apps/web/src/locales/ta/messages.json +++ b/apps/web/src/locales/ta/messages.json @@ -9820,6 +9820,14 @@ "message": "மிகவும் விலை உயர்ந்தது", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "1 வருடத்திற்கு இலவசம்" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Bitwarden உலாவி நீட்டிப்பு வெற்றிகரமாக திறக்கப்பட்டது. உங்கள் ஆபத்தில் உள்ள கடவுச்சொற்களை இப்போது நீங்கள் மதிப்பாய்வு செய்யலாம்." }, - "openExtensionManuallyPart1": { - "message": "Bitwarden உலாவி நீட்டிப்பைத் திறப்பதில் எங்களுக்குச் சிக்கல் ஏற்பட்டது. Bitwarden ஐகானைத் திறக்கவும்", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "பணிப்பட்டி யிலிருந்து.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "உங்கள் சந்தா விரைவில் புதுப்பிக்கப்படும். தடையற்ற சேவையை உறுதிப்படுத்த, $RENEWAL_DATE$-க்கு முன் உங்கள் புதுப்பித்தலை உறுதிப்படுத்த $RESELLER$-ஐத் தொடர்பு கொள்ளவும்.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden நீட்டிப்பு நிறுவப்பட்டது!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "உள்நுழைந்து தானாக நிரப்பத் தொடங்க நீட்டிப்பைத் திறக்கவும்." @@ -11687,6 +11684,14 @@ "message": "கற்றல் மையம்", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "உதவி மையம்", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index b23e2e3cbac..0d08d207748 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index bcaada3bea5..fca56729464 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -9820,6 +9820,14 @@ "message": "Too expensive", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Free for 1 year" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." }, - "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "from the toolbar.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden extension installed!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Open the extension to log in and start autofilling." @@ -11687,6 +11684,14 @@ "message": "Learning Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Help Center", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 82ca8d37b61..70136be6086 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -9820,6 +9820,14 @@ "message": "Çok pahalı", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "1 yıl boyunca ücretsiz" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Bitwarden tarayıcı uzantısı başarıyla açıldı. Artık risk altındaki parolalarınızı gözden geçirebilirsiniz." }, - "openExtensionManuallyPart1": { - "message": "Bitwarden tarayıcı uzantısını açarken sorun yaşadık. Araç çubuğundan Bitwarden simgesini", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "açın.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Aboneliğiniz yakında yenilenecektir. Kesintisiz hizmet için, $RENEWAL_DATE$ tarihinden önce $RESELLER$ ile iletişime geçerek yenileme işleminizi onaylayın.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden uzantısı yüklendi!" }, - "openTheBitwardenExtension": { - "message": "Bitwarden uzantısını aç" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden uzantısı yüklendi!" }, "openExtensionToAutofill": { "message": "Otomatik doldurmaya başlamak için uzantıyı açıp giriş yapın." @@ -11687,6 +11684,14 @@ "message": "Öğrenim Merkezi", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "Uzantı açılmadıysa araç çubuğundaki simgeye ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " tıklayarak Bitwarden'ı açmanız gerekebilir.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Yardım Merkezi", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Devam etmek istediğinizden emin misiniz?" + }, + "userVerificationFailed": { + "message": "Kullanıcı doğrulaması başarısız oldu." } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 85fbbc317e7..1ccabaeddfb 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -9820,6 +9820,14 @@ "message": "Висока ціна", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Безплатно на 1 рік" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Розширення браузера Bitwarden успішно відкрито. Тепер ви можете переглянути свої ризиковані паролі." }, - "openExtensionManuallyPart1": { - "message": "Виникли проблеми з відкриттям розширення браузера Bitwarden. Відкрийте піктограму Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "з панелі інструментів.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Ваша передплата невдовзі поновиться. Щоб забезпечити безперебійну роботу, зверніться до $RESELLER$ для підтвердження поновлення до $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Розширення Bitwarden встановлено!" }, - "openTheBitwardenExtension": { - "message": "Open the Bitwarden extension" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "The Bitwarden extension is installed! Open the extension to log in and start autofilling." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Відкрийте розширення, щоб увійти й користуватися автозаповненням." @@ -11687,6 +11684,14 @@ "message": "Навчальний центр", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Довідковий центр", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index b361fb88822..370ca0f5ad4 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -9820,6 +9820,14 @@ "message": "Quá đắt", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "Switching to free plan", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "Switching to free organization", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "Miễn phí 1 năm" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "Đã mở tiện ích mở rộng trình duyệt Bitwarden thành công. Bây giờ bạn có thể xem lại mật khẩu có rủi ro của mình." }, - "openExtensionManuallyPart1": { - "message": "Chúng tôi gặp sự cố khi mở tiện ích mở rộng trình duyệt Bitwarden. Mở biểu tượng Bitwarden", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "từ thanh công cụ.", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "Đăng ký của bạn sẽ sớm được gia hạn. Để đảm bảo dịch vụ không bị gián đoạn, hãy liên hệ $RESELLER$ để xác nhận gia hạn trước $RENEWAL_DATE$.", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Đã cài đặt tiện ích mở rộng Bitwarden!" }, - "openTheBitwardenExtension": { - "message": "Mở tiện ích mở rộng Bitwarden" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Tiện ích mở rộng Bitwarden đã được cài đặt! Mở tiện ích mở rộng để đăng nhập và bắt đầu tự động điền." + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden extension is installed!" }, "openExtensionToAutofill": { "message": "Mở tiện ích mở rộng để đăng nhập và bắt đầu tự động điền." @@ -11687,6 +11684,14 @@ "message": "Trung tâm học tập", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " on the toolbar.", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "Trung tâm Trợ giúp", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Are you sure you want to continue?" + }, + "userVerificationFailed": { + "message": "User verification failed." } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 6ccfef71f97..6a436fbb4ac 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -236,7 +236,7 @@ "message": "标记为关键的应用程序" }, "criticalApplicationsMarkedSuccess": { - "message": "$COUNT$ 个应用程序标记为关键", + "message": "$COUNT$ 个标记为关键的应用程序", "placeholders": { "count": { "content": "$1", @@ -2490,7 +2490,7 @@ "message": "为您的组织启用两步登录。" }, "twoStepLoginEnterpriseDescStart": { - "message": "要为成员强制实施 Bitwarden 两步登录选项,请使用 ", + "message": "要为成员强制实施 Bitwarden 两步登录选项,请使用", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { @@ -2547,7 +2547,7 @@ "message": "需要高级版" }, "premiumRequiredDesc": { - "message": "使用此功能需要高级会员资格。" + "message": "需要高级会员才能使用此功能。" }, "youHavePremiumAccess": { "message": "您拥有高级版访问权限" @@ -3103,7 +3103,7 @@ } }, "bitwardenFamiliesPlan": { - "message": "Bitwarden 家庭方案。" + "message": "Bitwarden 家庭版方案。" }, "addons": { "message": "附加项目" @@ -3796,7 +3796,7 @@ "message": "管理员" }, "adminDesc": { - "message": "管理组织的访问权限,所有集合、成员、报告,以及安全设置" + "message": "管理组织的访问权限、所有集合、成员、报告,以及安全设置" }, "user": { "message": "用户" @@ -5810,11 +5810,11 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "所有项目都将归组织所有并保存至组织,从而实现组织范围的控制、可见性和报告功能。启用后,每个成员都将拥有一个默认集合来存储项目。进一步了解", + "message": "所有项目都将归组织所有并保存至组织中,从而实现组织范围的控制、可见性和报告。启用后,每个成员都可以使用默认集合来存储项目。进一步了解如何管理", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { - "message": "凭据的生命周期", + "message": "凭据生命周期", "description": "This will be used as a hyperlink" }, "organizationDataOwnershipWarningTitle": { @@ -6115,7 +6115,7 @@ "message": "加强企业安全。" }, "strengthenBusinessSecurityDescription": { - "message": "通过 SSO 集成、事件日志和访问轮换,保持机器和人类对机密访问权限的严格控制。" + "message": "通过 SSO 集成、事件日志和访问权限轮换,保持机器和人类对机密访问权限的严格控制。" }, "tryItNow": { "message": "立即体验" @@ -6882,7 +6882,7 @@ "message": "单点登录配置已保存" }, "sponsoredFamilies": { - "message": "免费 Bitwarden 家庭" + "message": "免费的 Bitwarden 家庭版" }, "sponsoredBitwardenFamilies": { "message": "赞助的家庭" @@ -6891,22 +6891,22 @@ "message": "没有赞助的家庭" }, "nosponsoredFamiliesDetails": { - "message": "已赞助的非成员家庭方案将显示在这里" + "message": "已赞助的非成员家庭版方案将显示在这里" }, "sponsorshipFreeBitwardenFamilies": { - "message": "您的组织成员有资格获得免费的 Bitwarden 家庭计划。您可以为不是您的 Bitwarden 组织成员的员工赞助免费 Bitwarden 家庭。赞助非成员需要您的组织内有可用的席位。" + "message": "您的组织成员有资格获得免费的 Bitwarden 家庭版。您可以为不是您的 Bitwarden 组织成员的员工赞助免费的 Bitwarden 家庭版。赞助非成员需要您的组织内有可用的席位。" }, "sponsoredFamiliesRemoveActiveSponsorship": { "message": "当您移除某个活动赞助,在被赞助组织的续费日期之后,您的组织中将释放一个可用的席位。" }, "sponsoredFamiliesEligible": { - "message": "您和您的家人有资格获得免费的 Bitwarden 家庭版计划。使用您的个人电子邮箱兑换,即使您不在工作中,也能确保您的数据安全。" + "message": "您和您的家人有资格获得免费的 Bitwarden 家庭版。使用您的个人电子邮箱兑换,即使您不在工作中,也能确保您的数据安全。" }, "sponsoredFamiliesEligibleCard": { - "message": "立即兑换免费的 Bitwarden 家庭方案,即使您不在工作中,也能确保您的数据安全。" + "message": "立即兑换免费的 Bitwarden 家庭版方案,即使您不在工作中,也能确保您的数据安全。" }, "sponsoredFamiliesIncludeMessage": { - "message": "Bitwarden 家庭方案包含" + "message": "Bitwarden 家庭版方案包含" }, "sponsoredFamiliesPremiumAccess": { "message": "最多 6 个高级版访问权限的用户" @@ -6921,10 +6921,10 @@ "message": "没有成员家庭" }, "noMemberFamiliesDescription": { - "message": "已兑换家庭方案的成员将在这里显示" + "message": "已兑换家庭版方案的成员将在这里显示" }, "membersWithSponsoredFamilies": { - "message": "您的组织成员有资格获得免费的 Bitwarden 家庭计划。在这里,您可以看到已赞助了家庭组织的成员。" + "message": "您的组织成员有资格获得免费的 Bitwarden 家庭版。在这里,您可以看到已赞助了家庭版组织的成员。" }, "organizationHasMemberMessage": { "message": "由于他们是您组织的成员,因此不能将赞助发送给 $EMAIL$。", @@ -6939,7 +6939,7 @@ "message": "链接已失效。请让赞助方重新发送邀请。" }, "reclaimedFreePlan": { - "message": "重新申领了免费方案" + "message": "已恢复为免费版方案" }, "redeem": { "message": "兑换" @@ -6948,19 +6948,19 @@ "message": "选择您希望被赞助的组织" }, "familiesSponsoringOrgSelect": { - "message": "您想兑换哪一个免费家庭邀请?" + "message": "您想兑换哪一个免费家庭版邀请?" }, "sponsoredFamiliesEmail": { - "message": "输入您的个人电子邮箱以兑换 Bitwarden 家庭" + "message": "输入您的个人电子邮箱以兑换 Bitwarden 家庭版" }, "sponsoredFamiliesLeaveCopy": { - "message": "如果您移除邀请或您被从赞助组织中移除,您的家庭赞助将在下一个续费日到期。" + "message": "如果您移除邀请或您被从赞助组织中移除,您的家庭版赞助将在下一个续费日到期。" }, "acceptBitwardenFamiliesHelp": { - "message": "接受现有组织的邀请或创建一个新的家庭组织。" + "message": "接受现有组织的邀请或创建一个新的家庭版组织。" }, "setupSponsoredFamiliesLoginDesc": { - "message": "您已被邀请加入免费的 Bitwarden 家庭方案组织。要继续,您需要登录到接收邀请的账户。" + "message": "您已被邀请加入免费的 Bitwarden 家庭版方案组织。要继续,您需要登录到接收邀请的账户。" }, "sponsoredFamiliesAcceptFailed": { "message": "无法接受邀请。请通过您的企业账户重新发送邀请邮件,然后重试。" @@ -6975,10 +6975,10 @@ } }, "sponsoredFamiliesOffer": { - "message": "接受免费的 Bitwarden 家庭组织" + "message": "接受免费的 Bitwarden 家庭版" }, "sponsoredFamiliesOfferRedeemed": { - "message": "免费 Bitwarden 家庭邀请已成功兑换" + "message": "免费的 Bitwarden 家庭版邀请已成功兑换" }, "redeemed": { "message": "已兑换" @@ -7005,7 +7005,7 @@ } }, "freeFamiliesPlan": { - "message": "免费家庭方案" + "message": "免费家庭版方案" }, "redeemNow": { "message": "立即兑换" @@ -7149,7 +7149,7 @@ "message": "赞助邀请已过期,您可以删除您创建的组织,以避免 7 天试用期结束时收取费用。您也可以关闭这个提示,以保留此组织并承担计费责任。" }, "newFamiliesOrganization": { - "message": "新建家庭组织" + "message": "新建家庭版组织" }, "acceptOffer": { "message": "接受邀请" @@ -7242,7 +7242,7 @@ "message": "自托管" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "要在您自己的服务器上设置您的组织,您需要上传您的许可证文件。要为您的自托管组织提供免费家庭方案和高级计费功能,您需要设置计费同步。" + "message": "要在您自己的服务器上设置您的组织,您需要上传您的许可证文件。要为您的自托管组织提供免费家庭版方案和高级计费功能,您需要设置计费同步。" }, "billingSyncApiKeyRotated": { "message": "令牌已轮换" @@ -7254,7 +7254,7 @@ "message": "计费同步令牌" }, "automaticBillingSyncDesc": { - "message": "自动同步将解锁家庭赞助功能,并允许您同步许可证而无需上传文件。在 Bitwarden 云服务器中进行更新后,选择「同步许可证」以应用更改。" + "message": "自动同步将解锁家庭版赞助功能,并允许您同步许可证而无需上传文件。在 Bitwarden 云服务器中进行更新后,选择「同步许可证」以应用更改。" }, "active": { "message": "已生效" @@ -9820,6 +9820,14 @@ "message": "太贵了", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "正在切换到免费方案", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "正在切换到免费组织", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "免费 1 年" }, @@ -10423,7 +10431,7 @@ "message": "输入您的团队组织信息" }, "enterFamiliesOrgInfo": { - "message": "输入您的家庭组织信息" + "message": "输入您的家庭版组织信息" }, "enterEnterpriseOrgInfo": { "message": "输入您的企业组织信息" @@ -10823,7 +10831,7 @@ "message": "SSO 身份验证" }, "familiesPlanInvLimitReachedManageBilling": { - "message": "家庭组织最多拥有 $SEATCOUNT$ 位成员。要邀请更多成员,请升级到付费方案。", + "message": "家庭版组织最多拥有 $SEATCOUNT$ 位成员。要邀请更多成员,请升级到付费方案。", "placeholders": { "seatcount": { "content": "$1", @@ -10832,7 +10840,7 @@ } }, "familiesPlanInvLimitReachedNoManageBilling": { - "message": "家庭组织最多拥有 $SEATCOUNT$ 位成员。请联系您的组织所有者升级。", + "message": "家庭版组织最多拥有 $SEATCOUNT$ 位成员。要升级,请联系您的组织所有者。", "placeholders": { "seatcount": { "content": "$1", @@ -11033,7 +11041,7 @@ "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "要在您自己的服务器上托管 Bitwarden,您需要上传许可证文件。要支持自托管组织的免费家庭版方案和高级计费功能,您需要在自托管组织中设置自动同步。" + "message": "要在您自己的服务器上托管 Bitwarden,您需要上传许可证文件。要支持自托管组织的免费版家庭版方案和高级计费功能,您需要在自托管组织中设置自动同步。" }, "selfHostingTitleProper": { "message": "自托管" @@ -11123,7 +11131,7 @@ "message": "删除成功" }, "freeFamiliesSponsorship": { - "message": "禁用免费 Bitwarden 家庭赞助" + "message": "禁用免费的 Bitwarden 家庭版赞助" }, "freeFamiliesSponsorshipPolicyDesc": { "message": "不允许成员通过此组织兑换家庭版方案。" @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "成功打开 Bitwarden 浏览器扩展。您现在可以审查存在风险的密码了。" }, - "openExtensionManuallyPart1": { - "message": "我们无法打开 Bitwarden 浏览器扩展。请从工具栏中点击 Bitwarden 图标", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "来打开它。", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "您的订阅即将续期。为确保服务不会中断,请在 $RENEWAL_DATE$ 之前联系 $RESELLER$ 确认您的续订。", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "Bitwarden 扩展已安装!" }, - "openTheBitwardenExtension": { - "message": "打开 Bitwarden 扩展" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "Bitwarden 扩展已安装!请打开扩展登录并开始自动填充。" + "bitwardenExtensionIsInstalled": { + "message": "Bitwarden 扩展已安装!" }, "openExtensionToAutofill": { "message": "打开扩展以登录并开始自动填充。" @@ -11687,6 +11684,14 @@ "message": "学习中心", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "如果扩展未打开,您可能需要通过工具栏上的图标 ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " 来打开 Bitwarden。", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "帮助中心", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12068,7 +12073,7 @@ "message": "立即升级" }, "formWillCreateNewFamiliesOrgMessage": { - "message": "完成此表单将创建一个新的家庭组织。您可以从管理控制台升级您的免费组织。" + "message": "完成此表单将创建一个新的家庭版组织。您可以从管理控制台升级您的免费版组织。" }, "upgradeErrorMessage": { "message": "我们在处理您的升级时遇到错误。请重试。" @@ -12119,7 +12124,7 @@ "message": "开始免费家庭版试用" }, "blockClaimedDomainAccountCreation": { - "message": "阻止为已声明的域名创建账户" + "message": "阻止使用已声明的域名创建账户" }, "blockClaimedDomainAccountCreationDesc": { "message": "禁止用户使用已声明域名的电子邮件地址在组织外部创建账户。" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "确定要继续吗?" + }, + "userVerificationFailed": { + "message": "用户验证失败。" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index add3fa6a84d..19456fed39d 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -1762,7 +1762,7 @@ "message": "通知已傳送至您的裝置。" }, "notificationSentDevicePart1": { - "message": "在你的裝置或其他裝置上解鎖 Bitwarden" + "message": "在你的裝置或其他裝置上解鎖 Bitwarden " }, "accessAttemptBy": { "message": "來自 $EMAIL$ 的存取嘗試", @@ -2310,7 +2310,7 @@ "message": "匯入資料" }, "onboardingImportDataDetailsPartOne": { - "message": "如果你沒有任何資料要匯入,你可以建立一個", + "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 item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLink": { @@ -5810,7 +5810,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "所有項目將由組織擁有並儲存,啟用組織範圍的控管、可見性及報告。啟用後,每位成員將有預設集合可用於儲存項目。瞭解更多關於管理", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -9820,6 +9820,14 @@ "message": "太貴了", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, + "switchToFreePlan": { + "message": "切換至免費方案", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, + "switchToFreeOrg": { + "message": "切換至免費組織", + "description": "An option for the offboarding survey shown when a user cancels their subscription." + }, "freeForOneYear": { "message": "免費 1 年" }, @@ -11339,14 +11347,6 @@ "openedExtensionViewAtRiskPasswords": { "message": "已成功開啟 Bitwarden 瀏覽器擴充套件。你現在可以檢視風險密碼。" }, - "openExtensionManuallyPart1": { - "message": "開啟 Bitwarden 瀏覽器擴充套件時發生問題。請從工具列開啟 Bitwarden 圖示", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, - "openExtensionManuallyPart2": { - "message": "。", - "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" - }, "resellerRenewalWarningMsg": { "message": "你的訂閱即將續約。為確保服務不中斷,請於 $RENEWAL_DATE$ 前聯絡 $RESELLER$ 確認續約。", "placeholders": { @@ -11667,11 +11667,8 @@ "bitwardenExtensionInstalled": { "message": "已安裝 Bitwarden 擴充套件!" }, - "openTheBitwardenExtension": { - "message": "開啟 Bitwarden 擴充套件" - }, - "bitwardenExtensionInstalledOpenExtension": { - "message": "已安裝 Bitwarden 擴充套件!開啟擴充套件以登入並開始自動填入。" + "bitwardenExtensionIsInstalled": { + "message": "已安裝 Bitwarden 擴充套件!" }, "openExtensionToAutofill": { "message": "開啟擴充套件以登入並開始自動填入。" @@ -11687,6 +11684,14 @@ "message": "學習中心", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, + "openExtensionFromToolbarPart1": { + "message": "如果擴充套件沒有開啟,您可能需要從圖示開啟 Bitwarden ", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, + "openExtensionFromToolbarPart2": { + "message": " 在工具列上。", + "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" + }, "gettingStartedWithBitwardenPart3": { "message": "說明中心", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" @@ -12119,13 +12124,13 @@ "message": "開始免費家庭試用" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "封鎖已宣告網域的帳號建立" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "防止使用者使用屬於已宣告網域的電子郵件地址,在組織外建立帳號。" }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "在啟用此原則前,必須先宣告網域。" }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "設定一個解鎖方式來變更您的密碼庫逾時動作。" @@ -12166,5 +12171,8 @@ }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "您確定要繼續嗎?" + }, + "userVerificationFailed": { + "message": "使用者驗證失敗。" } } From a8d6ad4db6c94bf4b8d320871cb09f746962b11c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 08:50:24 +0100 Subject: [PATCH 11/37] [deps] Platform: Update node-forge to v1.3.2 [SECURITY] (#17690) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- apps/cli/package.json | 2 +- package-lock.json | 10 +++++----- package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 63aa8a2360b..d2e229f15a7 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -82,7 +82,7 @@ "lunr": "2.3.9", "multer": "2.0.2", "node-fetch": "2.6.12", - "node-forge": "1.3.1", + "node-forge": "1.3.2", "open": "10.1.2", "papaparse": "5.5.3", "proper-lockfile": "4.1.2", diff --git a/package-lock.json b/package-lock.json index a30df2ea5f5..06aac3d3f88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "multer": "2.0.2", "ngx-toastr": "19.1.0", "node-fetch": "2.6.12", - "node-forge": "1.3.1", + "node-forge": "1.3.2", "oidc-client-ts": "2.4.1", "open": "10.1.2", "papaparse": "5.5.3", @@ -220,7 +220,7 @@ "lunr": "2.3.9", "multer": "2.0.2", "node-fetch": "2.6.12", - "node-forge": "1.3.1", + "node-forge": "1.3.2", "open": "10.1.2", "papaparse": "5.5.3", "proper-lockfile": "4.1.2", @@ -31114,9 +31114,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" diff --git a/package.json b/package.json index b7ac08b5ad9..65452a037fe 100644 --- a/package.json +++ b/package.json @@ -195,7 +195,7 @@ "multer": "2.0.2", "ngx-toastr": "19.1.0", "node-fetch": "2.6.12", - "node-forge": "1.3.1", + "node-forge": "1.3.2", "oidc-client-ts": "2.4.1", "open": "10.1.2", "papaparse": "5.5.3", From 95def44097062fe846c44e2bd5d02a17952589c9 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Sat, 29 Nov 2025 20:23:32 +0100 Subject: [PATCH 12/37] Catch error initializing provider keys (#17672) --- libs/key-management/src/key.service.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index 2701109fde2..f2c3c0eff7a 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -2,6 +2,7 @@ import * as bigInt from "big-integer"; import { NEVER, Observable, + catchError, combineLatest, distinctUntilChanged, filter, @@ -948,6 +949,13 @@ export class DefaultKeyService implements KeyServiceAbstraction { return result; }), + catchError((err: unknown) => { + this.logService.error( + `Failed to get encrypted organization keys for user ${userId}`, + err, + ); + return of({}); + }), ); }), ); From 39a22113df37de2fd4b5c3860cd7f6dc3c198795 Mon Sep 17 00:00:00 2001 From: Vince Grassia <593223+vgrassia@users.noreply.github.com> Date: Sun, 30 Nov 2025 22:25:38 -0500 Subject: [PATCH 13/37] BRE-1355 - Fix lite naming and remove PAT (#17743) --- .github/workflows/publish-web.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish-web.yml b/.github/workflows/publish-web.yml index be93ee61479..62d9342cf61 100644 --- a/.github/workflows/publish-web.yml +++ b/.github/workflows/publish-web.yml @@ -158,7 +158,7 @@ jobs: run: docker logout bitwarden-lite-build: - name: Trigger Bitwarden Lite build + name: Trigger Bitwarden lite build runs-on: ubuntu-22.04 needs: setup permissions: @@ -171,20 +171,27 @@ jobs: tenant_id: ${{ secrets.AZURE_TENANT_ID }} client_id: ${{ secrets.AZURE_CLIENT_ID }} - - name: Retrieve GitHub PAT secrets - id: retrieve-secret-pat + - name: Get Azure Key Vault secrets + id: get-kv-secrets uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - keyvault: "bitwarden-ci" - secrets: "github-pat-bitwarden-devops-bot-repo-scope" + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" - name: Log out from Azure uses: bitwarden/gh-actions/azure-logout@main - - name: Trigger Bitwarden Lite build + - name: Generate GH App token + uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4 + id: app-token + with: + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} + + - name: Trigger Bitwarden lite build uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: - github-token: ${{ steps.retrieve-secret-pat.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + github-token: ${{ steps.app-token.outputs.token }} script: | await github.rest.actions.createWorkflowDispatch({ owner: 'bitwarden', @@ -192,6 +199,7 @@ jobs: workflow_id: 'build-bitwarden-lite.yml', ref: 'main', inputs: { - use_latest_core_version: true + use_latest_core_version: true, + web_branch: process.env.GITHUB_REF } }); From 2fd4a92cc57e83442bbbe64629a9a02ee775d7f9 Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Mon, 1 Dec 2025 08:48:16 +0100 Subject: [PATCH 14/37] [PM-28640] Fix passkeys not working on MV2 (#17701) * fix: inject script contents directly * fix: tests * fix: tests * fix: injection tests --- .../fido2/background/fido2.background.spec.ts | 2 +- .../fido2/background/fido2.background.ts | 2 +- .../fido2-page-script-append.mv2.spec.ts | 18 ++++++++++++++---- .../fido2-page-script-delay-append.mv2.ts | 18 +++++++++++++----- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/browser/src/autofill/fido2/background/fido2.background.spec.ts b/apps/browser/src/autofill/fido2/background/fido2.background.spec.ts index adb59b8f845..76ad78a6cd8 100644 --- a/apps/browser/src/autofill/fido2/background/fido2.background.spec.ts +++ b/apps/browser/src/autofill/fido2/background/fido2.background.spec.ts @@ -203,7 +203,7 @@ describe("Fido2Background", () => { { file: Fido2ContentScript.PageScriptDelayAppend }, { file: Fido2ContentScript.ContentScript }, ], - world: "MAIN", + world: "ISOLATED", ...sharedRegistrationOptions, }); }); diff --git a/apps/browser/src/autofill/fido2/background/fido2.background.ts b/apps/browser/src/autofill/fido2/background/fido2.background.ts index a8b016a14d6..0ee7a43767f 100644 --- a/apps/browser/src/autofill/fido2/background/fido2.background.ts +++ b/apps/browser/src/autofill/fido2/background/fido2.background.ts @@ -176,7 +176,7 @@ export class Fido2Background implements Fido2BackgroundInterface { { file: await this.getFido2PageScriptAppendFileName() }, { file: Fido2ContentScript.ContentScript }, ], - world: "MAIN", + world: "ISOLATED", ...this.sharedRegistrationOptions, }); } diff --git a/apps/browser/src/autofill/fido2/content/fido2-page-script-append.mv2.spec.ts b/apps/browser/src/autofill/fido2/content/fido2-page-script-append.mv2.spec.ts index b444c967080..0b10841e390 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-page-script-append.mv2.spec.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-page-script-append.mv2.spec.ts @@ -29,38 +29,48 @@ describe("FIDO2 page-script for manifest v2", () => { expect(window.document.createElement).not.toHaveBeenCalled(); }); - it("appends the `page-script.js` file to the document head when the contentType is `text/html`", () => { + it("appends the `page-script.js` file to the document head when the contentType is `text/html`", async () => { + const scriptContents = "test-script-contents"; jest.spyOn(window.document.head, "prepend").mockImplementation((node) => { createdScriptElement = node as HTMLScriptElement; return node; }); + window.fetch = jest.fn().mockResolvedValue({ + text: () => Promise.resolve(scriptContents), + } as Response); // FIXME: Remove when updating file. Eslint update // eslint-disable-next-line @typescript-eslint/no-require-imports require("./fido2-page-script-delay-append.mv2.ts"); + await jest.runAllTimersAsync(); expect(window.document.createElement).toHaveBeenCalledWith("script"); expect(chrome.runtime.getURL).toHaveBeenCalledWith(Fido2ContentScript.PageScript); expect(window.document.head.prepend).toHaveBeenCalledWith(expect.any(HTMLScriptElement)); - expect(createdScriptElement.src).toBe(`chrome-extension://id/${Fido2ContentScript.PageScript}`); + expect(createdScriptElement.innerHTML).toBe(scriptContents); }); - it("appends the `page-script.js` file to the document element if the head is not available", () => { + it("appends the `page-script.js` file to the document element if the head is not available", async () => { + const scriptContents = "test-script-contents"; window.document.documentElement.removeChild(window.document.head); jest.spyOn(window.document.documentElement, "prepend").mockImplementation((node) => { createdScriptElement = node as HTMLScriptElement; return node; }); + window.fetch = jest.fn().mockResolvedValue({ + text: () => Promise.resolve(scriptContents), + } as Response); // FIXME: Remove when updating file. Eslint update // eslint-disable-next-line @typescript-eslint/no-require-imports require("./fido2-page-script-delay-append.mv2.ts"); + await jest.runAllTimersAsync(); expect(window.document.createElement).toHaveBeenCalledWith("script"); expect(chrome.runtime.getURL).toHaveBeenCalledWith(Fido2ContentScript.PageScript); expect(window.document.documentElement.prepend).toHaveBeenCalledWith( expect.any(HTMLScriptElement), ); - expect(createdScriptElement.src).toBe(`chrome-extension://id/${Fido2ContentScript.PageScript}`); + expect(createdScriptElement.innerHTML).toBe(scriptContents); }); }); diff --git a/apps/browser/src/autofill/fido2/content/fido2-page-script-delay-append.mv2.ts b/apps/browser/src/autofill/fido2/content/fido2-page-script-delay-append.mv2.ts index e167f30af0a..8c0d17c7e21 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-page-script-delay-append.mv2.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-page-script-delay-append.mv2.ts @@ -2,18 +2,26 @@ * This script handles injection of the FIDO2 override page script into the document. * This is required for manifest v2, but will be removed when we migrate fully to manifest v3. */ -(function (globalContext) { +void (async function (globalContext) { if (globalContext.document.contentType !== "text/html") { return; } const script = globalContext.document.createElement("script"); - // This script runs in world: MAIN, eliminating the risk associated with this lint error. - // DOM injection is still needed for the iframe timing hack. - // eslint-disable-next-line @bitwarden/platform/no-page-script-url-leakage - script.src = chrome.runtime.getURL("content/fido2-page-script.js"); script.async = false; + const pageScriptUrl = chrome.runtime.getURL("content/fido2-page-script.js"); + // Inject the script contents directly to avoid leaking the extension URL + try { + const response = await fetch(pageScriptUrl); + const scriptContents = await response.text(); + script.innerHTML = scriptContents; + } catch { + // eslint-disable-next-line no-console + console.error("Failed to load FIDO2 page script contents. Injection failed."); + return; + } + // We are ensuring that the script injection is delayed in the event that we are loading // within an iframe element. This prevents an issue with web mail clients that load content // using ajax within iframes. In particular, Zimbra web mail client was observed to have this issue. From b248341d0ebcf2590e5cdaa6f33e1eac8074f85e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:09:24 +0100 Subject: [PATCH 15/37] [deps] Autofill: Update wait-on to v9.0.3 (#17542) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06aac3d3f88..a7a4c704879 100644 --- a/package-lock.json +++ b/package-lock.json @@ -181,7 +181,7 @@ "typescript-strict-plugin": "2.4.4", "url": "0.11.4", "util": "0.12.5", - "wait-on": "9.0.1", + "wait-on": "9.0.3", "webpack": "5.103.0", "webpack-cli": "6.0.1", "webpack-dev-server": "5.2.2", @@ -16962,9 +16962,9 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -41147,13 +41147,13 @@ } }, "node_modules/wait-on": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.1.tgz", - "integrity": "sha512-noeCAI+XbqWMXY23sKril0BSURhuLYarkVXwJv1uUWwoojZJE7pmX3vJ7kh7SZaNgPGzfsCSQIZM/AGvu0Q9pA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.3.tgz", + "integrity": "sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.12.2", + "axios": "^1.13.2", "joi": "^18.0.1", "lodash": "^4.17.21", "minimist": "^1.2.8", @@ -41184,9 +41184,9 @@ } }, "node_modules/wait-on/node_modules/joi": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.1.tgz", - "integrity": "sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.2.tgz", + "integrity": "sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { diff --git a/package.json b/package.json index 65452a037fe..f905b1d25e4 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ "typescript-strict-plugin": "2.4.4", "url": "0.11.4", "util": "0.12.5", - "wait-on": "9.0.1", + "wait-on": "9.0.3", "webpack": "5.103.0", "webpack-cli": "6.0.1", "webpack-dev-server": "5.2.2", From b7287d46143c2ecbaa5bef28f53d1bcc0f27f7cd Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Mon, 1 Dec 2025 10:16:36 +0100 Subject: [PATCH 16/37] [PM-26570] Remove biometrics v1 (#17629) * Remove biometrics v1 * Cargo fmt * Fix windows build * Apply prettier * Remove proxy code * Fix build * Fix * Fix tests * Remove v2 flag --- .../desktop_native/core/src/biometric/mod.rs | 10 +- .../biometric/{macos.rs => unimplemented.rs} | 2 +- .../core/src/biometric/windows.rs | 240 ----------- .../core/src/biometric/windows_focus.rs | 28 -- apps/desktop/desktop_native/proxy/src/main.rs | 9 - .../desktop_native/proxy/src/windows.rs | 23 -- .../src/app/accounts/settings.component.html | 3 +- .../app/accounts/settings.component.spec.ts | 6 +- .../src/app/accounts/settings.component.ts | 18 +- .../biometrics/desktop.biometrics.service.ts | 3 - .../main-biometrics-ipc.listener.ts | 4 - .../main-biometrics.service.spec.ts | 75 +--- .../biometrics/main-biometrics.service.ts | 24 +- .../os-biometrics-windows.service.spec.ts | 378 ------------------ .../os-biometrics-windows.service.ts | 214 ---------- .../biometrics/renderer-biometrics.service.ts | 8 - apps/desktop/src/key-management/preload.ts | 8 - .../biometric-message-handler.service.spec.ts | 15 - .../biometric-message-handler.service.ts | 7 - apps/desktop/src/types/biometric-message.ts | 3 - libs/common/src/enums/feature-flag.enum.ts | 2 - 21 files changed, 14 insertions(+), 1066 deletions(-) rename apps/desktop/desktop_native/core/src/biometric/{macos.rs => unimplemented.rs} (94%) delete mode 100644 apps/desktop/desktop_native/core/src/biometric/windows.rs delete mode 100644 apps/desktop/desktop_native/core/src/biometric/windows_focus.rs delete mode 100644 apps/desktop/desktop_native/proxy/src/windows.rs delete mode 100644 apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.spec.ts delete mode 100644 apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts diff --git a/apps/desktop/desktop_native/core/src/biometric/mod.rs b/apps/desktop/desktop_native/core/src/biometric/mod.rs index 937c67ff30a..6ed5fbe08a7 100644 --- a/apps/desktop/desktop_native/core/src/biometric/mod.rs +++ b/apps/desktop/desktop_native/core/src/biometric/mod.rs @@ -3,16 +3,12 @@ use anyhow::{anyhow, Result}; #[allow(clippy::module_inception)] #[cfg_attr(target_os = "linux", path = "unix.rs")] -#[cfg_attr(target_os = "macos", path = "macos.rs")] -#[cfg_attr(target_os = "windows", path = "windows.rs")] +#[cfg_attr(target_os = "macos", path = "unimplemented.rs")] +#[cfg_attr(target_os = "windows", path = "unimplemented.rs")] mod biometric; -pub use biometric::Biometric; - -#[cfg(target_os = "windows")] -pub mod windows_focus; - use base64::{engine::general_purpose::STANDARD as base64_engine, Engine}; +pub use biometric::Biometric; use sha2::{Digest, Sha256}; use crate::crypto::{self, CipherString}; diff --git a/apps/desktop/desktop_native/core/src/biometric/macos.rs b/apps/desktop/desktop_native/core/src/biometric/unimplemented.rs similarity index 94% rename from apps/desktop/desktop_native/core/src/biometric/macos.rs rename to apps/desktop/desktop_native/core/src/biometric/unimplemented.rs index ec09d566e1f..3f3d034924a 100644 --- a/apps/desktop/desktop_native/core/src/biometric/macos.rs +++ b/apps/desktop/desktop_native/core/src/biometric/unimplemented.rs @@ -2,7 +2,7 @@ use anyhow::{bail, Result}; use crate::biometric::{KeyMaterial, OsDerivedKey}; -/// The MacOS implementation of the biometric trait. +/// Unimplemented stub for unsupported platforms pub struct Biometric {} impl super::BiometricTrait for Biometric { diff --git a/apps/desktop/desktop_native/core/src/biometric/windows.rs b/apps/desktop/desktop_native/core/src/biometric/windows.rs deleted file mode 100644 index f72282d9284..00000000000 --- a/apps/desktop/desktop_native/core/src/biometric/windows.rs +++ /dev/null @@ -1,240 +0,0 @@ -use std::{ffi::c_void, str::FromStr}; - -use anyhow::{anyhow, Result}; -use base64::{engine::general_purpose::STANDARD as base64_engine, Engine}; -use rand::RngCore; -use sha2::{Digest, Sha256}; -use windows::{ - core::{factory, HSTRING}, - Security::Credentials::UI::{ - UserConsentVerificationResult, UserConsentVerifier, UserConsentVerifierAvailability, - }, - Win32::{ - Foundation::HWND, System::WinRT::IUserConsentVerifierInterop, - UI::WindowsAndMessaging::GetForegroundWindow, - }, -}; -use windows_future::IAsyncOperation; - -use super::{decrypt, encrypt, windows_focus::set_focus}; -use crate::{ - biometric::{KeyMaterial, OsDerivedKey}, - crypto::CipherString, -}; - -/// The Windows OS implementation of the biometric trait. -pub struct Biometric {} - -impl super::BiometricTrait for Biometric { - // FIXME: Remove unwraps! They panic and terminate the whole application. - #[allow(clippy::unwrap_used)] - async fn prompt(hwnd: Vec, message: String) -> Result { - let h = isize::from_le_bytes(hwnd.clone().try_into().unwrap()); - - let h = h as *mut c_void; - let window = HWND(h); - - // The Windows Hello prompt is displayed inside the application window. For best result we - // should set the window to the foreground and focus it. - set_focus(window); - - // Windows Hello prompt must be in foreground, focused, otherwise the face or fingerprint - // unlock will not work. We get the current foreground window, which will either be the - // Bitwarden desktop app or the browser extension. - let foreground_window = unsafe { GetForegroundWindow() }; - - let interop = factory::()?; - let operation: IAsyncOperation = unsafe { - interop.RequestVerificationForWindowAsync(foreground_window, &HSTRING::from(message))? - }; - let result = operation.get()?; - - match result { - UserConsentVerificationResult::Verified => Ok(true), - _ => Ok(false), - } - } - - async fn available() -> Result { - let ucv_available = UserConsentVerifier::CheckAvailabilityAsync()?.get()?; - - match ucv_available { - UserConsentVerifierAvailability::Available => Ok(true), - // TODO: look into removing this and making the check more ad-hoc - UserConsentVerifierAvailability::DeviceBusy => Ok(true), - _ => Ok(false), - } - } - - fn derive_key_material(challenge_str: Option<&str>) -> Result { - let challenge: [u8; 16] = match challenge_str { - Some(challenge_str) => base64_engine - .decode(challenge_str)? - .try_into() - .map_err(|e: Vec<_>| anyhow!("Expect length {}, got {}", 16, e.len()))?, - None => random_challenge(), - }; - - // Uses a key derived from the iv. This key is not intended to add any security - // but only a place-holder - let key = Sha256::digest(challenge); - let key_b64 = base64_engine.encode(key); - let iv_b64 = base64_engine.encode(challenge); - Ok(OsDerivedKey { key_b64, iv_b64 }) - } - - async fn set_biometric_secret( - service: &str, - account: &str, - secret: &str, - key_material: Option, - iv_b64: &str, - ) -> Result { - let key_material = key_material.ok_or(anyhow!( - "Key material is required for Windows Hello protected keys" - ))?; - - let encrypted_secret = encrypt(secret, &key_material, iv_b64)?; - crate::password::set_password(service, account, &encrypted_secret).await?; - Ok(encrypted_secret) - } - - async fn get_biometric_secret( - service: &str, - account: &str, - key_material: Option, - ) -> Result { - let key_material = key_material.ok_or(anyhow!( - "Key material is required for Windows Hello protected keys" - ))?; - - let encrypted_secret = crate::password::get_password(service, account).await?; - match CipherString::from_str(&encrypted_secret) { - Ok(secret) => { - // If the secret is a CipherString, it is encrypted and we need to decrypt it. - let secret = decrypt(&secret, &key_material)?; - Ok(secret) - } - Err(_) => { - // If the secret is not a CipherString, it is not encrypted and we can return it - // directly. - Ok(encrypted_secret) - } - } - } -} - -fn random_challenge() -> [u8; 16] { - let mut challenge = [0u8; 16]; - rand::rng().fill_bytes(&mut challenge); - challenge -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::biometric::BiometricTrait; - - #[test] - fn test_derive_key_material() { - let iv_input = "l9fhDUP/wDJcKwmEzcb/3w=="; - let result = ::derive_key_material(Some(iv_input)).unwrap(); - let key = base64_engine.decode(result.key_b64).unwrap(); - assert_eq!(key.len(), 32); - assert_eq!(result.iv_b64, iv_input) - } - - #[test] - fn test_derive_key_material_no_iv() { - let result = ::derive_key_material(None).unwrap(); - let key = base64_engine.decode(result.key_b64).unwrap(); - assert_eq!(key.len(), 32); - let iv = base64_engine.decode(result.iv_b64).unwrap(); - assert_eq!(iv.len(), 16); - } - - #[tokio::test] - #[cfg(feature = "manual_test")] - async fn test_prompt() { - ::prompt( - vec![0, 0, 0, 0, 0, 0, 0, 0], - String::from("Hello from Rust"), - ) - .await - .unwrap(); - } - - #[tokio::test] - #[cfg(feature = "manual_test")] - async fn test_available() { - assert!(::available().await.unwrap()) - } - - #[tokio::test] - #[cfg(feature = "manual_test")] - async fn get_biometric_secret_requires_key() { - let result = ::get_biometric_secret("", "", None).await; - assert!(result.is_err()); - assert_eq!( - result.unwrap_err().to_string(), - "Key material is required for Windows Hello protected keys" - ); - } - - #[tokio::test] - #[cfg(feature = "manual_test")] - async fn get_biometric_secret_handles_unencrypted_secret() { - let test = "test"; - let secret = "password"; - let key_material = KeyMaterial { - os_key_part_b64: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=".to_owned(), - client_key_part_b64: Some("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=".to_owned()), - }; - crate::password::set_password(test, test, secret) - .await - .unwrap(); - let result = - ::get_biometric_secret(test, test, Some(key_material)) - .await - .unwrap(); - crate::password::delete_password("test", "test") - .await - .unwrap(); - assert_eq!(result, secret); - } - - #[tokio::test] - #[cfg(feature = "manual_test")] - async fn get_biometric_secret_handles_encrypted_secret() { - let test = "test"; - let secret = - CipherString::from_str("0.l9fhDUP/wDJcKwmEzcb/3w==|uP4LcqoCCj5FxBDP77NV6Q==").unwrap(); // output from test_encrypt - let key_material = KeyMaterial { - os_key_part_b64: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=".to_owned(), - client_key_part_b64: Some("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=".to_owned()), - }; - crate::password::set_password(test, test, &secret.to_string()) - .await - .unwrap(); - - let result = - ::get_biometric_secret(test, test, Some(key_material)) - .await - .unwrap(); - crate::password::delete_password("test", "test") - .await - .unwrap(); - assert_eq!(result, "secret"); - } - - #[tokio::test] - async fn set_biometric_secret_requires_key() { - let result = - ::set_biometric_secret("", "", "", None, "").await; - assert!(result.is_err()); - assert_eq!( - result.unwrap_err().to_string(), - "Key material is required for Windows Hello protected keys" - ); - } -} diff --git a/apps/desktop/desktop_native/core/src/biometric/windows_focus.rs b/apps/desktop/desktop_native/core/src/biometric/windows_focus.rs deleted file mode 100644 index ce51f82862d..00000000000 --- a/apps/desktop/desktop_native/core/src/biometric/windows_focus.rs +++ /dev/null @@ -1,28 +0,0 @@ -use windows::{ - core::s, - Win32::{ - Foundation::HWND, - UI::{ - Input::KeyboardAndMouse::SetFocus, - WindowsAndMessaging::{FindWindowA, SetForegroundWindow}, - }, - }, -}; - -/// Searches for a window that looks like a security prompt and set it as focused. -/// Only works when the process has permission to foreground, either by being in foreground -/// Or by being given foreground permission https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setforegroundwindow#remarks -pub fn focus_security_prompt() { - let class_name = s!("Credential Dialog Xaml Host"); - let hwnd = unsafe { FindWindowA(class_name, None) }; - if let Ok(hwnd) = hwnd { - set_focus(hwnd); - } -} - -pub(crate) fn set_focus(window: HWND) { - unsafe { - let _ = SetForegroundWindow(window); - let _ = SetFocus(Some(window)); - } -} diff --git a/apps/desktop/desktop_native/proxy/src/main.rs b/apps/desktop/desktop_native/proxy/src/main.rs index 21957d8ba32..a2a0b834bca 100644 --- a/apps/desktop/desktop_native/proxy/src/main.rs +++ b/apps/desktop/desktop_native/proxy/src/main.rs @@ -8,9 +8,6 @@ use tracing_subscriber::{ fmt, layer::SubscriberExt as _, util::SubscriberInitExt as _, EnvFilter, Layer as _, }; -#[cfg(target_os = "windows")] -mod windows; - #[cfg(target_os = "macos")] embed_plist::embed_info_plist!("../../../resources/info.desktop_proxy.plist"); @@ -64,9 +61,6 @@ fn init_logging(log_path: &Path, console_level: LevelFilter, file_level: LevelFi #[allow(clippy::unwrap_used)] #[tokio::main(flavor = "current_thread")] async fn main() { - #[cfg(target_os = "windows")] - let should_foreground = windows::allow_foreground(); - let sock_path = desktop_core::ipc::path("bw"); let log_path = { @@ -158,9 +152,6 @@ async fn main() { // Listen to stdin and send messages to ipc processor. msg = stdin.next() => { - #[cfg(target_os = "windows")] - should_foreground.store(true, std::sync::atomic::Ordering::Relaxed); - match msg { Some(Ok(msg)) => { let msg = String::from_utf8(msg.to_vec()).unwrap(); diff --git a/apps/desktop/desktop_native/proxy/src/windows.rs b/apps/desktop/desktop_native/proxy/src/windows.rs deleted file mode 100644 index cb0656fc7f8..00000000000 --- a/apps/desktop/desktop_native/proxy/src/windows.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::sync::{ - atomic::{AtomicBool, Ordering}, - Arc, -}; - -pub fn allow_foreground() -> Arc { - let should_foreground = Arc::new(AtomicBool::new(false)); - let should_foreground_clone = should_foreground.clone(); - let _ = std::thread::spawn(move || loop { - if !should_foreground_clone.load(Ordering::Relaxed) { - std::thread::sleep(std::time::Duration::from_millis(100)); - continue; - } - should_foreground_clone.store(false, Ordering::Relaxed); - - for _ in 0..60 { - desktop_core::biometric::windows_focus::focus_security_prompt(); - std::thread::sleep(std::time::Duration::from_millis(1000)); - } - }); - - should_foreground -} diff --git a/apps/desktop/src/app/accounts/settings.component.html b/apps/desktop/src/app/accounts/settings.component.html index bf3c46a311f..8abd84ee39c 100644 --- a/apps/desktop/src/app/accounts/settings.component.html +++ b/apps/desktop/src/app/accounts/settings.component.html @@ -101,8 +101,7 @@ supportsBiometric && form.value.biometric && isWindows && - (userHasMasterPassword || (form.value.pin && userHasPinSet)) && - isWindowsV2BiometricsEnabled + (userHasMasterPassword || (form.value.pin && userHasPinSet)) " >
diff --git a/apps/desktop/src/app/accounts/settings.component.spec.ts b/apps/desktop/src/app/accounts/settings.component.spec.ts index 115f7436979..a424f230778 100644 --- a/apps/desktop/src/app/accounts/settings.component.spec.ts +++ b/apps/desktop/src/app/accounts/settings.component.spec.ts @@ -302,7 +302,6 @@ describe("SettingsComponent", () => { describe("windows desktop", () => { beforeEach(() => { platformUtilsService.getDevice.mockReturnValue(DeviceType.WindowsDesktop); - desktopBiometricsService.isWindowsV2BiometricsEnabled.mockResolvedValue(true); // Recreate component to apply the correct device fixture = TestBed.createComponent(SettingsComponent); @@ -449,7 +448,6 @@ describe("SettingsComponent", () => { desktopBiometricsService.hasPersistentKey.mockResolvedValue(enrolled); await component.ngOnInit(); - component.isWindowsV2BiometricsEnabled = true; component.isWindows = true; component.form.value.requireMasterPasswordOnAppRestart = true; component.userHasMasterPassword = false; @@ -558,7 +556,6 @@ describe("SettingsComponent", () => { desktopBiometricsService.hasPersistentKey.mockResolvedValue(false); await component.ngOnInit(); - component.isWindowsV2BiometricsEnabled = true; component.isWindows = true; component.form.value.requireMasterPasswordOnAppRestart = requireMasterPasswordOnAppRestart; @@ -659,6 +656,7 @@ describe("SettingsComponent", () => { describe("windows test cases", () => { beforeEach(() => { platformUtilsService.getDevice.mockReturnValue(DeviceType.WindowsDesktop); + keyService.userKey$ = jest.fn().mockReturnValue(of(mockUserKey)); component.isWindows = true; component.isLinux = false; @@ -683,8 +681,6 @@ describe("SettingsComponent", () => { describe("when windows v2 biometrics is enabled", () => { beforeEach(() => { - component.isWindowsV2BiometricsEnabled = true; - keyService.userKey$ = jest.fn().mockReturnValue(of(mockUserKey)); }); diff --git a/apps/desktop/src/app/accounts/settings.component.ts b/apps/desktop/src/app/accounts/settings.component.ts index c0798f1bdf0..68863312ffe 100644 --- a/apps/desktop/src/app/accounts/settings.component.ts +++ b/apps/desktop/src/app/accounts/settings.component.ts @@ -148,7 +148,6 @@ export class SettingsComponent implements OnInit, OnDestroy { userHasPinSet: boolean; pinEnabled$: Observable = of(true); - isWindowsV2BiometricsEnabled: boolean = false; consolidatedSessionTimeoutComponent$: Observable; @@ -297,8 +296,6 @@ export class SettingsComponent implements OnInit, OnDestroy { async ngOnInit() { this.vaultTimeoutOptions = await this.generateVaultTimeoutOptions(); - this.isWindowsV2BiometricsEnabled = await this.biometricsService.isWindowsV2BiometricsEnabled(); - const activeAccount = await firstValueFrom(this.accountService.activeAccount$); // Autotype is for Windows initially @@ -621,7 +618,6 @@ export class SettingsComponent implements OnInit, OnDestroy { // On Windows if a user turned off PIN without having a MP and has biometrics + require MP/PIN on restart enabled. if ( this.isWindows && - this.isWindowsV2BiometricsEnabled && this.supportsBiometric && this.form.value.requireMasterPasswordOnAppRestart && this.form.value.biometric && @@ -682,14 +678,12 @@ export class SettingsComponent implements OnInit, OnDestroy { this.form.controls.autoPromptBiometrics.setValue(false); await this.biometricStateService.setPromptAutomatically(false); - if (this.isWindowsV2BiometricsEnabled) { - // If the user doesn't have a MP or PIN then they have to use biometrics on app restart. - if (!this.userHasMasterPassword && !this.userHasPinSet) { - // Allow biometric unlock on app restart so the user doesn't get into a bad state. - await this.enrollPersistentBiometricIfNeeded(activeUserId); - } else { - this.form.controls.requireMasterPasswordOnAppRestart.setValue(true); - } + // If the user doesn't have a MP or PIN then they have to use biometrics on app restart. + if (!this.userHasMasterPassword && !this.userHasPinSet) { + // Allow biometric unlock on app restart so the user doesn't get into a bad state. + await this.enrollPersistentBiometricIfNeeded(activeUserId); + } else { + this.form.controls.requireMasterPasswordOnAppRestart.setValue(true); } } else if (this.isLinux) { // Similar to Windows diff --git a/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts b/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts index 04a2f389781..59d9dcce7fe 100644 --- a/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/desktop.biometrics.service.ts @@ -16,9 +16,6 @@ export abstract class DesktopBiometricsService extends BiometricsService { abstract enrollPersistent(userId: UserId, key: SymmetricCryptoKey): Promise; abstract hasPersistentKey(userId: UserId): Promise; /* Enables the v2 biometrics re-write. This will stay enabled until the application is restarted. */ - abstract enableWindowsV2Biometrics(): Promise; - abstract isWindowsV2BiometricsEnabled(): Promise; - /* Enables the v2 biometrics re-write. This will stay enabled until the application is restarted. */ abstract enableLinuxV2Biometrics(): Promise; abstract isLinuxV2BiometricsEnabled(): Promise; } diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts b/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts index db7c7c8f7fa..e30e4af3bac 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics-ipc.listener.ts @@ -58,10 +58,6 @@ export class MainBiometricsIPCListener { message.userId as UserId, SymmetricCryptoKey.fromString(message.key as string), ); - case BiometricAction.EnableWindowsV2: - return await this.biometricService.enableWindowsV2Biometrics(); - case BiometricAction.IsWindowsV2Enabled: - return await this.biometricService.isWindowsV2BiometricsEnabled(); case BiometricAction.EnableLinuxV2: return await this.biometricService.enableLinuxV2Biometrics(); case BiometricAction.IsLinuxV2Enabled: diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts b/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts index be9e1f841e1..0cbe032aa76 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics.service.spec.ts @@ -20,7 +20,6 @@ import { MainBiometricsService } from "./main-biometrics.service"; import { WindowsBiometricsSystem } from "./native-v2"; import OsBiometricsServiceLinux from "./os-biometrics-linux.service"; import OsBiometricsServiceMac from "./os-biometrics-mac.service"; -import OsBiometricsServiceWindows from "./os-biometrics-windows.service"; import { OsBiometricService } from "./os-biometrics.service"; jest.mock("@bitwarden/desktop-napi", () => { @@ -61,7 +60,7 @@ describe("MainBiometricsService", function () { const internalService = (sut as any).osBiometricsService; expect(internalService).not.toBeNull(); - expect(internalService).toBeInstanceOf(OsBiometricsServiceWindows); + expect(internalService).toBeInstanceOf(WindowsBiometricsSystem); }); it("Should create a biometrics service specific for MacOs", () => { @@ -289,78 +288,6 @@ describe("MainBiometricsService", function () { }); }); - describe("enableWindowsV2Biometrics", () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it("enables Windows V2 biometrics when platform is win32 and not already enabled", async () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - "win32", - biometricStateService, - encryptService, - cryptoFunctionService, - ); - - await sut.enableWindowsV2Biometrics(); - - expect(logService.info).toHaveBeenCalledWith( - "[BiometricsMain] Loading native biometrics module v2 for windows", - ); - expect(await sut.isWindowsV2BiometricsEnabled()).toBe(true); - const internalService = (sut as any).osBiometricsService; - expect(internalService).not.toBeNull(); - expect(internalService).toBeInstanceOf(WindowsBiometricsSystem); - }); - - it("should not enable Windows V2 biometrics when platform is not win32", async () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - "darwin", - biometricStateService, - encryptService, - cryptoFunctionService, - ); - - await sut.enableWindowsV2Biometrics(); - - expect(logService.info).not.toHaveBeenCalled(); - expect(await sut.isWindowsV2BiometricsEnabled()).toBe(false); - }); - - it("should not enable Windows V2 biometrics when already enabled", async () => { - const sut = new MainBiometricsService( - i18nService, - windowMain, - logService, - "win32", - biometricStateService, - encryptService, - cryptoFunctionService, - ); - - // Enable it first - await sut.enableWindowsV2Biometrics(); - - // Enable it again - await sut.enableWindowsV2Biometrics(); - - expect(logService.info).toHaveBeenCalledWith( - "[BiometricsMain] Loading native biometrics module v2 for windows", - ); - expect(logService.info).toHaveBeenCalledTimes(1); - expect(await sut.isWindowsV2BiometricsEnabled()).toBe(true); - const internalService = (sut as any).osBiometricsService; - expect(internalService).not.toBeNull(); - expect(internalService).toBeInstanceOf(WindowsBiometricsSystem); - }); - }); - describe("pass through methods that call platform specific osBiometricsService methods", () => { const userId = newGuid() as UserId; let sut: MainBiometricsService; diff --git a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts index da532828314..ad9ec62afcc 100644 --- a/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/main-biometrics.service.ts @@ -16,7 +16,6 @@ import { OsBiometricService } from "./os-biometrics.service"; export class MainBiometricsService extends DesktopBiometricsService { private osBiometricsService: OsBiometricService; private shouldAutoPrompt = true; - private windowsV2BiometricsEnabled = false; private linuxV2BiometricsEnabled = false; constructor( @@ -30,15 +29,10 @@ export class MainBiometricsService extends DesktopBiometricsService { ) { super(); if (platform === "win32") { - // eslint-disable-next-line - const OsBiometricsServiceWindows = require("./os-biometrics-windows.service").default; - this.osBiometricsService = new OsBiometricsServiceWindows( + this.osBiometricsService = new WindowsBiometricsSystem( this.i18nService, this.windowMain, this.logService, - this.biometricStateService, - this.encryptService, - this.cryptoFunctionService, ); } else if (platform === "darwin") { // eslint-disable-next-line @@ -156,22 +150,6 @@ export class MainBiometricsService extends DesktopBiometricsService { return await this.osBiometricsService.hasPersistentKey(userId); } - async enableWindowsV2Biometrics(): Promise { - if (this.platform === "win32" && !this.windowsV2BiometricsEnabled) { - this.logService.info("[BiometricsMain] Loading native biometrics module v2 for windows"); - this.osBiometricsService = new WindowsBiometricsSystem( - this.i18nService, - this.windowMain, - this.logService, - ); - this.windowsV2BiometricsEnabled = true; - } - } - - async isWindowsV2BiometricsEnabled(): Promise { - return this.windowsV2BiometricsEnabled; - } - async enableLinuxV2Biometrics(): Promise { if (this.platform === "linux" && !this.linuxV2BiometricsEnabled) { this.logService.info("[BiometricsMain] Loading native biometrics module v2 for linux"); diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.spec.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.spec.ts deleted file mode 100644 index f301efc70e7..00000000000 --- a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.spec.ts +++ /dev/null @@ -1,378 +0,0 @@ -import { randomBytes } from "node:crypto"; - -import { BrowserWindow } from "electron"; -import { mock } from "jest-mock-extended"; - -import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { UserId } from "@bitwarden/common/types/guid"; -import { biometrics, passwords } from "@bitwarden/desktop-napi"; -import { BiometricsStatus, BiometricStateService } from "@bitwarden/key-management"; - -import { WindowMain } from "../../main/window.main"; - -import OsBiometricsServiceWindows from "./os-biometrics-windows.service"; - -import OsDerivedKey = biometrics.OsDerivedKey; - -jest.mock("@bitwarden/desktop-napi", () => { - return { - biometrics: { - available: jest.fn().mockResolvedValue(true), - getBiometricSecret: jest.fn().mockResolvedValue(""), - setBiometricSecret: jest.fn().mockResolvedValue(""), - deleteBiometricSecret: jest.fn(), - deriveKeyMaterial: jest.fn().mockResolvedValue({ - keyB64: "", - ivB64: "", - }), - prompt: jest.fn().mockResolvedValue(true), - }, - passwords: { - getPassword: jest.fn().mockResolvedValue(null), - deletePassword: jest.fn().mockImplementation(() => {}), - isAvailable: jest.fn(), - PASSWORD_NOT_FOUND: "Password not found", - }, - }; -}); - -describe("OsBiometricsServiceWindows", function () { - const i18nService = mock(); - const windowMain = mock(); - const browserWindow = mock(); - const encryptionService: EncryptService = mock(); - const cryptoFunctionService: CryptoFunctionService = mock(); - const biometricStateService: BiometricStateService = mock(); - const logService = mock(); - - let service: OsBiometricsServiceWindows; - - const key = new SymmetricCryptoKey(new Uint8Array(64)); - const userId = "test-user-id" as UserId; - const serviceKey = "Bitwarden_biometric"; - const storageKey = `${userId}_user_biometric`; - - beforeEach(() => { - windowMain.win = browserWindow; - - service = new OsBiometricsServiceWindows( - i18nService, - windowMain, - logService, - biometricStateService, - encryptionService, - cryptoFunctionService, - ); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - describe("getBiometricsFirstUnlockStatusForUser", () => { - const userId = "test-user-id" as UserId; - it("should return Available when client key half is set", async () => { - (service as any).clientKeyHalves = new Map(); - (service as any).clientKeyHalves.set(userId, new Uint8Array([1, 2, 3, 4])); - const result = await service.getBiometricsFirstUnlockStatusForUser(userId); - expect(result).toBe(BiometricsStatus.Available); - }); - it("should return UnlockNeeded when client key half is not set", async () => { - (service as any).clientKeyHalves = new Map(); - const result = await service.getBiometricsFirstUnlockStatusForUser(userId); - expect(result).toBe(BiometricsStatus.UnlockNeeded); - }); - }); - - describe("getOrCreateBiometricEncryptionClientKeyHalf", () => { - it("should return cached key half if already present", async () => { - const cachedKeyHalf = new Uint8Array([10, 20, 30]); - (service as any).clientKeyHalves.set(userId.toString(), cachedKeyHalf); - const result = await service.getOrCreateBiometricEncryptionClientKeyHalf(userId, key); - expect(result).toBe(cachedKeyHalf); - }); - - it("should decrypt and return existing encrypted client key half", async () => { - biometricStateService.getEncryptedClientKeyHalf = jest - .fn() - .mockResolvedValue(new Uint8Array([1, 2, 3])); - const decrypted = new Uint8Array([4, 5, 6]); - encryptionService.decryptBytes = jest.fn().mockResolvedValue(decrypted); - - const result = await service.getOrCreateBiometricEncryptionClientKeyHalf(userId, key); - - expect(biometricStateService.getEncryptedClientKeyHalf).toHaveBeenCalledWith(userId); - expect(encryptionService.decryptBytes).toHaveBeenCalledWith(new Uint8Array([1, 2, 3]), key); - expect(result).toEqual(decrypted); - expect((service as any).clientKeyHalves.get(userId.toString())).toEqual(decrypted); - }); - - it("should generate, encrypt, store, and cache a new key half if none exists", async () => { - biometricStateService.getEncryptedClientKeyHalf = jest.fn().mockResolvedValue(null); - const randomBytes = new Uint8Array([7, 8, 9]); - cryptoFunctionService.randomBytes = jest.fn().mockResolvedValue(randomBytes); - const encrypted = new Uint8Array([10, 11, 12]); - encryptionService.encryptBytes = jest.fn().mockResolvedValue(encrypted); - biometricStateService.setEncryptedClientKeyHalf = jest.fn().mockResolvedValue(undefined); - - const result = await service.getOrCreateBiometricEncryptionClientKeyHalf(userId, key); - - expect(cryptoFunctionService.randomBytes).toHaveBeenCalledWith(32); - expect(encryptionService.encryptBytes).toHaveBeenCalledWith(randomBytes, key); - expect(biometricStateService.setEncryptedClientKeyHalf).toHaveBeenCalledWith( - encrypted, - userId, - ); - expect(result).toEqual(randomBytes); - expect((service as any).clientKeyHalves.get(userId.toString())).toEqual(randomBytes); - }); - }); - - describe("supportsBiometrics", () => { - it("should return true if biometrics are available", async () => { - biometrics.available = jest.fn().mockResolvedValue(true); - - const result = await service.supportsBiometrics(); - - expect(result).toBe(true); - }); - - it("should return false if biometrics are not available", async () => { - biometrics.available = jest.fn().mockResolvedValue(false); - - const result = await service.supportsBiometrics(); - - expect(result).toBe(false); - }); - }); - - describe("getBiometricKey", () => { - beforeEach(() => { - biometrics.prompt = jest.fn().mockResolvedValue(true); - }); - - it("should return null when unsuccessfully authenticated biometrics", async () => { - biometrics.prompt = jest.fn().mockResolvedValue(false); - - const result = await service.getBiometricKey(userId); - - expect(result).toBeNull(); - }); - - it.each([null, undefined, ""])( - "should throw error when no biometric key is found '%s'", - async (password) => { - passwords.getPassword = jest.fn().mockResolvedValue(password); - - await expect(service.getBiometricKey(userId)).rejects.toThrow( - "Biometric key not found for user", - ); - - expect(passwords.getPassword).toHaveBeenCalledWith(serviceKey, storageKey); - }, - ); - - it.each([[false], [true]])( - "should return the biometricKey and setBiometricSecret called if password is not encrypted and cached clientKeyHalves is %s", - async (haveClientKeyHalves) => { - const clientKeyHalveBytes = new Uint8Array([1, 2, 3]); - if (haveClientKeyHalves) { - service["clientKeyHalves"].set(userId, clientKeyHalveBytes); - } - const biometricKey = key.toBase64(); - passwords.getPassword = jest.fn().mockResolvedValue(biometricKey); - biometrics.deriveKeyMaterial = jest.fn().mockResolvedValue({ - keyB64: "testKeyB64", - ivB64: "testIvB64", - } satisfies OsDerivedKey); - - const result = await service.getBiometricKey(userId); - - expect(result.toBase64()).toBe(biometricKey); - expect(passwords.getPassword).toHaveBeenCalledWith(serviceKey, storageKey); - expect(biometrics.setBiometricSecret).toHaveBeenCalledWith( - serviceKey, - storageKey, - biometricKey, - { - osKeyPartB64: "testKeyB64", - clientKeyPartB64: haveClientKeyHalves - ? Utils.fromBufferToB64(clientKeyHalveBytes) - : undefined, - }, - "testIvB64", - ); - }, - ); - - it.each([[false], [true]])( - "should return the biometricKey if password is encrypted and cached clientKeyHalves is %s", - async (haveClientKeyHalves) => { - const clientKeyHalveBytes = new Uint8Array([1, 2, 3]); - if (haveClientKeyHalves) { - service["clientKeyHalves"].set(userId, clientKeyHalveBytes); - } - const biometricKey = key.toBase64(); - const biometricKeyEncrypted = "2.testId|data|mac"; - passwords.getPassword = jest.fn().mockResolvedValue(biometricKeyEncrypted); - biometrics.getBiometricSecret = jest.fn().mockResolvedValue(biometricKey); - biometrics.deriveKeyMaterial = jest.fn().mockResolvedValue({ - keyB64: "testKeyB64", - ivB64: "testIvB64", - } satisfies OsDerivedKey); - - const result = await service.getBiometricKey(userId); - - expect(result.toBase64()).toBe(biometricKey); - expect(passwords.getPassword).toHaveBeenCalledWith(serviceKey, storageKey); - expect(biometrics.setBiometricSecret).not.toHaveBeenCalled(); - expect(biometrics.getBiometricSecret).toHaveBeenCalledWith(serviceKey, storageKey, { - osKeyPartB64: "testKeyB64", - clientKeyPartB64: haveClientKeyHalves - ? Utils.fromBufferToB64(clientKeyHalveBytes) - : undefined, - }); - }, - ); - }); - - describe("deleteBiometricKey", () => { - const serviceName = "Bitwarden_biometric"; - const keyName = "test-user-id_user_biometric"; - - it("should delete biometric key successfully", async () => { - await service.deleteBiometricKey(userId); - - expect(passwords.deletePassword).toHaveBeenCalledWith(serviceName, keyName); - }); - - it.each([[false], [true]])("should not throw error if key found: %s", async (keyFound) => { - if (!keyFound) { - passwords.deletePassword = jest - .fn() - .mockRejectedValue(new Error(passwords.PASSWORD_NOT_FOUND)); - } - - await service.deleteBiometricKey(userId); - - expect(passwords.deletePassword).toHaveBeenCalledWith(serviceName, keyName); - if (!keyFound) { - expect(logService.debug).toHaveBeenCalledWith( - "[OsBiometricService] Biometric key %s not found for service %s.", - keyName, - serviceName, - ); - } - }); - - it("should throw error when deletePassword for key throws unexpected errors", async () => { - const error = new Error("Unexpected error"); - passwords.deletePassword = jest.fn().mockRejectedValue(error); - - await expect(service.deleteBiometricKey(userId)).rejects.toThrow(error); - - expect(passwords.deletePassword).toHaveBeenCalledWith(serviceName, keyName); - }); - }); - - describe("authenticateBiometric", () => { - const hwnd = randomBytes(32).buffer; - const consentMessage = "Test Windows Hello Consent Message"; - - beforeEach(() => { - windowMain.win.getNativeWindowHandle = jest.fn().mockReturnValue(hwnd); - i18nService.t.mockReturnValue(consentMessage); - }); - - it("should return true when biometric authentication is successful", async () => { - const result = await service.authenticateBiometric(); - - expect(result).toBe(true); - expect(biometrics.prompt).toHaveBeenCalledWith(hwnd, consentMessage); - }); - - it("should return false when biometric authentication fails", async () => { - biometrics.prompt = jest.fn().mockResolvedValue(false); - - const result = await service.authenticateBiometric(); - - expect(result).toBe(false); - expect(biometrics.prompt).toHaveBeenCalledWith(hwnd, consentMessage); - }); - }); - - describe("getStorageDetails", () => { - it.each([ - ["testClientKeyHalfB64", "testIvB64"], - [undefined, "testIvB64"], - ["testClientKeyHalfB64", null], - [undefined, null], - ])( - "should derive key material and ivB64 and return it when os key half not saved yet", - async (clientKeyHalfB64, ivB64) => { - service["setIv"](ivB64); - - const derivedKeyMaterial = { - keyB64: "derivedKeyB64", - ivB64: "derivedIvB64", - }; - biometrics.deriveKeyMaterial = jest.fn().mockResolvedValue(derivedKeyMaterial); - - const result = await service["getStorageDetails"]({ clientKeyHalfB64 }); - - expect(result).toEqual({ - key_material: { - osKeyPartB64: derivedKeyMaterial.keyB64, - clientKeyPartB64: clientKeyHalfB64, - }, - ivB64: derivedKeyMaterial.ivB64, - }); - expect(biometrics.deriveKeyMaterial).toHaveBeenCalledWith(ivB64); - expect(service["_osKeyHalf"]).toEqual(derivedKeyMaterial.keyB64); - expect(service["_iv"]).toEqual(derivedKeyMaterial.ivB64); - }, - ); - - it("should throw an error when deriving key material and returned iv is null", async () => { - service["setIv"]("testIvB64"); - - const derivedKeyMaterial = { - keyB64: "derivedKeyB64", - ivB64: null as string | undefined | null, - }; - biometrics.deriveKeyMaterial = jest.fn().mockResolvedValue(derivedKeyMaterial); - - await expect( - service["getStorageDetails"]({ clientKeyHalfB64: "testClientKeyHalfB64" }), - ).rejects.toThrow("Initialization Vector is null"); - - expect(biometrics.deriveKeyMaterial).toHaveBeenCalledWith("testIvB64"); - }); - }); - - describe("setIv", () => { - it("should set the iv and reset the osKeyHalf", () => { - const iv = "testIv"; - service["_osKeyHalf"] = "testOsKeyHalf"; - - service["setIv"](iv); - - expect(service["_iv"]).toBe(iv); - expect(service["_osKeyHalf"]).toBeNull(); - }); - - it("should set the iv to null when iv is undefined and reset the osKeyHalf", () => { - service["_osKeyHalf"] = "testOsKeyHalf"; - - service["setIv"](undefined); - - expect(service["_iv"]).toBeNull(); - expect(service["_osKeyHalf"]).toBeNull(); - }); - }); -}); diff --git a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts b/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts deleted file mode 100644 index a32d4678427..00000000000 --- a/apps/desktop/src/key-management/biometrics/os-biometrics-windows.service.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; -import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; -import { UserId } from "@bitwarden/common/types/guid"; -import { biometrics, passwords } from "@bitwarden/desktop-napi"; -import { BiometricsStatus, BiometricStateService } from "@bitwarden/key-management"; - -import { WindowMain } from "../../main/window.main"; - -import { OsBiometricService } from "./os-biometrics.service"; - -const SERVICE = "Bitwarden_biometric"; - -function getLookupKeyForUser(userId: UserId): string { - return `${userId}_user_biometric`; -} - -export default class OsBiometricsServiceWindows implements OsBiometricService { - // Use set helper method instead of direct access - private _iv: string | null = null; - // Use getKeyMaterial helper instead of direct access - private _osKeyHalf: string | null = null; - private clientKeyHalves = new Map(); - - constructor( - private i18nService: I18nService, - private windowMain: WindowMain, - private logService: LogService, - private biometricStateService: BiometricStateService, - private encryptService: EncryptService, - private cryptoFunctionService: CryptoFunctionService, - ) {} - - async enrollPersistent(userId: UserId, key: SymmetricCryptoKey): Promise {} - - async hasPersistentKey(userId: UserId): Promise { - return false; - } - - async supportsBiometrics(): Promise { - return await biometrics.available(); - } - - async getBiometricKey(userId: UserId): Promise { - const success = await this.authenticateBiometric(); - if (!success) { - return null; - } - - const value = await passwords.getPassword(SERVICE, getLookupKeyForUser(userId)); - if (value == null || value == "") { - throw new Error("Biometric key not found for user"); - } - - let clientKeyHalfB64: string | null = null; - if (this.clientKeyHalves.has(userId)) { - clientKeyHalfB64 = Utils.fromBufferToB64(this.clientKeyHalves.get(userId)!); - } - - if (!EncString.isSerializedEncString(value)) { - // Update to format encrypted with client key half - const storageDetails = await this.getStorageDetails({ - clientKeyHalfB64: clientKeyHalfB64 ?? undefined, - }); - - await biometrics.setBiometricSecret( - SERVICE, - getLookupKeyForUser(userId), - value, - storageDetails.key_material, - storageDetails.ivB64, - ); - return SymmetricCryptoKey.fromString(value); - } else { - const encValue = new EncString(value); - this.setIv(encValue.iv); - const storageDetails = await this.getStorageDetails({ - clientKeyHalfB64: clientKeyHalfB64 ?? undefined, - }); - return SymmetricCryptoKey.fromString( - await biometrics.getBiometricSecret( - SERVICE, - getLookupKeyForUser(userId), - storageDetails.key_material, - ), - ); - } - } - - async setBiometricKey(userId: UserId, key: SymmetricCryptoKey): Promise { - const clientKeyHalf = await this.getOrCreateBiometricEncryptionClientKeyHalf(userId, key); - - const storageDetails = await this.getStorageDetails({ - clientKeyHalfB64: Utils.fromBufferToB64(clientKeyHalf), - }); - await biometrics.setBiometricSecret( - SERVICE, - getLookupKeyForUser(userId), - key.toBase64(), - storageDetails.key_material, - storageDetails.ivB64, - ); - } - - async deleteBiometricKey(userId: UserId): Promise { - try { - await passwords.deletePassword(SERVICE, getLookupKeyForUser(userId)); - } catch (e) { - if (e instanceof Error && e.message === passwords.PASSWORD_NOT_FOUND) { - this.logService.debug( - "[OsBiometricService] Biometric key %s not found for service %s.", - getLookupKeyForUser(userId), - SERVICE, - ); - } else { - throw e; - } - } - } - - /** - * Prompts Windows Hello - */ - async authenticateBiometric(): Promise { - const hwnd = this.windowMain.win.getNativeWindowHandle(); - return await biometrics.prompt(hwnd, this.i18nService.t("windowsHelloConsentMessage")); - } - - private async getStorageDetails({ - clientKeyHalfB64, - }: { - clientKeyHalfB64: string | undefined; - }): Promise<{ key_material: biometrics.KeyMaterial; ivB64: string }> { - if (this._osKeyHalf == null) { - const keyMaterial = await biometrics.deriveKeyMaterial(this._iv); - this._osKeyHalf = keyMaterial.keyB64; - this._iv = keyMaterial.ivB64; - } - - if (this._iv == null) { - throw new Error("Initialization Vector is null"); - } - - const result = { - key_material: { - osKeyPartB64: this._osKeyHalf, - clientKeyPartB64: clientKeyHalfB64, - }, - ivB64: this._iv, - }; - - // napi-rs fails to convert null values - if (result.key_material.clientKeyPartB64 == null) { - delete result.key_material.clientKeyPartB64; - } - return result; - } - - // Nulls out key material in order to force a re-derive. This should only be used in getBiometricKey - // when we want to force a re-derive of the key material. - private setIv(iv?: string) { - this._iv = iv ?? null; - this._osKeyHalf = null; - } - - async needsSetup() { - return false; - } - - async canAutoSetup(): Promise { - return false; - } - - async runSetup(): Promise {} - - async getOrCreateBiometricEncryptionClientKeyHalf( - userId: UserId, - key: SymmetricCryptoKey, - ): Promise { - if (this.clientKeyHalves.has(userId)) { - return this.clientKeyHalves.get(userId)!; - } - - // Retrieve existing key half if it exists - let clientKeyHalf: Uint8Array | null = null; - const encryptedClientKeyHalf = - await this.biometricStateService.getEncryptedClientKeyHalf(userId); - if (encryptedClientKeyHalf != null) { - clientKeyHalf = await this.encryptService.decryptBytes(encryptedClientKeyHalf, key); - } - if (clientKeyHalf == null) { - // Set a key half if it doesn't exist - clientKeyHalf = await this.cryptoFunctionService.randomBytes(32); - const encKey = await this.encryptService.encryptBytes(clientKeyHalf, key); - await this.biometricStateService.setEncryptedClientKeyHalf(encKey, userId); - } - - this.clientKeyHalves.set(userId, clientKeyHalf); - - return clientKeyHalf; - } - - async getBiometricsFirstUnlockStatusForUser(userId: UserId): Promise { - if (this.clientKeyHalves.has(userId)) { - return BiometricsStatus.Available; - } else { - return BiometricsStatus.UnlockNeeded; - } - } -} diff --git a/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts b/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts index 63d2225b7c6..8e28d3ca614 100644 --- a/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts +++ b/apps/desktop/src/key-management/biometrics/renderer-biometrics.service.ts @@ -77,14 +77,6 @@ export class RendererBiometricsService extends DesktopBiometricsService { return await ipc.keyManagement.biometric.hasPersistentKey(userId); } - async enableWindowsV2Biometrics(): Promise { - return await ipc.keyManagement.biometric.enableWindowsV2Biometrics(); - } - - async isWindowsV2BiometricsEnabled(): Promise { - return await ipc.keyManagement.biometric.isWindowsV2BiometricsEnabled(); - } - async enableLinuxV2Biometrics(): Promise { return await ipc.keyManagement.biometric.enableLinuxV2Biometrics(); } diff --git a/apps/desktop/src/key-management/preload.ts b/apps/desktop/src/key-management/preload.ts index d317b1f6ce0..844a81ff8e3 100644 --- a/apps/desktop/src/key-management/preload.ts +++ b/apps/desktop/src/key-management/preload.ts @@ -61,14 +61,6 @@ const biometric = { action: BiometricAction.HasPersistentKey, userId: userId, } satisfies BiometricMessage), - enableWindowsV2Biometrics: (): Promise => - ipcRenderer.invoke("biometric", { - action: BiometricAction.EnableWindowsV2, - } satisfies BiometricMessage), - isWindowsV2BiometricsEnabled: (): Promise => - ipcRenderer.invoke("biometric", { - action: BiometricAction.IsWindowsV2Enabled, - } satisfies BiometricMessage), enableLinuxV2Biometrics: (): Promise => ipcRenderer.invoke("biometric", { action: BiometricAction.EnableLinuxV2, diff --git a/apps/desktop/src/services/biometric-message-handler.service.spec.ts b/apps/desktop/src/services/biometric-message-handler.service.spec.ts index dec1e63d5e8..49d346bfa3a 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.spec.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.spec.ts @@ -503,19 +503,4 @@ describe("BiometricMessageHandlerService", () => { }, ); }); - - describe("init", () => { - it("enables Windows v2 biometrics when feature flag enabled", async () => { - configService.getFeatureFlag.mockReturnValue(true); - - await service.init(); - expect(biometricsService.enableWindowsV2Biometrics).toHaveBeenCalled(); - }); - it("does not enable Windows v2 biometrics when feature flag disabled", async () => { - configService.getFeatureFlag.mockReturnValue(false); - - await service.init(); - expect(biometricsService.enableWindowsV2Biometrics).not.toHaveBeenCalled(); - }); - }); }); diff --git a/apps/desktop/src/services/biometric-message-handler.service.ts b/apps/desktop/src/services/biometric-message-handler.service.ts index 022ccffcc91..ca4ea14c1e0 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.ts @@ -119,13 +119,6 @@ export class BiometricMessageHandlerService { "[BiometricMessageHandlerService] Initializing biometric message handler", ); - const windowsV2Enabled = await this.configService.getFeatureFlag( - FeatureFlag.WindowsBiometricsV2, - ); - if (windowsV2Enabled) { - await this.biometricsService.enableWindowsV2Biometrics(); - } - const linuxV2Enabled = await this.configService.getFeatureFlag(FeatureFlag.LinuxBiometricsV2); if (linuxV2Enabled) { await this.biometricsService.enableLinuxV2Biometrics(); diff --git a/apps/desktop/src/types/biometric-message.ts b/apps/desktop/src/types/biometric-message.ts index 62aa9fb1ce2..7ae20945e96 100644 --- a/apps/desktop/src/types/biometric-message.ts +++ b/apps/desktop/src/types/biometric-message.ts @@ -17,9 +17,6 @@ export enum BiometricAction { EnrollPersistent = "enrollPersistent", HasPersistentKey = "hasPersistentKey", - EnableWindowsV2 = "enableWindowsV2", - IsWindowsV2Enabled = "isWindowsV2Enabled", - EnableLinuxV2 = "enableLinuxV2", IsLinuxV2Enabled = "isLinuxV2Enabled", } diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index cf60dca5d24..be2ea75203c 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -40,7 +40,6 @@ export enum FeatureFlag { EnrollAeadOnKeyRotation = "enroll-aead-on-key-rotation", ForceUpdateKDFSettings = "pm-18021-force-update-kdf-settings", PM25174_DisableType0Decryption = "pm-25174-disable-type-0-decryption", - WindowsBiometricsV2 = "pm-25373-windows-biometrics-v2", LinuxBiometricsV2 = "pm-26340-linux-biometrics-v2", UnlockWithMasterPasswordUnlockData = "pm-23246-unlock-with-master-password-unlock-data", NoLogoutOnKdfChange = "pm-23995-no-logout-on-kdf-change", @@ -140,7 +139,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.EnrollAeadOnKeyRotation]: FALSE, [FeatureFlag.ForceUpdateKDFSettings]: FALSE, [FeatureFlag.PM25174_DisableType0Decryption]: FALSE, - [FeatureFlag.WindowsBiometricsV2]: FALSE, [FeatureFlag.LinuxBiometricsV2]: FALSE, [FeatureFlag.UnlockWithMasterPasswordUnlockData]: FALSE, [FeatureFlag.NoLogoutOnKdfChange]: FALSE, From fc63c0c2cfb10350ad82fbdeca2220ed897437f1 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 1 Dec 2025 11:46:54 +0000 Subject: [PATCH 17/37] Bumped client version(s) --- 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 ff279dd64c6..cf2be624a22 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.11.2", + "version": "2025.12.0", "scripts": { "build": "npm run build:chrome", "build:bit": "npm run build:bit:chrome", diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 21a4e918535..1651f616e03 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": "Bitwarden", - "version": "2025.11.2", + "version": "2025.12.0", "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 1febac5aa95..67399192b64 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": "Bitwarden", - "version": "2025.11.2", + "version": "2025.12.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/cli/package.json b/apps/cli/package.json index d2e229f15a7..adddc99b4d7 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": "2025.11.0", + "version": "2025.12.0", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4beacdd8234..bb8118cb7eb 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": "2025.11.3", + "version": "2025.12.0", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index d16be39369d..44fdb5c23b0 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2025.11.3", + "version": "2025.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2025.11.3", + "version": "2025.12.0", "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 2f58b712a86..4c396304f4a 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": "2025.11.3", + "version": "2025.12.0", "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 c2db376e5da..344a78f2a2c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2025.11.3", + "version": "2025.12.0", "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 a7a4c704879..c7186eab53f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -194,11 +194,11 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2025.11.2" + "version": "2025.12.0" }, "apps/cli": { "name": "@bitwarden/cli", - "version": "2025.11.0", + "version": "2025.12.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@koa/multer": "4.0.0", @@ -280,7 +280,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2025.11.3", + "version": "2025.12.0", "hasInstallScript": true, "license": "GPL-3.0" }, @@ -294,7 +294,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2025.11.3" + "version": "2025.12.0" }, "libs/admin-console": { "name": "@bitwarden/admin-console", From 39a2d80b1000e4de0445acb2931a8e5dd1288ab7 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:06:45 +0000 Subject: [PATCH 18/37] Autosync the updated translations (#17749) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/desktop/src/locales/de/messages.json | 20 ++++++++++---------- apps/desktop/src/locales/pt_BR/messages.json | 10 +++++----- apps/desktop/src/locales/zh_CN/messages.json | 4 ++-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 2f8daec5b68..6fc220faded 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -70,7 +70,7 @@ } }, "noEditPermissions": { - "message": "Du bist nicht berechtigt, diesen Eintrag zu bearbeiten" + "message": "Keine Berechtigung zum Bearbeiten dieses Eintrags" }, "welcomeBack": { "message": "Willkommen zurück" @@ -2562,7 +2562,7 @@ } }, "vaultCustomTimeoutMinimum": { - "message": "Das minimal benutzerdefinierte Timeout beträgt 1 Minute." + "message": "Minimale benutzerdefinierte Timeout-Zeit beträgt 1 Minute." }, "inviteAccepted": { "message": "Einladung angenommen" @@ -4165,7 +4165,7 @@ "description": "Verb" }, "unArchive": { - "message": "Nicht mehr archivieren" + "message": "Wiederherstellen" }, "itemsInArchive": { "message": "Einträge im Archiv" @@ -4177,10 +4177,10 @@ "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Auto-Ausfüllen-Vorschlägen ausgeschlossen." }, "itemWasSentToArchive": { - "message": "Eintrag wurde ins Archiv verschoben" + "message": "Eintrag wurde archiviert" }, "itemWasUnarchived": { - "message": "Eintrag wird nicht mehr archiviert" + "message": "Eintrag wurde wiederhergestellt" }, "archiveItem": { "message": "Eintrag archivieren" @@ -4201,22 +4201,22 @@ "message": "Integrierter Authenticator" }, "secureFileStorage": { - "message": "Sicherer Dateispeicher" + "message": "Sichere Dateispeicherung" }, "emergencyAccess": { "message": "Notfallzugriff" }, "breachMonitoring": { - "message": "Datendiebstahl-Überwachung" + "message": "Datenleck-Überwachung" }, "andMoreFeatures": { - "message": "Und mehr!" + "message": "Und vieles mehr!" }, "planDescPremium": { - "message": "Umfassende Online-Sicherheit" + "message": "Kompletter Online-Sicherheitsplan" }, "upgradeToPremium": { - "message": "Upgrade auf Premium" + "message": "Auf Premium upgraden" }, "sessionTimeoutSettingsAction": { "message": "Timeout-Aktion" diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 288f8e42616..e351bfb7dba 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -287,7 +287,7 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "para evitar a perca adicional dos dados.", + "message": "para evitar a perca de dados adicionais.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -2088,16 +2088,16 @@ } }, "policyInEffectUppercase": { - "message": "Contém um ou mais caracteres em maiúsculo" + "message": "Conter um ou mais caracteres em maiúsculo" }, "policyInEffectLowercase": { - "message": "Contém um ou mais caracteres em minúsculo" + "message": "Conter um ou mais caracteres em minúsculo" }, "policyInEffectNumbers": { - "message": "Contém um ou mais números" + "message": "Conter um ou mais números" }, "policyInEffectSpecial": { - "message": "Contém um ou mais dos seguintes caracteres especiais $CHARS$", + "message": "Conter um ou mais dos seguintes caracteres especiais $CHARS$", "placeholders": { "chars": { "content": "$1", diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 5e2b7f7ff7c..70711c7aa4e 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -1387,7 +1387,7 @@ "message": "语言" }, "languageDesc": { - "message": "更改应用程序所使用的语言。重启后生效。" + "message": "更改应用程序所使用的语言。需要重启。" }, "theme": { "message": "主题" @@ -3980,7 +3980,7 @@ "message": "关于此设置" }, "permitCipherDetailsDescription": { - "message": "Bitwarden 将使用已保存的登录 URI 来识别应使用哪个图标或更改密码的 URL 来改善您的体验。当您使用此服务时,不会收集或保存任何信息。" + "message": "Bitwarden 将使用已保存的登录 URI 来确定应使用的图标或更改密码的 URL,以提升您的使用体验。使用此服务时不会收集或保存任何信息。" }, "assignToCollections": { "message": "分配到集合" From 993633097100ad5b9affb38fca1d4fe1fb359891 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:07:13 +0000 Subject: [PATCH 19/37] Autosync the updated translations (#17748) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/de/messages.json | 20 +++++++++---------- apps/browser/src/_locales/pt_BR/messages.json | 14 ++++++------- apps/browser/src/_locales/sv/messages.json | 10 +++++----- apps/browser/src/_locales/zh_CN/messages.json | 6 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 86f49bb875e..c013e4516ed 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -562,7 +562,7 @@ "description": "Verb" }, "unArchive": { - "message": "Nicht mehr archivieren" + "message": "Wiederherstellen" }, "itemsInArchive": { "message": "Einträge im Archiv" @@ -574,10 +574,10 @@ "message": "Archivierte Einträge werden hier angezeigt und von allgemeinen Suchergebnissen sowie Vorschlägen zum automatischen Ausfüllen ausgeschlossen." }, "itemWasSentToArchive": { - "message": "Eintrag wurde ins Archiv verschoben" + "message": "Eintrag wurde archiviert" }, "itemUnarchived": { - "message": "Eintrag wird nicht mehr archiviert" + "message": "Eintrag wurde wiederhergestellt" }, "archiveItem": { "message": "Eintrag archivieren" @@ -1050,7 +1050,7 @@ "message": "Eintrag gespeichert" }, "savedWebsite": { - "message": "Website gespeichert" + "message": "Gespeicherte Website" }, "savedWebsites": { "message": "Gespeicherte Websites ($COUNT$)", @@ -1710,7 +1710,7 @@ "message": "Auto-Ausfüllen bestätigen" }, "confirmAutofillDesc": { - "message": "Diese Website stimmt nicht mit deinen gespeicherten Zugangsdaten überein. Bevor du deine Zugangsdaten eingibst, stelle sicher, dass es sich um eine vertrauenswürdige Website handelt." + "message": "Diese Website stimmt nicht mit deinen gespeicherten Zugangsdaten überein. Stelle sicher, dass dies eine vertrauenswürdige Website ist, bevor du deine Zugangsdaten eingibst." }, "showInlineMenuLabel": { "message": "Vorschläge zum Auto-Ausfüllen in Formularfeldern anzeigen" @@ -1874,7 +1874,7 @@ "message": "Ablaufjahr" }, "monthly": { - "message": "month" + "message": "Monatlich" }, "expiration": { "message": "Gültig bis" @@ -2446,7 +2446,7 @@ } }, "topLayerHijackWarning": { - "message": "Diese Seite beeinträchtigt die Nutzung von Bitwarden. Das Bitwarden Inline-Menü wurde aus Sicherheitsgründen vorübergehend deaktiviert." + "message": "Diese Seite stört die Bitwarden-Nutzung. Das Bitwarden Inline-Menü wurde aus Sicherheitsgründen vorübergehend deaktiviert." }, "setMasterPassword": { "message": "Master-Passwort festlegen" @@ -4075,7 +4075,7 @@ "message": "Kein Auto-Ausfüllen möglich" }, "cannotAutofillExactMatch": { - "message": "Die Standard-Übereinstimmungserkennung steht auf \"Exakte Übereinstimmung\". Die aktuelle Website stimmt nicht genau mit den gespeicherten Zugangsdaten für diesen Eintrag überein." + "message": "Die Standard-Übereinstimmungserkennung ist auf „Exakte Übereinstimmung“ eingestellt. Die aktuelle Website stimmt nicht genau mit den gespeicherten Zugangsdaten für diesen Eintrag überein." }, "okay": { "message": "Okay" @@ -5665,7 +5665,7 @@ "message": "Phishing-Versuch erkannt" }, "phishingPageSummary": { - "message": "Die Website, die du versuchst zu öffnen, ist eine bekannte böswillige Website und ein Sicherheitsrisiko." + "message": "Die Website, die du öffnen möchtest, ist als böswillige Website bekannt und stellt ein Sicherheitsrisiko dar." }, "phishingPageCloseTabV2": { "message": "Diesen Tab schließen" @@ -5813,7 +5813,7 @@ "message": "Notfallzugriff" }, "breachMonitoring": { - "message": "Datendiebstahl-Überwachung" + "message": "Datenleck-Überwachung" }, "andMoreFeatures": { "message": "Und mehr!" diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index a7675274eae..319d415b612 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -861,7 +861,7 @@ "message": "A confirmação da senha principal não corresponde." }, "newAccountCreated": { - "message": "A sua nova conta foi criada! Agora você pode conectar-se." + "message": "A sua conta nova foi criada! Agora você pode se conectar." }, "newAccountCreated2": { "message": "Sua nova conta foi criada!" @@ -870,7 +870,7 @@ "message": "Você foi conectado!" }, "youSuccessfullyLoggedIn": { - "message": "Você conectou-se à sua conta com sucesso" + "message": "Você se conectou com sucesso" }, "youMayCloseThisWindow": { "message": "Você pode fechar esta janela" @@ -2482,16 +2482,16 @@ } }, "policyInEffectUppercase": { - "message": "Contém um ou mais caracteres em maiúsculo" + "message": "Conter um ou mais caracteres em maiúsculo" }, "policyInEffectLowercase": { - "message": "Contém um ou mais caracteres em minúsculo" + "message": "Conter um ou mais caracteres em minúsculo" }, "policyInEffectNumbers": { - "message": "Contém um ou mais números" + "message": "Conter um ou mais números" }, "policyInEffectSpecial": { - "message": "Contém um ou mais dos seguintes caracteres especiais $CHARS$", + "message": "Conter um ou mais dos seguintes caracteres especiais $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -3308,7 +3308,7 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "para evitar a perca adicional dos dados.", + "message": "para evitar a perca de dados adicionais.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 2c364f20590..f5d55585b80 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -586,7 +586,7 @@ "message": "Arkiverade objekt är exkluderade från allmänna sökresultat och förslag för autofyll. Är du säker på att du vill arkivera detta objekt?" }, "upgradeToUseArchive": { - "message": "A premium membership is required to use Archive." + "message": "Ett premium-medlemskap krävs för att använda Arkiv." }, "edit": { "message": "Redigera" @@ -598,7 +598,7 @@ "message": "Visa alla" }, "showAll": { - "message": "Show all" + "message": "Visa alla" }, "viewLess": { "message": "Visa mindre" @@ -1874,7 +1874,7 @@ "message": "Utgångsår" }, "monthly": { - "message": "month" + "message": "månad" }, "expiration": { "message": "Utgång" @@ -5825,10 +5825,10 @@ "message": "Uppgradera till Premium" }, "unlockAdvancedSecurity": { - "message": "Unlock advanced security features" + "message": "Lås upp avancerade säkerhetsfunktioner" }, "unlockAdvancedSecurityDesc": { - "message": "A Premium subscription gives you more tools to stay secure and in control" + "message": "En Premium-prenumeration ger dig fler verktyg för att hålla dig säker och ha kontroll" }, "explorePremium": { "message": "Utforska Premium" diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 92bcb8cb90f..7a0662fb9f8 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -1874,7 +1874,7 @@ "message": "过期年份" }, "monthly": { - "message": "month" + "message": "月" }, "expiration": { "message": "有效期" @@ -4894,7 +4894,7 @@ "message": "获取桌面 App" }, "getTheDesktopAppDesc": { - "message": "无需使用浏览器访问您的密码库,然后在桌面 App 和浏览器扩展中同时设置生物识别解锁,即可实现快速解锁。" + "message": "无需使用浏览器访问您的密码库。在桌面 App 和浏览器扩展中同时设置生物识别解锁,即可实现快速解锁。" }, "downloadFromBitwardenNow": { "message": "立即从 bitwarden.com 下载" @@ -5772,7 +5772,7 @@ "message": "关于此设置" }, "permitCipherDetailsDescription": { - "message": "Bitwarden 将使用已保存的登录 URI 来识别应使用哪个图标或更改密码的 URL 来改善您的体验。当您使用此服务时,不会收集或保存任何信息。" + "message": "Bitwarden 将使用已保存的登录 URI 来确定应使用的图标或更改密码的 URL,以提升您的使用体验。使用此服务时不会收集或保存任何信息。" }, "noPermissionsViewPage": { "message": "您没有查看此页面的权限。请尝试使用其他账户登录。" From d0690ebc5282aeb95ba442bf03eb71577ad0e9cf Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:07:45 +0000 Subject: [PATCH 20/37] Autosync the updated translations (#17750) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/de/messages.json | 8 ++-- apps/web/src/locales/pt_BR/messages.json | 56 ++++++++++++------------ apps/web/src/locales/zh_CN/messages.json | 24 +++++----- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 4b623bf8170..b2eb06a720e 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -21,13 +21,13 @@ "message": "Passwort-Risiko" }, "noEditPermissions": { - "message": "Du bist nicht berechtigt, diesen Eintrag zu bearbeiten" + "message": "Du hast keine Berechtigung, diesen Eintrag zu bearbeiten" }, "reviewAtRiskPasswords": { "message": "Überprüfe gefährdete Passwörter (schwach, kompromittiert oder wiederverwendet) in allen Anwendungen. Wähle deine kritischsten Anwendungen aus, um die Sicherheitsmaßnahmen für deine Benutzer zu priorisieren, um gefährdete Passwörter zu beseitigen." }, "reviewAtRiskLoginsPrompt": { - "message": "Überprüfung gefährdeter Zugangsdaten" + "message": "Gefährdete Zugangsdaten überprüfen" }, "dataLastUpdated": { "message": "Daten zuletzt aktualisiert: $DATE$", @@ -94,7 +94,7 @@ "message": "Mitglieder Aufgaben zuweisen, um den Fortschritt zu überwachen" }, "onceYouReviewApplications": { - "message": "Sobald du Anwendungen überprüft und als kritisch markiert hast, weist du deinen Mitgliedern Aufgaben zu, damit diese ihre Passwörter ändern." + "message": "Sobald du Anwendungen überprüft und als kritisch markiert hast, weise deinen Mitgliedern Aufgaben zu, um sie für das automatische Ausfüllen von Passwörtern zu aktivieren." }, "sendReminders": { "message": "Erinnerungen senden" @@ -12154,7 +12154,7 @@ "message": "Aussehen" }, "vaultTimeoutPolicyMaximumError": { - "message": "Das Timeout überschreitet die von deiner Organisation festgelegte Beschränkung: Maximal $HOURS$ Stunde(n) und $MINUTES$ Minute(n)", + "message": "Das maximale Sitzungs-Timeout, das durch die Richtlinie deiner Organisation erlaubt ist, beträgt $HOURS$ Stunde(n) und $MINUTES$ Minute(n)", "placeholders": { "hours": { "content": "$1", diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index a1fd3f271b7..653518431dc 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -3013,10 +3013,10 @@ "message": "Ocorreu um erro ao tentar carregar o relatório. Tente novamente" }, "billing": { - "message": "Cobrança" + "message": "Faturamento" }, "billingPlanLabel": { - "message": "Plano de cobrança" + "message": "Plano de faturamento" }, "paymentType": { "message": "Tipo de pagamento" @@ -3041,10 +3041,10 @@ "message": "O crédito adicionado aparecerá em sua conta após o pagamento ser totalmente processado. Alguns métodos de pagamento são mais lentos e podem levar mais tempo para processar do que outros." }, "makeSureEnoughCredit": { - "message": "Certifique-se de que sua conta tenha crédito suficiente para esta compra. Se sua conta não tiver crédito suficiente disponível, seu método de pagamento padrão será usado para completar a diferença. Você pode adicionar crédito à sua conta na página de Cobrança." + "message": "Certifique-se de que sua conta tenha crédito suficiente para esta compra. Se sua conta não tiver crédito suficiente disponível, seu método de pagamento padrão será usado para completar a diferença. Você pode adicionar crédito à sua conta na página de Faturamento." }, "notEnoughAccountCredit": { - "message": "Você não tem crédito suficiente na conta para esta compra. Você pode adicionar crédito à sua conta na página de Cobrança." + "message": "Você não tem crédito suficiente na conta para esta compra. Você pode adicionar crédito à sua conta na página de Faturamento." }, "creditAppliedDesc": { "message": "O crédito da sua conta pode ser usado para efetuar compras. Qualquer crédito disponível será automaticamente usado em faturas geradas nesta conta." @@ -3194,7 +3194,7 @@ "message": "Informações de pagamento" }, "billingInformation": { - "message": "Informações de cobrança" + "message": "Informações de faturamento" }, "billingTrialSubLabel": { "message": "Seu método de pagamento não será cobrado durante o teste grátis de 7 dias." @@ -3413,7 +3413,7 @@ "message": "Esta conta pertence à uma empresa." }, "billingEmail": { - "message": "E-mail de cobrança" + "message": "E-mail de faturamento" }, "businessName": { "message": "Nome da empresa" @@ -3607,7 +3607,7 @@ } }, "trialConfirmationEmail": { - "message": "Enviamos um e-mail de confirmação para o e-mail de cobrança da sua equipe em " + "message": "Enviamos um e-mail de confirmação para o e-mail de faturamento da sua equipe em " }, "monthly": { "message": "Mensalmente" @@ -3787,7 +3787,7 @@ "message": "Proprietário" }, "ownerDesc": { - "message": "Gerencie todos os aspectos da sua organização, incluindo cobrança e assinaturas" + "message": "Gerencie todos os aspectos da sua organização, incluindo o faturamento e as assinaturas" }, "clientOwnerDesc": { "message": "Este usuário deve ser independente do Provedor. Se o Provedor estiver desassociado da organização, este usuário manterá a propriedade da organização." @@ -5421,7 +5421,7 @@ "message": "Todos os recursos do Equipes Iniciantes, mais:" }, "chooseMonthlyOrAnnualBilling": { - "message": "Escolha cobrança mensal ou anual" + "message": "Escolha faturamento mensal ou anual" }, "abilityToAddMoreThanNMembers": { "message": "Capacidade de adicionar mais que $COUNT$ membros", @@ -6455,7 +6455,7 @@ "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "para evitar a perda adicional dos dados.", + "message": "para evitar a perca de dados adicionais.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { @@ -7146,7 +7146,7 @@ "message": "Forneça uma forma de pagamento para associar à organização. Não se preocupe, não cobraremos nada, a menos que você selecione recursos adicionais ou seu financiamento expire. " }, "orgCreatedSponsorshipInvalid": { - "message": "A oferta de financiamento expirou, você pode apagar a organização que criou para evitar uma cobrança no final do seu teste de 7 dias. Caso contrário, você pode fechar este alerta para manter a organização e assumir a responsabilidade pela cobrança." + "message": "A oferta de financiamento expirou, você pode apagar a organização que criou para evitar uma cobrança no final do seu teste de 7 dias. Caso contrário, você pode fechar este alerta para manter a organização e assumir a responsabilidade pelo faturamento." }, "newFamiliesOrganization": { "message": "Nova organização de Famílias" @@ -7405,7 +7405,7 @@ "message": "Chaves" }, "billingHistory": { - "message": "Histórico de cobrança" + "message": "Histórico de faturamento" }, "backToReports": { "message": "Voltar aos relatórios" @@ -9037,16 +9037,16 @@ "description": "Software Development Kit" }, "createAnAccount": { - "message": "Crie uma conta" + "message": "Criar uma conta" }, "createSecret": { - "message": "Crie um segredo" + "message": "Criar um segredo" }, "createProject": { - "message": "Crie um projeto" + "message": "Criar um projeto" }, "createServiceAccount": { - "message": "Crie uma conta de serviço" + "message": "Criar uma conta de serviço" }, "downloadThe": { "message": "Baixe o", @@ -9524,16 +9524,16 @@ "message": "Configure o comportamento dos conjuntos da organização" }, "allowAdminAccessToAllCollectionItemsDescription": { - "message": "Permita que proprietários e administradores gerenciem todos os conjuntos e itens pelo painel de administração" + "message": "Permitir que proprietários e administradores gerenciem todos os conjuntos e itens pelo painel de administração" }, "restrictCollectionCreationDescription": { - "message": "Restrinja a criação de conjuntos a proprietários e administradores" + "message": "Restringir a criação de conjuntos a proprietários e administradores" }, "restrictCollectionDeletionDescription": { - "message": "Restrinja o apagamento de conjuntos a proprietários e administradores" + "message": "Restringir o apagamento de conjuntos a proprietários e administradores" }, "restrictItemDeletionDescriptionStart": { - "message": "Restrinja o apagamento de itens a membros com a permissão de ", + "message": "Restringir o apagamento de itens a membros com a permissão de ", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "restrictItemDeletionDescriptionEnd": { @@ -10087,7 +10087,7 @@ "message": "Atribua projetos a esta conta de máquina. " }, "createMachineAccount": { - "message": "Crie uma conta de serviço" + "message": "Criar uma conta de máquina" }, "maPeopleWarningMessage": { "message": "Remover pessoas de uma conta de máquina não remove os tokens de acesso que elas criaram. Por melhores práticas de segurança, é recomendado revogar os tokens de acesso criados por pessoas que foram removidas de uma conta de máquina." @@ -11644,7 +11644,7 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "setupExtensionPageTitle": { - "message": "Autopreencha com segurança as suas senhas com um clique" + "message": "Preencha suas senhas com segurança em um clique" }, "setupExtensionPageDescription": { "message": "Baixe a extensão de navegador do Bitwarden e use o preenchimento automático hoje" @@ -11722,7 +11722,7 @@ } }, "billingAddressRequiredToAddCredit": { - "message": "O endereço de cobrança é necessário para adicionar créditos.", + "message": "O endereço de faturamento é necessário para adicionar créditos.", "description": "Error message shown when trying to add credit to a trialing organization without a billing address." }, "aboutThisSetting": { @@ -11732,19 +11732,19 @@ "message": "O Bitwarden usará URIs de credenciais salvas para identificar qual ícone ou URL de alteração de senha deverá ser usado para melhorar sua experiência. Nenhuma informação é coletada ou salva quando você utiliza este serviço." }, "billingAddress": { - "message": "Endereço de cobrança" + "message": "Endereço de faturamento" }, "addBillingAddress": { - "message": "Adicionar endereço de cobrança" + "message": "Adicionar endereço de faturamento" }, "editBillingAddress": { - "message": "Editar endereço de cobrança" + "message": "Editar endereço de faturamento" }, "noBillingAddress": { "message": "Nenhum endereço cadastrado." }, "billingAddressUpdated": { - "message": "Seu endereço de cobrança foi atualizado." + "message": "Seu endereço de faturamento foi atualizado." }, "paymentDetails": { "message": "Detalhes de pagamento" @@ -12067,7 +12067,7 @@ "message": "Continuar sem fazer upgrade" }, "upgradeYourPlan": { - "message": "Faça upgrade do seu plano" + "message": "Fazer upgrade" }, "upgradeNow": { "message": "Fazer upgrade agora" diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 6a436fbb4ac..53ec5f10185 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -1477,7 +1477,7 @@ "message": "移除通行密钥" }, "removePasskeyInfo": { - "message": "如果所有通行密钥被移除,不使用主密码您将无法登录新的设备。" + "message": "如果所有通行密钥被移除,没有主密码您将无法登录新的设备。" }, "passkeyLimitReachedInfo": { "message": "已达到通行密钥上限。请移除一个通行密钥后再添加其他通行密钥。" @@ -2500,7 +2500,7 @@ "message": "要强制实施 Duo 方式的两步登录,请使用下面的选项。" }, "twoStepLoginOrganizationSsoDesc": { - "message": "如果您已设置或计划设置 SSO,两步登录可能已经通过您的身份提供程序强制实施了。" + "message": "如果您已设置 SSO 或计划设置 SSO,两步登录可能已经通过您的身份提供程序强制实施了。" }, "twoStepLoginRecoveryWarning": { "message": "启用两步登录可能会将您永久锁定在 Bitwarden 账户之外。当您无法使用常规的两步登录提供程序(例如您丢失了设备)时,可以使用恢复代码访问您的账户。如果您失去对您账户的访问,Bitwarden 支持也无法帮助您。我们建议您写下或打印恢复代码,并将其妥善保管。" @@ -3694,7 +3694,7 @@ "message": "确定要移除此用户吗?" }, "removeOrgUserConfirmation": { - "message": "移除成员后,他们将不再具有对组织数据的访问权限,并且此操作无法撤销。要将此成员添加回组织,必须再次邀请他们并加入。" + "message": "移除成员后,他们将不再具有对组织数据的访问权限,并且此操作无法撤销。要将此成员添加回组织,必须再次邀请他们并重新入职。" }, "revokeUserConfirmation": { "message": "撤销成员后,他们将不再具有对组织数据的访问权限。要快速恢复此成员的访问权限,请转到「已撤销」标签页。" @@ -3802,7 +3802,7 @@ "message": "用户" }, "userDesc": { - "message": "访问并添加项目到已分配的集合" + "message": "访问项目和将项目添加到已分配的集合" }, "all": { "message": "全部" @@ -4124,7 +4124,7 @@ } }, "removeUserIdAccess": { - "message": "移除了 $ID$ 的访问权限", + "message": "移除 $ID$ 的访问权限", "placeholders": { "id": { "content": "$1", @@ -4350,10 +4350,10 @@ "message": "检查您的电子邮箱" }, "followTheLinkInTheEmailSentTo": { - "message": "点击发送到电子邮件中的链接" + "message": "点击发送到" }, "andContinueCreatingYourAccount": { - "message": "然后继续创建您的账户。" + "message": "的电子邮件中的链接,然后继续创建您的账户。" }, "noEmail": { "message": "没有收到电子邮件吗?" @@ -6385,7 +6385,7 @@ "message": "确定要移除以下用户吗?该过程可能需要几秒钟才能完成,并且不能中断或取消。" }, "removeOrgUsersConfirmation": { - "message": "移除成员后,他们将不再具有对组织数据的访问权限,并且此操作无法撤销。要将成员添加回组织,必须再次邀请他们并加入。该过程可能需要几秒钟才能完成,并且不能被中断或取消。" + "message": "移除成员后,他们将不再具有对组织数据的访问权限,并且此操作无法撤销。要将此成员添加回组织,必须再次邀请他们并重新入职。该过程可能需要几秒钟才能完成,并且不能被中断或取消。" }, "revokeUsersWarning": { "message": "撤销成员后,他们将不再具有对组织数据的访问权限。要快速恢复成员的访问权限,请转到「已撤销」标签页。该过程可能需要几秒钟才能完成,并且不能被中断或取消。" @@ -9527,13 +9527,13 @@ "message": "允许所有者和管理员从管理控制台管理所有集合和项目" }, "restrictCollectionCreationDescription": { - "message": "限制为所有者和管理员可以创建集合" + "message": "限制为仅所有者和管理员可以创建集合" }, "restrictCollectionDeletionDescription": { - "message": "限制为所有者和管理员可以删除集合" + "message": "限制为仅所有者和管理员可以删除集合" }, "restrictItemDeletionDescriptionStart": { - "message": "限制为具有以下权限的成员可以删除项目:", + "message": "限制为仅具有以下权限的成员可以删除项目:", "description": "This will be used as part of a larger sentence, broken up to allow styling of the middle portion. Full sentence: 'Restrict item deletion to members with the [Manage collection] permission'" }, "restrictItemDeletionDescriptionEnd": { @@ -11729,7 +11729,7 @@ "message": "关于此设置" }, "permitCipherDetailsDescription": { - "message": "Bitwarden 将使用已保存的登录 URI 来识别应使用哪个图标或更改密码的 URL 来改善您的体验。当您使用此服务时,不会收集或保存任何信息。" + "message": "Bitwarden 将使用已保存的登录 URI 来确定应使用的图标或更改密码的 URL,以提升您的使用体验。使用此服务时不会收集或保存任何信息。" }, "billingAddress": { "message": "计费地址" From e1d14ca7bdead0f8a2638be712f4251ba82427c9 Mon Sep 17 00:00:00 2001 From: Brandon Treston Date: Mon, 1 Dec 2025 10:20:28 -0500 Subject: [PATCH 21/37] [PM-28350] Refactor policies component (#17636) * refactor policies component * add tests * cleanup * clean up * change trackBy to * change detetction --- .../policies/policies.component.html | 33 +- .../policies/policies.component.spec.ts | 498 ++++++++++++++++++ .../policies/policies.component.ts | 157 +++--- .../auto-confirm-policy.component.ts | 13 +- .../autotype-policy.component.ts | 6 +- .../disable-send.component.ts | 6 +- .../master-password.component.ts | 6 +- .../organization-data-ownership.component.ts | 6 +- .../password-generator.component.ts | 6 +- .../remove-unlock-with-pin.component.ts | 6 +- .../require-sso.component.ts | 6 +- .../reset-password.component.ts | 6 +- .../restricted-item-types.component.ts | 6 +- .../send-options.component.ts | 6 +- .../single-org.component.ts | 6 +- .../two-factor-authentication.component.ts | 6 +- .../uri-match-default.component.ts | 1 + ...t-organization-data-ownership.component.ts | 6 +- .../activate-autofill.component.ts | 1 + .../automatic-app-login.component.ts | 1 + ...aimed-domain-account-creation.component.ts | 1 + ...disable-personal-vault-export.component.ts | 1 + 22 files changed, 643 insertions(+), 141 deletions(-) create mode 100644 apps/web/src/app/admin-console/organizations/policies/policies.component.spec.ts diff --git a/apps/web/src/app/admin-console/organizations/policies/policies.component.html b/apps/web/src/app/admin-console/organizations/policies/policies.component.html index 8df73a50e14..c38092146ab 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policies.component.html +++ b/apps/web/src/app/admin-console/organizations/policies/policies.component.html @@ -1,27 +1,34 @@ +@let organization = organization$ | async; +@let policiesEnabledMap = policiesEnabledMap$ | async; +@let organizationId = organizationId$ | async; + - @if (loading) { + @if (!organization || !policiesEnabledMap || !organizationId) { {{ "loading" | i18n }} - } - @if (!loading) { + } @else { - @for (p of policies$ | async; track p.type) { - - - - @if (policiesEnabledMap.get(p.type)) { - {{ "on" | i18n }} - } - {{ p.description | i18n }} - - + @for (p of policies$ | async; track $index) { + @if (p.display$(organization, configService) | async) { + + + + @if (policiesEnabledMap.get(p.type)) { + {{ "on" | i18n }} + } + {{ p.description | i18n }} + + + } } diff --git a/apps/web/src/app/admin-console/organizations/policies/policies.component.spec.ts b/apps/web/src/app/admin-console/organizations/policies/policies.component.spec.ts new file mode 100644 index 00000000000..0e025a9d52a --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/policies/policies.component.spec.ts @@ -0,0 +1,498 @@ +import { NO_ERRORS_SCHEMA } from "@angular/core"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ActivatedRoute } from "@angular/router"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject, of, firstValueFrom } from "rxjs"; + +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.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 { PolicyResponse } from "@bitwarden/common/admin-console/models/response/policy.response"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +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"; +import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; +import { DialogService } from "@bitwarden/components"; +import { newGuid } from "@bitwarden/guid"; + +import { BasePolicyEditDefinition } from "./base-policy-edit.component"; +import { PoliciesComponent } from "./policies.component"; +import { SingleOrgPolicy } from "./policy-edit-definitions/single-org.component"; +import { PolicyEditDialogComponent } from "./policy-edit-dialog.component"; +import { PolicyListService } from "./policy-list.service"; +import { POLICY_EDIT_REGISTER } from "./policy-register-token"; + +describe("PoliciesComponent", () => { + let component: PoliciesComponent; + let fixture: ComponentFixture; + + let mockActivatedRoute: ActivatedRoute; + let mockOrganizationService: MockProxy; + let mockAccountService: FakeAccountService; + let mockPolicyApiService: MockProxy; + let mockPolicyListService: MockProxy; + let mockDialogService: MockProxy; + let mockPolicyService: MockProxy; + let mockConfigService: MockProxy; + let mockI18nService: MockProxy; + let mockPlatformUtilsService: MockProxy; + + let routeParamsSubject: BehaviorSubject; + let queryParamsSubject: BehaviorSubject; + + const mockUserId = newGuid() as UserId; + const mockOrgId = newGuid() as OrganizationId; + const mockOrg = { + id: mockOrgId, + name: "Test Organization", + enabled: true, + } as Organization; + + const mockPolicyResponse = { + id: newGuid(), + enabled: true, + object: "policy", + organizationId: mockOrgId, + type: PolicyType.SingleOrg, + data: null, + }; + + const mockPolicy = new SingleOrgPolicy(); + + beforeEach(async () => { + routeParamsSubject = new BehaviorSubject({ organizationId: mockOrgId }); + queryParamsSubject = new BehaviorSubject({}); + + mockActivatedRoute = { + params: routeParamsSubject.asObservable(), + queryParams: queryParamsSubject.asObservable(), + } as any; + + mockOrganizationService = mock(); + mockOrganizationService.organizations$.mockReturnValue(of([mockOrg])); + + mockAccountService = mockAccountServiceWith(mockUserId); + + mockPolicyApiService = mock(); + mockPolicyApiService.getPolicies.mockResolvedValue( + new ListResponse({ Data: [mockPolicyResponse], ContinuationToken: null }, PolicyResponse), + ); + + mockPolicyListService = mock(); + mockPolicyListService.getPolicies.mockReturnValue([mockPolicy]); + + mockDialogService = mock(); + mockDialogService.open.mockReturnValue({ close: jest.fn() } as any); + + mockPolicyService = mock(); + mockPolicyService.policies$.mockReturnValue(of([])); + + mockConfigService = mock(); + mockI18nService = mock(); + mockPlatformUtilsService = mock(); + + jest.spyOn(PolicyEditDialogComponent, "open").mockReturnValue({ close: jest.fn() } as any); + + await TestBed.configureTestingModule({ + imports: [PoliciesComponent], + providers: [ + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { provide: OrganizationService, useValue: mockOrganizationService }, + { provide: AccountService, useValue: mockAccountService }, + { provide: PolicyApiServiceAbstraction, useValue: mockPolicyApiService }, + { provide: PolicyListService, useValue: mockPolicyListService }, + { provide: DialogService, useValue: mockDialogService }, + { provide: PolicyService, useValue: mockPolicyService }, + { provide: ConfigService, useValue: mockConfigService }, + { provide: I18nService, useValue: mockI18nService }, + { provide: PlatformUtilsService, useValue: mockPlatformUtilsService }, + { provide: POLICY_EDIT_REGISTER, useValue: [] }, + ], + schemas: [NO_ERRORS_SCHEMA], + }) + .overrideComponent(PoliciesComponent, { + remove: { imports: [] }, + add: { template: "
" }, + }) + .compileComponents(); + + fixture = TestBed.createComponent(PoliciesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + afterEach(() => { + if (fixture) { + fixture.destroy(); + } + jest.restoreAllMocks(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + describe("organizationId$", () => { + it("should extract organizationId from route params", async () => { + const orgId = await firstValueFrom(component.organizationId$); + expect(orgId).toBe(mockOrgId); + }); + + it("should emit new organizationId when route params change", (done) => { + const newOrgId = newGuid() as OrganizationId; + const emittedValues: OrganizationId[] = []; + + const subscription = component.organizationId$.subscribe((orgId) => { + emittedValues.push(orgId); + + if (emittedValues.length === 2) { + expect(emittedValues[0]).toBe(mockOrgId); + expect(emittedValues[1]).toBe(newOrgId); + subscription.unsubscribe(); + done(); + } + }); + + routeParamsSubject.next({ organizationId: newOrgId }); + }); + }); + + describe("organization$", () => { + it("should retrieve organization for current user and organizationId", async () => { + const org = await firstValueFrom(component.organization$); + expect(org).toBe(mockOrg); + expect(mockOrganizationService.organizations$).toHaveBeenCalledWith(mockUserId); + }); + + it("should throw error when organization is not found", async () => { + mockOrganizationService.organizations$.mockReturnValue(of([])); + + await expect(firstValueFrom(component.organization$)).rejects.toThrow( + "No organization found for provided userId", + ); + }); + }); + + describe("policies$", () => { + it("should return policies from PolicyListService", async () => { + const policies = await firstValueFrom(component.policies$); + + expect(policies).toBeDefined(); + expect(Array.isArray(policies)).toBe(true); + }); + }); + + describe("orgPolicies$", () => { + it("should fetch policies from API for current organization", async () => { + const mockPolicyResponsesData = [ + { + id: newGuid(), + organizationId: mockOrgId, + type: PolicyType.TwoFactorAuthentication, + enabled: true, + data: null, + }, + { + id: newGuid(), + organizationId: mockOrgId, + type: PolicyType.RequireSso, + enabled: false, + data: null, + }, + ]; + + const listResponse = new ListResponse( + { Data: mockPolicyResponsesData, ContinuationToken: null }, + PolicyResponse, + ); + + mockPolicyApiService.getPolicies.mockResolvedValue(listResponse); + + const policies = await firstValueFrom(component["orgPolicies$"]); + expect(policies).toEqual(listResponse.data); + expect(mockPolicyApiService.getPolicies).toHaveBeenCalledWith(mockOrgId); + }); + + it("should return empty array when API returns no data", async () => { + mockPolicyApiService.getPolicies.mockResolvedValue( + new ListResponse({ Data: [], ContinuationToken: null }, PolicyResponse), + ); + + const policies = await firstValueFrom(component["orgPolicies$"]); + expect(policies).toEqual([]); + }); + + it("should return empty array when API returns null data", async () => { + mockPolicyApiService.getPolicies.mockResolvedValue( + new ListResponse({ Data: null, ContinuationToken: null }, PolicyResponse), + ); + + const policies = await firstValueFrom(component["orgPolicies$"]); + expect(policies).toEqual([]); + }); + }); + + describe("policiesEnabledMap$", () => { + it("should create a map of policy types to their enabled status", async () => { + const mockPolicyResponsesData = [ + { + id: "policy-1", + organizationId: mockOrgId, + type: PolicyType.TwoFactorAuthentication, + enabled: true, + data: null, + }, + { + id: "policy-2", + organizationId: mockOrgId, + type: PolicyType.RequireSso, + enabled: false, + data: null, + }, + { + id: "policy-3", + organizationId: mockOrgId, + type: PolicyType.SingleOrg, + enabled: true, + data: null, + }, + ]; + + mockPolicyApiService.getPolicies.mockResolvedValue( + new ListResponse( + { Data: mockPolicyResponsesData, ContinuationToken: null }, + PolicyResponse, + ), + ); + + const map = await firstValueFrom(component.policiesEnabledMap$); + expect(map.size).toBe(3); + expect(map.get(PolicyType.TwoFactorAuthentication)).toBe(true); + expect(map.get(PolicyType.RequireSso)).toBe(false); + expect(map.get(PolicyType.SingleOrg)).toBe(true); + }); + + it("should create empty map when no policies exist", async () => { + mockPolicyApiService.getPolicies.mockResolvedValue( + new ListResponse({ Data: [], ContinuationToken: null }, PolicyResponse), + ); + + const map = await firstValueFrom(component.policiesEnabledMap$); + expect(map.size).toBe(0); + }); + }); + + describe("constructor subscription", () => { + it("should subscribe to policyService.policies$ on initialization", () => { + expect(mockPolicyService.policies$).toHaveBeenCalledWith(mockUserId); + }); + + it("should refresh policies when policyService emits", async () => { + const policiesSubject = new BehaviorSubject([]); + mockPolicyService.policies$.mockReturnValue(policiesSubject.asObservable()); + + let callCount = 0; + mockPolicyApiService.getPolicies.mockImplementation(() => { + callCount++; + return of(new ListResponse({ Data: [], ContinuationToken: null }, PolicyResponse)); + }); + + const newFixture = TestBed.createComponent(PoliciesComponent); + newFixture.detectChanges(); + + const initialCallCount = callCount; + + policiesSubject.next([{ type: PolicyType.TwoFactorAuthentication }]); + + expect(callCount).toBeGreaterThan(initialCallCount); + + newFixture.destroy(); + }); + }); + + describe("handleLaunchEvent", () => { + it("should open policy dialog when policyId is in query params", async () => { + const mockPolicyId = newGuid(); + const mockPolicy: BasePolicyEditDefinition = { + name: "Test Policy", + description: "Test Description", + type: PolicyType.TwoFactorAuthentication, + component: {} as any, + showDescription: true, + display$: () => of(true), + }; + + const mockPolicyResponseData = { + id: mockPolicyId, + organizationId: mockOrgId, + type: PolicyType.TwoFactorAuthentication, + enabled: true, + data: null, + }; + + queryParamsSubject.next({ policyId: mockPolicyId }); + + mockPolicyApiService.getPolicies.mockReturnValue( + of( + new ListResponse( + { Data: [mockPolicyResponseData], ContinuationToken: null }, + PolicyResponse, + ), + ), + ); + + const dialogOpenSpy = jest + .spyOn(PolicyEditDialogComponent, "open") + .mockReturnValue({ close: jest.fn() } as any); + + TestBed.resetTestingModule(); + await TestBed.configureTestingModule({ + imports: [PoliciesComponent], + providers: [ + { provide: ActivatedRoute, useValue: mockActivatedRoute }, + { provide: OrganizationService, useValue: mockOrganizationService }, + { provide: AccountService, useValue: mockAccountService }, + { provide: PolicyApiServiceAbstraction, useValue: mockPolicyApiService }, + { provide: PolicyListService, useValue: mockPolicyListService }, + { provide: DialogService, useValue: mockDialogService }, + { provide: PolicyService, useValue: mockPolicyService }, + { provide: ConfigService, useValue: mockConfigService }, + { provide: I18nService, useValue: mockI18nService }, + { provide: PlatformUtilsService, useValue: mockPlatformUtilsService }, + { provide: POLICY_EDIT_REGISTER, useValue: [mockPolicy] }, + ], + schemas: [NO_ERRORS_SCHEMA], + }) + .overrideComponent(PoliciesComponent, { + remove: { imports: [] }, + add: { template: "
" }, + }) + .compileComponents(); + + const newFixture = TestBed.createComponent(PoliciesComponent); + newFixture.detectChanges(); + + expect(dialogOpenSpy).toHaveBeenCalled(); + const callArgs = dialogOpenSpy.mock.calls[0][1]; + expect(callArgs.data?.policy.type).toBe(mockPolicy.type); + expect(callArgs.data?.organizationId).toBe(mockOrgId); + + newFixture.destroy(); + }); + + it("should not open dialog when policyId is not in query params", async () => { + const editSpy = jest.spyOn(component, "edit"); + + queryParamsSubject.next({}); + + expect(editSpy).not.toHaveBeenCalled(); + }); + + it("should not open dialog when policyId does not match any org policy", async () => { + const mockPolicy: BasePolicyEditDefinition = { + name: "Test Policy", + description: "Test Description", + type: PolicyType.TwoFactorAuthentication, + component: {} as any, + showDescription: true, + display$: () => of(true), + }; + + mockPolicyListService.getPolicies.mockReturnValue([mockPolicy]); + mockPolicyApiService.getPolicies.mockResolvedValue( + new ListResponse({ Data: [], ContinuationToken: null }, PolicyResponse), + ); + + const editSpy = jest.spyOn(component, "edit"); + + queryParamsSubject.next({ policyId: "non-existent-policy-id" }); + + expect(editSpy).not.toHaveBeenCalled(); + }); + }); + + describe("edit", () => { + it("should call dialogService.open with correct parameters when no custom dialog is specified", () => { + const mockPolicy: BasePolicyEditDefinition = { + name: "Test Policy", + description: "Test Description", + type: PolicyType.TwoFactorAuthentication, + component: {} as any, + showDescription: true, + display$: () => of(true), + }; + + const openSpy = jest.spyOn(PolicyEditDialogComponent, "open"); + + component.edit(mockPolicy, mockOrgId); + + expect(openSpy).toHaveBeenCalled(); + const callArgs = openSpy.mock.calls[0]; + expect(callArgs[1]).toEqual({ + data: { + policy: mockPolicy, + organizationId: mockOrgId, + }, + }); + }); + + it("should call custom dialog open method when specified", () => { + const mockDialogRef = { close: jest.fn() }; + const mockCustomDialog = { + open: jest.fn().mockReturnValue(mockDialogRef), + }; + + const mockPolicy: BasePolicyEditDefinition = { + name: "Custom Policy", + description: "Custom Description", + type: PolicyType.RequireSso, + component: {} as any, + editDialogComponent: mockCustomDialog as any, + showDescription: true, + display$: () => of(true), + }; + + component.edit(mockPolicy, mockOrgId); + + expect(mockCustomDialog.open).toHaveBeenCalled(); + const callArgs = mockCustomDialog.open.mock.calls[0]; + expect(callArgs[1]).toEqual({ + data: { + policy: mockPolicy, + organizationId: mockOrgId, + }, + }); + expect(PolicyEditDialogComponent.open).not.toHaveBeenCalled(); + }); + + it("should pass correct organizationId to dialog", () => { + const customOrgId = newGuid() as OrganizationId; + const mockPolicy: BasePolicyEditDefinition = { + name: "Test Policy", + description: "Test Description", + type: PolicyType.SingleOrg, + component: {} as any, + showDescription: true, + display$: () => of(true), + }; + + const openSpy = jest.spyOn(PolicyEditDialogComponent, "open"); + + component.edit(mockPolicy, customOrgId); + + expect(openSpy).toHaveBeenCalled(); + const callArgs = openSpy.mock.calls[0]; + expect(callArgs[1]).toEqual({ + data: { + policy: mockPolicy, + organizationId: customOrgId, + }, + }); + }); + }); +}); diff --git a/apps/web/src/app/admin-console/organizations/policies/policies.component.ts b/apps/web/src/app/admin-console/organizations/policies/policies.component.ts index e80796fd0af..70daf55f662 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policies.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policies.component.ts @@ -1,31 +1,19 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, Component, DestroyRef } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { ActivatedRoute } from "@angular/router"; -import { - combineLatest, - firstValueFrom, - Observable, - of, - switchMap, - first, - map, - withLatestFrom, - tap, -} from "rxjs"; +import { combineLatest, Observable, of, switchMap, first, map } from "rxjs"; -import { - getOrganizationById, - OrganizationService, -} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.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 { PolicyResponse } from "@bitwarden/common/admin-console/models/response/policy.response"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { getById } from "@bitwarden/common/platform/misc"; +import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { DialogService } from "@bitwarden/components"; import { safeProvider } from "@bitwarden/ui-common"; @@ -37,8 +25,6 @@ import { PolicyEditDialogComponent } from "./policy-edit-dialog.component"; import { PolicyListService } from "./policy-list.service"; import { POLICY_EDIT_REGISTER } from "./policy-register-token"; -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ templateUrl: "policies.component.html", imports: [SharedModule, HeaderModule], @@ -48,14 +34,53 @@ import { POLICY_EDIT_REGISTER } from "./policy-register-token"; deps: [POLICY_EDIT_REGISTER], }), ], + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PoliciesComponent implements OnInit { - loading = true; - organizationId: string; - policies$: Observable; +export class PoliciesComponent { + private userId$: Observable = this.accountService.activeAccount$.pipe(getUserId); - private orgPolicies: PolicyResponse[]; - protected policiesEnabledMap: Map = new Map(); + protected organizationId$: Observable = this.route.params.pipe( + map((params) => params.organizationId), + ); + + protected organization$: Observable = combineLatest([ + this.userId$, + this.organizationId$, + ]).pipe( + switchMap(([userId, orgId]) => + this.organizationService.organizations$(userId).pipe( + getById(orgId), + map((org) => { + if (org == null) { + throw new Error("No organization found for provided userId"); + } + return org; + }), + ), + ), + ); + + protected policies$: Observable = of( + this.policyListService.getPolicies(), + ); + + private orgPolicies$: Observable = this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => this.policyService.policies$(userId)), + switchMap(() => this.organizationId$), + switchMap((organizationId) => this.policyApiService.getPolicies(organizationId)), + map((response) => (response.data != null && response.data.length > 0 ? response.data : [])), + ); + + protected policiesEnabledMap$: Observable> = this.orgPolicies$.pipe( + map((orgPolicies) => { + const policiesEnabledMap: Map = new Map(); + orgPolicies.forEach((op) => { + policiesEnabledMap.set(op.type, op.enabled); + }); + return policiesEnabledMap; + }), + ); constructor( private route: ActivatedRoute, @@ -66,60 +91,28 @@ export class PoliciesComponent implements OnInit { private dialogService: DialogService, private policyService: PolicyService, protected configService: ConfigService, + private destroyRef: DestroyRef, ) { - this.accountService.activeAccount$ - .pipe( - getUserId, - switchMap((userId) => this.policyService.policies$(userId)), - tap(async () => await this.load()), - takeUntilDestroyed(), - ) - .subscribe(); + this.handleLaunchEvent(); } - async ngOnInit() { - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe - this.route.parent.parent.params.subscribe(async (params) => { - this.organizationId = params.organizationId; - const userId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); - - const organization$ = this.organizationService - .organizations$(userId) - .pipe(getOrganizationById(this.organizationId)); - - this.policies$ = organization$.pipe( - withLatestFrom(of(this.policyListService.getPolicies())), - switchMap(([organization, policies]) => { - return combineLatest( - policies.map((policy) => - policy - .display$(organization, this.configService) - .pipe(map((shouldDisplay) => ({ policy, shouldDisplay }))), - ), - ); - }), - map((results) => - results.filter((result) => result.shouldDisplay).map((result) => result.policy), - ), - ); - - await this.load(); - - // Handle policies component launch from Event message - combineLatest([this.route.queryParams.pipe(first()), this.policies$]) - /* eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe, rxjs/no-nested-subscribe */ - .subscribe(async ([qParams, policies]) => { + // Handle policies component launch from Event message + private handleLaunchEvent() { + combineLatest([ + this.route.queryParams.pipe(first()), + this.policies$, + this.organizationId$, + this.orgPolicies$, + ]) + .pipe( + map(([qParams, policies, organizationId, orgPolicies]) => { if (qParams.policyId != null) { const policyIdFromEvents: string = qParams.policyId; - for (const orgPolicy of this.orgPolicies) { + for (const orgPolicy of orgPolicies) { if (orgPolicy.id === policyIdFromEvents) { for (let i = 0; i < policies.length; i++) { if (policies[i].type === orgPolicy.type) { - // 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.edit(policies[i]); + this.edit(policies[i], organizationId); break; } } @@ -127,27 +120,19 @@ export class PoliciesComponent implements OnInit { } } } - }); - }); + }), + takeUntilDestroyed(this.destroyRef), + ) + .subscribe(); } - async load() { - const response = await this.policyApiService.getPolicies(this.organizationId); - this.orgPolicies = response.data != null && response.data.length > 0 ? response.data : []; - this.orgPolicies.forEach((op) => { - this.policiesEnabledMap.set(op.type, op.enabled); - }); - - this.loading = false; - } - - async edit(policy: BasePolicyEditDefinition) { + edit(policy: BasePolicyEditDefinition, organizationId: OrganizationId) { const dialogComponent: PolicyDialogComponent = policy.editDialogComponent ?? PolicyEditDialogComponent; dialogComponent.open(this.dialogService, { data: { policy: policy, - organizationId: this.organizationId, + organizationId: organizationId, }, }); } diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts index 7fa4fc2eea7..cf2a2929905 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts @@ -1,4 +1,11 @@ -import { Component, OnInit, Signal, TemplateRef, viewChild } from "@angular/core"; +import { + ChangeDetectionStrategy, + Component, + OnInit, + Signal, + TemplateRef, + viewChild, +} from "@angular/core"; import { BehaviorSubject, map, Observable } from "rxjs"; import { AutoConfirmSvg } from "@bitwarden/assets/svg"; @@ -26,11 +33,11 @@ export class AutoConfirmPolicy extends BasePolicyEditDefinition { } } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "auto-confirm-policy-edit", templateUrl: "auto-confirm-policy.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AutoConfirmPolicyEditComponent extends BasePolicyEditComponent implements OnInit { protected readonly autoConfirmSvg = AutoConfirmSvg; diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/autotype-policy.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/autotype-policy.component.ts index ceace60cd99..809ffd39a64 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/autotype-policy.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/autotype-policy.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; @@ -18,10 +18,10 @@ export class DesktopAutotypeDefaultSettingPolicy extends BasePolicyEditDefinitio return configService.getFeatureFlag$(FeatureFlag.WindowsDesktopAutotype); } } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "autotype-policy-edit", templateUrl: "autotype-policy.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class DesktopAutotypeDefaultSettingPolicyComponent extends BasePolicyEditComponent {} diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/disable-send.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/disable-send.component.ts index 103420fbf51..d5d4a207598 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/disable-send.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/disable-send.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -12,10 +12,10 @@ export class DisableSendPolicy extends BasePolicyEditDefinition { component = DisableSendPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "disable-send-policy-edit", templateUrl: "disable-send.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class DisableSendPolicyComponent extends BasePolicyEditComponent {} diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/master-password.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/master-password.component.ts index c1223a2004b..e9926b2aeb1 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/master-password.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/master-password.component.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Component, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core"; import { FormBuilder, FormGroup, Validators } from "@angular/forms"; import { firstValueFrom } from "rxjs"; @@ -26,11 +26,11 @@ export class MasterPasswordPolicy extends BasePolicyEditDefinition { component = MasterPasswordPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "master-password-policy-edit", templateUrl: "master-password.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class MasterPasswordPolicyComponent extends BasePolicyEditComponent implements OnInit { MinPasswordLength = Utils.minimumPasswordLength; diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/organization-data-ownership.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/organization-data-ownership.component.ts index d832dff158a..ec857478a21 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/organization-data-ownership.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/organization-data-ownership.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { map, Observable } from "rxjs"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -22,10 +22,10 @@ export class OrganizationDataOwnershipPolicy extends BasePolicyEditDefinition { } } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "organization-data-ownership-policy-edit", templateUrl: "organization-data-ownership.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class OrganizationDataOwnershipPolicyComponent extends BasePolicyEditComponent {} diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/password-generator.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/password-generator.component.ts index e3a67362cc9..b338f3ec508 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/password-generator.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/password-generator.component.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { UntypedFormBuilder, Validators } from "@angular/forms"; import { BehaviorSubject, map } from "rxjs"; @@ -19,11 +19,11 @@ export class PasswordGeneratorPolicy extends BasePolicyEditDefinition { component = PasswordGeneratorPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "password-generator-policy-edit", templateUrl: "password-generator.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PasswordGeneratorPolicyComponent extends BasePolicyEditComponent { // these properties forward the application default settings to the UI diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/remove-unlock-with-pin.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/remove-unlock-with-pin.component.ts index ac768d47d6e..443a1792956 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/remove-unlock-with-pin.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/remove-unlock-with-pin.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -12,10 +12,10 @@ export class RemoveUnlockWithPinPolicy extends BasePolicyEditDefinition { component = RemoveUnlockWithPinPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "remove-unlock-with-pin-policy-edit", templateUrl: "remove-unlock-with-pin.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RemoveUnlockWithPinPolicyComponent extends BasePolicyEditComponent {} diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/require-sso.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/require-sso.component.ts index 904c29ca70d..e7cded03f11 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/require-sso.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/require-sso.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { of } from "rxjs"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -19,10 +19,10 @@ export class RequireSsoPolicy extends BasePolicyEditDefinition { } } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "require-sso-policy-edit", templateUrl: "require-sso.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RequireSsoPolicyComponent extends BasePolicyEditComponent {} diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/reset-password.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/reset-password.component.ts index bfe149048e3..4b194075aef 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/reset-password.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/reset-password.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { firstValueFrom, of } from "rxjs"; @@ -26,11 +26,11 @@ export class ResetPasswordPolicy extends BasePolicyEditDefinition { } } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "reset-password-policy-edit", templateUrl: "reset-password.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ResetPasswordPolicyComponent extends BasePolicyEditComponent implements OnInit { data = this.formBuilder.group({ diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/restricted-item-types.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/restricted-item-types.component.ts index 554542f8a84..279b40ef5ee 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/restricted-item-types.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/restricted-item-types.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -12,11 +12,11 @@ export class RestrictedItemTypesPolicy extends BasePolicyEditDefinition { component = RestrictedItemTypesPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "restricted-item-types-policy-edit", templateUrl: "restricted-item-types.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RestrictedItemTypesPolicyComponent extends BasePolicyEditComponent { constructor() { diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/send-options.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/send-options.component.ts index b8a59e8f8ef..06fd672fa4e 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/send-options.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/send-options.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { UntypedFormBuilder } from "@angular/forms"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -13,11 +13,11 @@ export class SendOptionsPolicy extends BasePolicyEditDefinition { component = SendOptionsPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "send-options-policy-edit", templateUrl: "send-options.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SendOptionsPolicyComponent extends BasePolicyEditComponent { data = this.formBuilder.group({ diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/single-org.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/single-org.component.ts index 655c5f20610..dfdb4d4ddaf 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/single-org.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/single-org.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -12,11 +12,11 @@ export class SingleOrgPolicy extends BasePolicyEditDefinition { component = SingleOrgPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "single-org-policy-edit", templateUrl: "single-org.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SingleOrgPolicyComponent extends BasePolicyEditComponent implements OnInit { async ngOnInit() { diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/two-factor-authentication.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/two-factor-authentication.component.ts index 62f3d1f3466..8700714f6f4 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/two-factor-authentication.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/two-factor-authentication.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { ChangeDetectionStrategy, Component } from "@angular/core"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -12,10 +12,10 @@ export class TwoFactorAuthenticationPolicy extends BasePolicyEditDefinition { component = TwoFactorAuthenticationPolicyComponent; } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "two-factor-authentication-policy-edit", templateUrl: "two-factor-authentication.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class TwoFactorAuthenticationPolicyComponent extends BasePolicyEditComponent {} diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/uri-match-default.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/uri-match-default.component.ts index 5c0b667bea2..d88b1d0769a 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/uri-match-default.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/uri-match-default.component.ts @@ -19,6 +19,7 @@ export class UriMatchDefaultPolicy extends BasePolicyEditDefinition { component = UriMatchDefaultPolicyComponent; } @Component({ + selector: "uri-match-default-policy-edit", changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: "uri-match-default.component.html", imports: [SharedModule], diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/vnext-organization-data-ownership.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/vnext-organization-data-ownership.component.ts index a0d425d5886..ed26dd37801 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/vnext-organization-data-ownership.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/vnext-organization-data-ownership.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, TemplateRef, ViewChild } from "@angular/core"; +import { ChangeDetectionStrategy, Component, OnInit, TemplateRef, ViewChild } from "@angular/core"; import { lastValueFrom, Observable } from "rxjs"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -34,11 +34,11 @@ export class vNextOrganizationDataOwnershipPolicy extends BasePolicyEditDefiniti } } -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "vnext-organization-data-ownership-policy-edit", templateUrl: "vnext-organization-data-ownership.component.html", imports: [SharedModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class vNextOrganizationDataOwnershipPolicyComponent extends BasePolicyEditComponent diff --git a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/activate-autofill.component.ts b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/activate-autofill.component.ts index c32eb3d935b..08fe807f669 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/activate-autofill.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/activate-autofill.component.ts @@ -24,6 +24,7 @@ export class ActivateAutofillPolicy extends BasePolicyEditDefinition { // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "activate-autofill-policy-edit", templateUrl: "activate-autofill.component.html", imports: [SharedModule], }) diff --git a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/automatic-app-login.component.ts b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/automatic-app-login.component.ts index eb82dce4383..23603490d50 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/automatic-app-login.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/automatic-app-login.component.ts @@ -20,6 +20,7 @@ export class AutomaticAppLoginPolicy extends BasePolicyEditDefinition { // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "automatic-app-login-policy-edit", templateUrl: "automatic-app-login.component.html", imports: [SharedModule], }) diff --git a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/block-claimed-domain-account-creation.component.ts b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/block-claimed-domain-account-creation.component.ts index 5e2925aa0bb..75c61e3e7e3 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/block-claimed-domain-account-creation.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/block-claimed-domain-account-creation.component.ts @@ -25,6 +25,7 @@ export class BlockClaimedDomainAccountCreationPolicy extends BasePolicyEditDefin } @Component({ + selector: "block-claimed-domain-account-creation-policy-edit", changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: "block-claimed-domain-account-creation.component.html", imports: [SharedModule], diff --git a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/disable-personal-vault-export.component.ts b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/disable-personal-vault-export.component.ts index 17e8eb055b5..0f0fc5f358d 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/disable-personal-vault-export.component.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/policies/policy-edit-definitions/disable-personal-vault-export.component.ts @@ -17,6 +17,7 @@ export class DisablePersonalVaultExportPolicy extends BasePolicyEditDefinition { // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ + selector: "disable-personal-vault-export-policy-edit", templateUrl: "disable-personal-vault-export.component.html", imports: [SharedModule], }) From b9d5724312f49ff26133ad127cfff2e59ef19e98 Mon Sep 17 00:00:00 2001 From: Brandon Treston Date: Mon, 1 Dec 2025 10:21:48 -0500 Subject: [PATCH 22/37] [PM-24011] Add handler for new policy sync push notification (#17465) * add handler for new policy sync push notification * fix story book build failure * move logic into policy service, fix tests * add account service * add missing service to clie --- .../browser/src/background/main.background.ts | 7 +- .../service-container/service-container.ts | 6 +- .../src/services/jslib-services.module.ts | 3 +- .../policy/policy.service.abstraction.ts | 5 ++ .../policy/default-policy.service.spec.ts | 10 +-- .../services/policy/default-policy.service.ts | 15 ++++- .../src/enums/notification-type.enum.ts | 2 + .../models/response/notification.response.ts | 13 ++++ ...ult-server-notifications.multiuser.spec.ts | 5 ++ ...fault-server-notifications.service.spec.ts | 67 +++++++++++++++++++ .../default-server-notifications.service.ts | 6 ++ 11 files changed, 131 insertions(+), 8 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 78b5e323798..143f5d1f6b3 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -732,7 +732,11 @@ export default class MainBackground { this.singleUserStateProvider, ); this.organizationService = new DefaultOrganizationService(this.stateProvider); - this.policyService = new DefaultPolicyService(this.stateProvider, this.organizationService); + this.policyService = new DefaultPolicyService( + this.stateProvider, + this.organizationService, + this.accountService, + ); this.vaultTimeoutSettingsService = new DefaultVaultTimeoutSettingsService( this.accountService, @@ -1196,6 +1200,7 @@ export default class MainBackground { this.webPushConnectionService, this.authRequestAnsweringService, this.configService, + this.policyService, ); this.fido2UserInterfaceService = new BrowserFido2UserInterfaceService(this.authService); diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index 122dd6ea052..c163b7581b4 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -518,7 +518,11 @@ export class ServiceContainer { this.ssoUrlService = new SsoUrlService(); this.organizationService = new DefaultOrganizationService(this.stateProvider); - this.policyService = new DefaultPolicyService(this.stateProvider, this.organizationService); + this.policyService = new DefaultPolicyService( + this.stateProvider, + this.organizationService, + this.accountService, + ); this.vaultTimeoutSettingsService = new DefaultVaultTimeoutSettingsService( this.accountService, diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index c8a70cf5af6..1589f5c5f30 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -1026,6 +1026,7 @@ const safeProviders: SafeProvider[] = [ WebPushConnectionService, AuthRequestAnsweringServiceAbstraction, ConfigService, + InternalPolicyService, ], }), safeProvider({ @@ -1064,7 +1065,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: InternalPolicyService, useClass: DefaultPolicyService, - deps: [StateProvider, OrganizationServiceAbstraction], + deps: [StateProvider, OrganizationServiceAbstraction, AccountServiceAbstraction], }), safeProvider({ provide: PolicyServiceAbstraction, diff --git a/libs/common/src/admin-console/abstractions/policy/policy.service.abstraction.ts b/libs/common/src/admin-console/abstractions/policy/policy.service.abstraction.ts index 8df7e44986b..ec67ed96d6e 100644 --- a/libs/common/src/admin-console/abstractions/policy/policy.service.abstraction.ts +++ b/libs/common/src/admin-console/abstractions/policy/policy.service.abstraction.ts @@ -101,4 +101,9 @@ export abstract class InternalPolicyService extends PolicyService { * Replace a policy in the local sync data. This does not update any policies on the server. */ abstract replace: (policies: { [id: string]: PolicyData }, userId: UserId) => Promise; + /** + * Wrapper around upsert that uses account service to sync policies for the logged in user. This comes from + * the server push notification to update local policies. + */ + abstract syncPolicy: (payload: PolicyData) => Promise; } diff --git a/libs/common/src/admin-console/services/policy/default-policy.service.spec.ts b/libs/common/src/admin-console/services/policy/default-policy.service.spec.ts index 8ce1a785516..4b59683ec0a 100644 --- a/libs/common/src/admin-console/services/policy/default-policy.service.spec.ts +++ b/libs/common/src/admin-console/services/policy/default-policy.service.spec.ts @@ -1,6 +1,8 @@ import { mock, MockProxy } from "jest-mock-extended"; import { firstValueFrom, of } from "rxjs"; +import { newGuid } from "@bitwarden/guid"; + import { FakeStateProvider, mockAccountServiceWith } from "../../../../spec"; import { FakeSingleUserState } from "../../../../spec/fake-state"; import { @@ -22,15 +24,15 @@ import { DefaultPolicyService, getFirstPolicy } from "./default-policy.service"; import { POLICIES } from "./policy-state"; describe("PolicyService", () => { - const userId = "userId" as UserId; + const userId = newGuid() as UserId; let stateProvider: FakeStateProvider; let organizationService: MockProxy; let singleUserState: FakeSingleUserState>; + const accountService = mockAccountServiceWith(userId); let policyService: DefaultPolicyService; beforeEach(() => { - const accountService = mockAccountServiceWith(userId); stateProvider = new FakeStateProvider(accountService); organizationService = mock(); singleUserState = stateProvider.singleUser.getFake(userId, POLICIES); @@ -59,7 +61,7 @@ describe("PolicyService", () => { organizationService.organizations$.calledWith(userId).mockReturnValue(organizations$); - policyService = new DefaultPolicyService(stateProvider, organizationService); + policyService = new DefaultPolicyService(stateProvider, organizationService, accountService); }); it("upsert", async () => { @@ -635,7 +637,7 @@ describe("PolicyService", () => { beforeEach(() => { stateProvider = new FakeStateProvider(mockAccountServiceWith(userId)); organizationService = mock(); - policyService = new DefaultPolicyService(stateProvider, organizationService); + policyService = new DefaultPolicyService(stateProvider, organizationService, accountService); }); it("returns undefined when there are no policies", () => { diff --git a/libs/common/src/admin-console/services/policy/default-policy.service.ts b/libs/common/src/admin-console/services/policy/default-policy.service.ts index b9d7655195b..ac3ccbc8ca0 100644 --- a/libs/common/src/admin-console/services/policy/default-policy.service.ts +++ b/libs/common/src/admin-console/services/policy/default-policy.service.ts @@ -1,4 +1,7 @@ -import { combineLatest, map, Observable, of } from "rxjs"; +import { combineLatest, firstValueFrom, map, Observable, of, switchMap } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { StateProvider } from "../../../platform/state"; import { UserId } from "../../../types/guid"; @@ -25,6 +28,7 @@ export class DefaultPolicyService implements PolicyService { constructor( private stateProvider: StateProvider, private organizationService: OrganizationService, + private accountService: AccountService, ) {} private policyState(userId: UserId) { @@ -326,4 +330,13 @@ export class DefaultPolicyService implements PolicyService { target.enforceOnLogin = Boolean(target.enforceOnLogin || source.enforceOnLogin); } } + + async syncPolicy(policyData: PolicyData) { + await firstValueFrom( + this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => this.upsert(policyData, userId)), + ), + ); + } } diff --git a/libs/common/src/enums/notification-type.enum.ts b/libs/common/src/enums/notification-type.enum.ts index e43b4612203..a10e6bf4448 100644 --- a/libs/common/src/enums/notification-type.enum.ts +++ b/libs/common/src/enums/notification-type.enum.ts @@ -33,4 +33,6 @@ export enum NotificationType { OrganizationBankAccountVerified = 23, ProviderBankAccountVerified = 24, + + SyncPolicy = 25, } diff --git a/libs/common/src/models/response/notification.response.ts b/libs/common/src/models/response/notification.response.ts index 167864208ee..2c0c0aae3f1 100644 --- a/libs/common/src/models/response/notification.response.ts +++ b/libs/common/src/models/response/notification.response.ts @@ -1,3 +1,4 @@ +import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { NotificationViewResponse as EndUserNotificationResponse } from "@bitwarden/common/vault/notifications/models"; import { NotificationType, PushNotificationLogOutReasonType } from "../../enums"; @@ -71,6 +72,9 @@ export class NotificationResponse extends BaseResponse { case NotificationType.ProviderBankAccountVerified: this.payload = new ProviderBankAccountVerifiedPushNotification(payload); break; + case NotificationType.SyncPolicy: + this.payload = new SyncPolicyNotification(payload); + break; default: break; } @@ -187,6 +191,15 @@ export class ProviderBankAccountVerifiedPushNotification extends BaseResponse { } } +export class SyncPolicyNotification extends BaseResponse { + policy: Policy; + + constructor(response: any) { + super(response); + this.policy = this.getResponseProperty("Policy"); + } +} + export class LogOutNotification extends BaseResponse { userId: string; reason?: PushNotificationLogOutReasonType; diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts index b4d47698e4d..cd1bf97150c 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts @@ -3,6 +3,7 @@ import { BehaviorSubject, bufferCount, firstValueFrom, Subject, ObservedValueOf // eslint-disable-next-line no-restricted-imports import { LogoutReason } from "@bitwarden/auth/common"; +import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; @@ -34,6 +35,7 @@ describe("DefaultServerNotificationsService (multi-user)", () => { let webPushNotificationConnectionService: MockProxy; let authRequestAnsweringService: MockProxy; let configService: MockProxy; + let policyService: MockProxy; let activeUserAccount$: BehaviorSubject>; let userAccounts$: BehaviorSubject>; @@ -136,6 +138,8 @@ describe("DefaultServerNotificationsService (multi-user)", () => { return new BehaviorSubject(flagValueByFlag[flag] ?? false) as any; }); + policyService = mock(); + defaultServerNotificationsService = new DefaultServerNotificationsService( mock(), syncService, @@ -149,6 +153,7 @@ describe("DefaultServerNotificationsService (multi-user)", () => { webPushNotificationConnectionService, authRequestAnsweringService, configService, + policyService, ); }); diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts index b2aa4fbd315..4a9b0809ac9 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts @@ -4,6 +4,8 @@ import { BehaviorSubject, bufferCount, firstValueFrom, ObservedValueOf, of, Subj // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports import { LogoutReason } from "@bitwarden/auth/common"; +import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; import { awaitAsync } from "../../../../spec"; @@ -42,6 +44,7 @@ describe("NotificationsService", () => { let webPushNotificationConnectionService: MockProxy; let authRequestAnsweringService: MockProxy; let configService: MockProxy; + let policyService: MockProxy; let activeAccount: BehaviorSubject>; let accounts: BehaviorSubject>; @@ -71,6 +74,7 @@ describe("NotificationsService", () => { webPushNotificationConnectionService = mock(); authRequestAnsweringService = mock(); configService = mock(); + policyService = mock(); // For these tests, use the active-user implementation (feature flag disabled) configService.getFeatureFlag$.mockImplementation(() => of(true)); @@ -123,6 +127,7 @@ describe("NotificationsService", () => { webPushNotificationConnectionService, authRequestAnsweringService, configService, + policyService, ); }); @@ -391,5 +396,67 @@ describe("NotificationsService", () => { expect(logoutCallback).not.toHaveBeenCalled(); }); }); + + describe("NotificationType.SyncPolicy", () => { + it("should call policyService.syncPolicy with the policy from the notification", async () => { + const mockPolicy = { + id: "policy-id", + organizationId: "org-id", + type: PolicyType.TwoFactorAuthentication, + enabled: true, + data: { test: "data" }, + }; + + policyService.syncPolicy.mockResolvedValue(); + + const notification = new NotificationResponse({ + type: NotificationType.SyncPolicy, + payload: { policy: mockPolicy }, + contextId: "different-app-id", + }); + + await sut["processNotification"](notification, mockUser1); + + expect(policyService.syncPolicy).toHaveBeenCalledTimes(1); + expect(policyService.syncPolicy).toHaveBeenCalledWith( + expect.objectContaining({ + id: mockPolicy.id, + organizationId: mockPolicy.organizationId, + type: mockPolicy.type, + enabled: mockPolicy.enabled, + data: mockPolicy.data, + }), + ); + }); + + it("should handle SyncPolicy notification with minimal policy data", async () => { + const mockPolicy = { + id: "policy-id-2", + organizationId: "org-id-2", + type: PolicyType.RequireSso, + enabled: false, + }; + + policyService.syncPolicy.mockResolvedValue(); + + const notification = new NotificationResponse({ + type: NotificationType.SyncPolicy, + payload: { policy: mockPolicy }, + contextId: "different-app-id", + }); + + await sut["processNotification"](notification, mockUser1); + + expect(policyService.syncPolicy).toHaveBeenCalledTimes(1); + expect(policyService.syncPolicy).toHaveBeenCalledWith( + expect.objectContaining({ + id: mockPolicy.id, + organizationId: mockPolicy.organizationId, + type: mockPolicy.type, + enabled: mockPolicy.enabled, + }), + ); + }); + }); }); }); diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.ts index efe0a8ae408..5ee288351d5 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.ts @@ -15,6 +15,8 @@ import { // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports import { LogoutReason } from "@bitwarden/auth/common"; +import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { PolicyData } from "@bitwarden/common/admin-console/models/data/policy.data"; import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { trackedMerge } from "@bitwarden/common/platform/misc"; @@ -67,6 +69,7 @@ export class DefaultServerNotificationsService implements ServerNotificationsSer private readonly webPushConnectionService: WebPushConnectionService, private readonly authRequestAnsweringService: AuthRequestAnsweringServiceAbstraction, private readonly configService: ConfigService, + private readonly policyService: InternalPolicyService, ) { this.notifications$ = this.configService .getFeatureFlag$(FeatureFlag.InactiveUserServerNotification) @@ -330,6 +333,9 @@ export class DefaultServerNotificationsService implements ServerNotificationsSer adminId: notification.payload.adminId, }); break; + case NotificationType.SyncPolicy: + await this.policyService.syncPolicy(PolicyData.fromPolicy(notification.payload.policy)); + break; default: break; } From 30b89d1fc228cda697d451859d5053d4b9dd3731 Mon Sep 17 00:00:00 2001 From: neuronull <9162534+neuronull@users.noreply.github.com> Date: Mon, 1 Dec 2025 07:42:12 -0800 Subject: [PATCH 23/37] Bump Rust version to 1.87.0 (#17641) * Bump Rust version to 1.87.0 * clippy * clippy * clippy --- .../desktop_native/chromium_importer/src/metadata.rs | 6 +++--- apps/desktop/desktop_native/rust-toolchain.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/desktop/desktop_native/chromium_importer/src/metadata.rs b/apps/desktop/desktop_native/chromium_importer/src/metadata.rs index 114c9f8df84..51a181f7f49 100644 --- a/apps/desktop/desktop_native/chromium_importer/src/metadata.rs +++ b/apps/desktop/desktop_native/chromium_importer/src/metadata.rs @@ -107,7 +107,7 @@ mod tests { for (key, meta) in map.iter() { assert_eq!(&meta.id, key); assert_eq!(meta.instructions, "chromium"); - assert!(meta.loaders.iter().any(|l| *l == "file")); + assert!(meta.loaders.contains(&"file")); } } @@ -147,7 +147,7 @@ mod tests { for (key, meta) in map.iter() { assert_eq!(&meta.id, key); assert_eq!(meta.instructions, "chromium"); - assert!(meta.loaders.iter().any(|l| *l == "file")); + assert!(meta.loaders.contains(&"file")); } } @@ -183,7 +183,7 @@ mod tests { for (key, meta) in map.iter() { assert_eq!(&meta.id, key); assert_eq!(meta.instructions, "chromium"); - assert!(meta.loaders.iter().any(|l| *l == "file")); + assert!(meta.loaders.contains(&"file")); } } diff --git a/apps/desktop/desktop_native/rust-toolchain.toml b/apps/desktop/desktop_native/rust-toolchain.toml index 898a61f3f4b..c1ab6b3240a 100644 --- a/apps/desktop/desktop_native/rust-toolchain.toml +++ b/apps/desktop/desktop_native/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.85.0" +channel = "1.87.0" components = [ "rustfmt", "clippy" ] profile = "minimal" From 4a2858132d13bbb1f4d38ca55350f12107deee1f Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Mon, 1 Dec 2025 11:11:25 -0500 Subject: [PATCH 24/37] [PM-28950] Add enum normalizers to protect against corrupted user data in SDK mapping (#17723) * Added normalizers to protect against corrpupted user data when mapping between client and SDK * Added comments * simplified secure note normalization --- .../src/models/domain/domain-service.ts | 27 +++++++++++++++++++ .../src/vault/enums/cipher-reprompt-type.ts | 19 +++++++++++++ .../common/src/vault/enums/field-type.enum.ts | 19 +++++++++++++ .../src/vault/enums/linked-id-type.enum.ts | 24 +++++++++++++++++ .../src/vault/enums/secure-note-type.enum.ts | 11 ++++++++ libs/common/src/vault/models/domain/cipher.ts | 10 +++---- libs/common/src/vault/models/domain/field.ts | 14 ++++++---- .../src/vault/models/domain/login-uri.ts | 7 +++-- .../src/vault/models/domain/secure-note.ts | 4 +-- 9 files changed, 121 insertions(+), 14 deletions(-) diff --git a/libs/common/src/models/domain/domain-service.ts b/libs/common/src/models/domain/domain-service.ts index a6b5ecfdaac..bfbe45450d0 100644 --- a/libs/common/src/models/domain/domain-service.ts +++ b/libs/common/src/models/domain/domain-service.ts @@ -1,3 +1,5 @@ +import { UriMatchType } from "@bitwarden/sdk-internal"; + /* See full documentation at: https://bitwarden.com/help/uri-match-detection/#match-detection-options @@ -23,3 +25,28 @@ export type UriMatchStrategySetting = (typeof UriMatchStrategy)[keyof typeof Uri // using uniqueness properties of object shape over Set for ease of state storability export type NeverDomains = { [id: string]: null | { bannerIsDismissed?: boolean } }; export type EquivalentDomains = string[][]; + +/** + * Normalizes UriMatchStrategySetting for SDK mapping. + * @param value - The URI match strategy from user data + * @returns Valid UriMatchType or undefined if invalid + */ +export function normalizeUriMatchStrategyForSdk( + value: UriMatchStrategySetting | undefined, +): UriMatchType | undefined { + if (value == null) { + return undefined; + } + + switch (value) { + case 0: // Domain + case 1: // Host + case 2: // StartsWith + case 3: // Exact + case 4: // RegularExpression + case 5: // Never + return value; + default: + return undefined; + } +} diff --git a/libs/common/src/vault/enums/cipher-reprompt-type.ts b/libs/common/src/vault/enums/cipher-reprompt-type.ts index 91b05399d32..30d99e98005 100644 --- a/libs/common/src/vault/enums/cipher-reprompt-type.ts +++ b/libs/common/src/vault/enums/cipher-reprompt-type.ts @@ -1,3 +1,5 @@ +import { CipherRepromptType as SdkCipherRepromptType } from "@bitwarden/sdk-internal"; + import { UnionOfValues } from "../types/union-of-values"; export const CipherRepromptType = { @@ -6,3 +8,20 @@ export const CipherRepromptType = { } as const; export type CipherRepromptType = UnionOfValues; + +/** + * Normalizes a CipherRepromptType value to ensure compatibility with the SDK. + * @param value - The cipher reprompt type from user data + * @returns Valid CipherRepromptType, defaults to CipherRepromptType.None if unrecognized + */ +export function normalizeCipherRepromptTypeForSdk( + value: CipherRepromptType, +): SdkCipherRepromptType { + switch (value) { + case CipherRepromptType.None: + case CipherRepromptType.Password: + return value; + default: + return CipherRepromptType.None; + } +} diff --git a/libs/common/src/vault/enums/field-type.enum.ts b/libs/common/src/vault/enums/field-type.enum.ts index 0e8e2aaca3d..3d819adbba6 100644 --- a/libs/common/src/vault/enums/field-type.enum.ts +++ b/libs/common/src/vault/enums/field-type.enum.ts @@ -1,3 +1,5 @@ +import { FieldType as SdkFieldType } from "@bitwarden/sdk-internal"; + const _FieldType = Object.freeze({ Text: 0, Hidden: 1, @@ -10,3 +12,20 @@ type _FieldType = typeof _FieldType; export type FieldType = _FieldType[keyof _FieldType]; export const FieldType: Record = _FieldType; + +/** + * Normalizes a FieldType value to ensure compatibility with the SDK. + * @param value - The field type from user data + * @returns Valid FieldType, defaults to FieldType.Text if unrecognized + */ +export function normalizeFieldTypeForSdk(value: FieldType): SdkFieldType { + switch (value) { + case FieldType.Text: + case FieldType.Hidden: + case FieldType.Boolean: + case FieldType.Linked: + return value; + default: + return FieldType.Text; + } +} diff --git a/libs/common/src/vault/enums/linked-id-type.enum.ts b/libs/common/src/vault/enums/linked-id-type.enum.ts index 20ef15e6207..38b852f94a7 100644 --- a/libs/common/src/vault/enums/linked-id-type.enum.ts +++ b/libs/common/src/vault/enums/linked-id-type.enum.ts @@ -1,3 +1,5 @@ +import { LinkedIdType as SdkLinkedIdType } from "@bitwarden/sdk-internal"; + import { UnionOfValues } from "../types/union-of-values"; export type LinkedIdType = LoginLinkedId | CardLinkedId | IdentityLinkedId; @@ -46,3 +48,25 @@ export const IdentityLinkedId = { } as const; export type IdentityLinkedId = UnionOfValues; + +/** + * Normalizes a LinkedIdType value to ensure compatibility with the SDK. + * @param value - The linked ID type from user data + * @returns Valid LinkedIdType or undefined if unrecognized + */ +export function normalizeLinkedIdTypeForSdk( + value: LinkedIdType | undefined, +): SdkLinkedIdType | undefined { + if (value == null) { + return undefined; + } + + // Check all valid LinkedId numeric values (100-418) + const allValidValues = [ + ...Object.values(LoginLinkedId), + ...Object.values(CardLinkedId), + ...Object.values(IdentityLinkedId), + ]; + + return allValidValues.includes(value) ? value : undefined; +} diff --git a/libs/common/src/vault/enums/secure-note-type.enum.ts b/libs/common/src/vault/enums/secure-note-type.enum.ts index bb5838d028c..348841c7dfc 100644 --- a/libs/common/src/vault/enums/secure-note-type.enum.ts +++ b/libs/common/src/vault/enums/secure-note-type.enum.ts @@ -1,3 +1,5 @@ +import { SecureNoteType as SdkSecureNoteType } from "@bitwarden/sdk-internal"; + import { UnionOfValues } from "../types/union-of-values"; export const SecureNoteType = { @@ -5,3 +7,12 @@ export const SecureNoteType = { } as const; export type SecureNoteType = UnionOfValues; + +/** + * Normalizes a SecureNoteType value to ensure compatibility with the SDK. + * @param value - The secure note type from user data + * @returns Valid SecureNoteType, defaults to SecureNoteType.Generic if unrecognized + */ +export function normalizeSecureNoteTypeForSdk(value: SecureNoteType): SdkSecureNoteType { + return SecureNoteType.Generic; +} diff --git a/libs/common/src/vault/models/domain/cipher.ts b/libs/common/src/vault/models/domain/cipher.ts index bbbf6a6a054..abddb73422b 100644 --- a/libs/common/src/vault/models/domain/cipher.ts +++ b/libs/common/src/vault/models/domain/cipher.ts @@ -9,7 +9,10 @@ import { Utils } from "../../../platform/misc/utils"; import Domain from "../../../platform/models/domain/domain-base"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { InitializerKey } from "../../../platform/services/cryptography/initializer-key"; -import { CipherRepromptType } from "../../enums/cipher-reprompt-type"; +import { + CipherRepromptType, + normalizeCipherRepromptTypeForSdk, +} from "../../enums/cipher-reprompt-type"; import { CipherType } from "../../enums/cipher-type"; import { conditionalEncString, encStringFrom } from "../../utils/domain-utils"; import { CipherPermissionsApi } from "../api/cipher-permissions.api"; @@ -414,10 +417,7 @@ export class Cipher extends Domain implements Decryptable { creationDate: this.creationDate.toISOString(), deletedDate: this.deletedDate?.toISOString(), archivedDate: this.archivedDate?.toISOString(), - reprompt: - this.reprompt === CipherRepromptType.Password - ? CipherRepromptType.Password - : CipherRepromptType.None, + reprompt: normalizeCipherRepromptTypeForSdk(this.reprompt), // Initialize all cipher-type-specific properties as undefined login: undefined, identity: undefined, diff --git a/libs/common/src/vault/models/domain/field.ts b/libs/common/src/vault/models/domain/field.ts index 2ee3a9af8a5..adec9263515 100644 --- a/libs/common/src/vault/models/domain/field.ts +++ b/libs/common/src/vault/models/domain/field.ts @@ -1,11 +1,16 @@ import { Jsonify } from "type-fest"; -import { Field as SdkField, LinkedIdType as SdkLinkedIdType } from "@bitwarden/sdk-internal"; +import { Field as SdkField } from "@bitwarden/sdk-internal"; import { EncString } from "../../../key-management/crypto/models/enc-string"; import Domain from "../../../platform/models/domain/domain-base"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; -import { FieldType, LinkedIdType } from "../../enums"; +import { + FieldType, + LinkedIdType, + normalizeFieldTypeForSdk, + normalizeLinkedIdTypeForSdk, +} from "../../enums"; import { conditionalEncString, encStringFrom } from "../../utils/domain-utils"; import { FieldData } from "../data/field.data"; import { FieldView } from "../view/field.view"; @@ -77,9 +82,8 @@ export class Field extends Domain { return { name: this.name?.toSdk(), value: this.value?.toSdk(), - type: this.type, - // Safe type cast: client and SDK LinkedIdType enums have identical values - linkedId: this.linkedId as unknown as SdkLinkedIdType, + type: normalizeFieldTypeForSdk(this.type), + linkedId: normalizeLinkedIdTypeForSdk(this.linkedId), }; } diff --git a/libs/common/src/vault/models/domain/login-uri.ts b/libs/common/src/vault/models/domain/login-uri.ts index cac487747f8..42acca25d6f 100644 --- a/libs/common/src/vault/models/domain/login-uri.ts +++ b/libs/common/src/vault/models/domain/login-uri.ts @@ -3,7 +3,10 @@ import { Jsonify } from "type-fest"; import { LoginUri as SdkLoginUri } from "@bitwarden/sdk-internal"; import { EncString } from "../../../key-management/crypto/models/enc-string"; -import { UriMatchStrategySetting } from "../../../models/domain/domain-service"; +import { + normalizeUriMatchStrategyForSdk, + UriMatchStrategySetting, +} from "../../../models/domain/domain-service"; import { Utils } from "../../../platform/misc/utils"; import Domain from "../../../platform/models/domain/domain-base"; import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; @@ -91,7 +94,7 @@ export class LoginUri extends Domain { return { uri: this.uri?.toSdk(), uriChecksum: this.uriChecksum?.toSdk(), - match: this.match, + match: normalizeUriMatchStrategyForSdk(this.match), }; } diff --git a/libs/common/src/vault/models/domain/secure-note.ts b/libs/common/src/vault/models/domain/secure-note.ts index fb568f482b0..688d34830db 100644 --- a/libs/common/src/vault/models/domain/secure-note.ts +++ b/libs/common/src/vault/models/domain/secure-note.ts @@ -3,7 +3,7 @@ import { Jsonify } from "type-fest"; import { SecureNote as SdkSecureNote } from "@bitwarden/sdk-internal"; import Domain from "../../../platform/models/domain/domain-base"; -import { SecureNoteType } from "../../enums"; +import { normalizeSecureNoteTypeForSdk, SecureNoteType } from "../../enums"; import { SecureNoteData } from "../data/secure-note.data"; import { SecureNoteView } from "../view/secure-note.view"; @@ -46,7 +46,7 @@ export class SecureNote extends Domain { */ toSdkSecureNote(): SdkSecureNote { return { - type: this.type, + type: normalizeSecureNoteTypeForSdk(this.type), }; } From 963a9156fb88c42a50837c9f94224fddd7085160 Mon Sep 17 00:00:00 2001 From: Bryan Cunningham Date: Mon, 1 Dec 2025 11:59:20 -0500 Subject: [PATCH 25/37] [CL-910] Use tooltip in title directive (#17084) * use tooltip in a11y directive * remove commented code * add deprecation warning to appA11yTitle directive * use label for tooltip in carousel nav * wait for timeout before assertion * remove unnecessary title directive use * fix private variable lint errors * increase tooltip show delay * fix spec delay and export as constant * use delay constant --------- Co-authored-by: Vicki League --- .../setup-extension.component.html | 2 +- .../src/a11y/a11y-title.directive.ts | 34 +++++++++---------- .../src/icon-button/icon-button.component.ts | 2 +- .../src/icon-button/icon-button.mdx | 9 ++--- .../src/tooltip/tooltip.directive.ts | 12 ++++--- libs/components/src/tooltip/tooltip.spec.ts | 14 ++++---- .../carousel/carousel.component.html | 6 ++-- 7 files changed, 38 insertions(+), 41 deletions(-) diff --git a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html index 1976321b4ee..a4b21915620 100644 --- a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html +++ b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.html @@ -2,7 +2,7 @@ *ngIf="state === SetupExtensionState.Loading" class="bwi bwi-spinner bwi-spin bwi-3x tw-text-muted" aria-hidden="true" - [appA11yTitle]="'loading' | i18n" + [title]="'loading' | i18n" >
diff --git a/libs/components/src/a11y/a11y-title.directive.ts b/libs/components/src/a11y/a11y-title.directive.ts index 75c2967805f..fa038172cb6 100644 --- a/libs/components/src/a11y/a11y-title.directive.ts +++ b/libs/components/src/a11y/a11y-title.directive.ts @@ -1,23 +1,21 @@ -import { Directive, effect, ElementRef, input } from "@angular/core"; +import { Directive } from "@angular/core"; -import { setA11yTitleAndAriaLabel } from "./set-a11y-title-and-aria-label"; +import { TooltipDirective } from "../tooltip/tooltip.directive"; +/** + * @deprecated This function is deprecated in favor of `bitTooltip`. + * Please use `bitTooltip` instead. + * + * Directive that provides accessible tooltips by internally using TooltipDirective. + * This maintains the appA11yTitle API while leveraging the enhanced tooltip functionality. + */ @Directive({ selector: "[appA11yTitle]", + hostDirectives: [ + { + directive: TooltipDirective, + inputs: ["bitTooltip: appA11yTitle", "tooltipPosition"], + }, + ], }) -export class A11yTitleDirective { - readonly title = input.required({ alias: "appA11yTitle" }); - - constructor(private el: ElementRef) { - const originalTitle = this.el.nativeElement.getAttribute("title"); - const originalAriaLabel = this.el.nativeElement.getAttribute("aria-label"); - - effect(() => { - setA11yTitleAndAriaLabel({ - element: this.el.nativeElement, - title: originalTitle ?? this.title(), - label: originalAriaLabel ?? this.title(), - }); - }); - } -} +export class A11yTitleDirective {} diff --git a/libs/components/src/icon-button/icon-button.component.ts b/libs/components/src/icon-button/icon-button.component.ts index ca0e3fb1de5..d69bae98dff 100644 --- a/libs/components/src/icon-button/icon-button.component.ts +++ b/libs/components/src/icon-button/icon-button.component.ts @@ -120,7 +120,7 @@ export class BitIconButtonComponent implements ButtonLikeAbstraction, FocusableE * label input will be used to set the `aria-label` attributes on the button. * This is for accessibility purposes, as it provides a text alternative for the icon button. * - * NOTE: It will also be used to set the `title` attribute on the button if no `title` is provided. + * NOTE: It will also be used to set the content of the tooltip on the button if no `title` is provided. */ readonly label = input(); diff --git a/libs/components/src/icon-button/icon-button.mdx b/libs/components/src/icon-button/icon-button.mdx index 3fcd4a23583..3922f137589 100644 --- a/libs/components/src/icon-button/icon-button.mdx +++ b/libs/components/src/icon-button/icon-button.mdx @@ -81,10 +81,5 @@ with less padding around the icon, such as in the navigation component. Follow guidelines outlined in the [Button docs](?path=/docs/component-library-button--doc) -Always use the `appA11yTitle` directive set to a string that describes the action of the -icon-button. This will auto assign the same string to the `title` and `aria-label` attributes. - -`aria-label` allows assistive technology to announce the action the button takes to the users. - -`title` attribute provides a user with the browser tool tip if they do not understand what the icon -is indicating. +label input will be used to set the `aria-label` attributes on the button. This is for accessibility +purposes, as it provides a text alternative for the icon button. diff --git a/libs/components/src/tooltip/tooltip.directive.ts b/libs/components/src/tooltip/tooltip.directive.ts index bcf9fc5e174..12be865243e 100644 --- a/libs/components/src/tooltip/tooltip.directive.ts +++ b/libs/components/src/tooltip/tooltip.directive.ts @@ -16,6 +16,7 @@ import { import { TooltipPositionIdentifier, tooltipPositions } from "./tooltip-positions"; import { TooltipComponent, TOOLTIP_DATA } from "./tooltip.component"; +export const TOOLTIP_DELAY_MS = 800; /** * Directive to add a tooltip to any element. The tooltip content is provided via the `bitTooltip` input. * The position of the tooltip can be set via the `tooltipPosition` input. Default position is "above-center". @@ -85,7 +86,7 @@ export class TooltipDirective implements OnInit { this.isVisible.set(false); }; - private showTooltip = () => { + protected showTooltip = () => { if (!this.overlayRef) { this.overlayRef = this.overlay.create({ ...this.defaultPopoverConfig, @@ -94,14 +95,17 @@ export class TooltipDirective implements OnInit { this.overlayRef.attach(this.tooltipPortal); } - this.isVisible.set(true); + + setTimeout(() => { + this.isVisible.set(true); + }, TOOLTIP_DELAY_MS); }; - private hideTooltip = () => { + protected hideTooltip = () => { this.destroyTooltip(); }; - private readonly resolvedDescribedByIds = computed(() => { + protected readonly resolvedDescribedByIds = computed(() => { if (this.addTooltipToDescribedby()) { if (this.currentDescribedByIds) { return `${this.currentDescribedByIds || ""} ${this.tooltipId}`; diff --git a/libs/components/src/tooltip/tooltip.spec.ts b/libs/components/src/tooltip/tooltip.spec.ts index a88424de3bb..ff73911d29d 100644 --- a/libs/components/src/tooltip/tooltip.spec.ts +++ b/libs/components/src/tooltip/tooltip.spec.ts @@ -6,11 +6,11 @@ import { } from "@angular/cdk/overlay"; import { ComponentPortal } from "@angular/cdk/portal"; import { Component } from "@angular/core"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; import { Observable, Subject } from "rxjs"; -import { TooltipDirective } from "./tooltip.directive"; +import { TooltipDirective, TOOLTIP_DELAY_MS } from "./tooltip.directive"; // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @@ -90,23 +90,25 @@ describe("TooltipDirective (visibility only)", () => { return hostDE.injector.get(TooltipDirective); } - it("sets isVisible to true on mouseenter", () => { + it("sets isVisible to true on mouseenter", fakeAsync(() => { const button: HTMLButtonElement = fixture.debugElement.query(By.css("button")).nativeElement; const directive = getDirective(); const isVisible = (directive as unknown as { isVisible: () => boolean }).isVisible; button.dispatchEvent(new Event("mouseenter")); + tick(TOOLTIP_DELAY_MS); expect(isVisible()).toBe(true); - }); + })); - it("sets isVisible to true on focus", () => { + it("sets isVisible to true on focus", fakeAsync(() => { const button: HTMLButtonElement = fixture.debugElement.query(By.css("button")).nativeElement; const directive = getDirective(); const isVisible = (directive as unknown as { isVisible: () => boolean }).isVisible; button.dispatchEvent(new Event("focus")); + tick(TOOLTIP_DELAY_MS); expect(isVisible()).toBe(true); - }); + })); }); diff --git a/libs/vault/src/components/carousel/carousel.component.html b/libs/vault/src/components/carousel/carousel.component.html index 778b70e15e2..999d7ef289a 100644 --- a/libs/vault/src/components/carousel/carousel.component.html +++ b/libs/vault/src/components/carousel/carousel.component.html @@ -12,10 +12,9 @@ bitIconButton="bwi-angle-left" class="tw-size-6 tw-p-0 tw-flex tw-items-center tw-justify-center" size="small" - [attr.label]="'back' | i18n" (click)="prevSlide()" [disabled]="selectedIndex <= 0" - appA11yTitle="{{ 'back' | i18n }}" + label="{{ 'back' | i18n }}" >
From be00be8fd8d2893a1ec347f8eca15b05043db8dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:59:40 -0500 Subject: [PATCH 26/37] [deps] Autofill: Update lit to v3.3.1 (#17541) 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 c7186eab53f..71e0d5a0781 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "koa": "2.16.3", "koa-bodyparser": "4.4.1", "koa-json": "2.0.2", - "lit": "3.3.0", + "lit": "3.3.1", "lowdb": "1.0.0", "lunr": "2.3.9", "multer": "2.0.2", @@ -28677,9 +28677,9 @@ } }, "node_modules/lit": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", - "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", + "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", "license": "BSD-3-Clause", "dependencies": { "@lit/reactive-element": "^2.1.0", diff --git a/package.json b/package.json index f905b1d25e4..61aefe8ce20 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "koa": "2.16.3", "koa-bodyparser": "4.4.1", "koa-json": "2.0.2", - "lit": "3.3.0", + "lit": "3.3.1", "lowdb": "1.0.0", "lunr": "2.3.9", "multer": "2.0.2", From d05356dbeb254a4dc24c17aa8fb341426c73d563 Mon Sep 17 00:00:00 2001 From: Isaac Ivins Date: Mon, 1 Dec 2025 13:04:07 -0500 Subject: [PATCH 27/37] [PM-27792] Scaffold layout desktop migration (#17658) Introduces foundational scaffolding for the Bitwarden Desktop application UI migration --- apps/desktop/src/app/app-routing.module.ts | 25 ++++++- .../app/layout/desktop-layout.component.html | 10 +++ .../layout/desktop-layout.component.spec.ts | 61 +++++++++++++++ .../app/layout/desktop-layout.component.ts | 18 +++++ .../layout/desktop-side-nav.component.html | 3 + .../layout/desktop-side-nav.component.spec.ts | 74 +++++++++++++++++++ .../app/layout/desktop-side-nav.component.ts | 14 ++++ .../tools/send-v2/send-v2.component.spec.ts | 22 ++++++ .../app/tools/send-v2/send-v2.component.ts | 9 +++ apps/desktop/src/locales/en/messages.json | 7 +- .../app/vault-v3/vault.component.spec.ts | 22 ++++++ .../src/vault/app/vault-v3/vault.component.ts | 9 +++ libs/common/src/enums/feature-flag.enum.ts | 6 ++ 13 files changed, 278 insertions(+), 2 deletions(-) create mode 100644 apps/desktop/src/app/layout/desktop-layout.component.html create mode 100644 apps/desktop/src/app/layout/desktop-layout.component.spec.ts create mode 100644 apps/desktop/src/app/layout/desktop-layout.component.ts create mode 100644 apps/desktop/src/app/layout/desktop-side-nav.component.html create mode 100644 apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts create mode 100644 apps/desktop/src/app/layout/desktop-side-nav.component.ts create mode 100644 apps/desktop/src/app/tools/send-v2/send-v2.component.spec.ts create mode 100644 apps/desktop/src/app/tools/send-v2/send-v2.component.ts create mode 100644 apps/desktop/src/vault/app/vault-v3/vault.component.spec.ts create mode 100644 apps/desktop/src/vault/app/vault-v3/vault.component.ts diff --git a/apps/desktop/src/app/app-routing.module.ts b/apps/desktop/src/app/app-routing.module.ts index b6e86ba19ff..8fab7df1cd8 100644 --- a/apps/desktop/src/app/app-routing.module.ts +++ b/apps/desktop/src/app/app-routing.module.ts @@ -14,6 +14,7 @@ import { } from "@bitwarden/angular/auth/guards"; import { ChangePasswordComponent } from "@bitwarden/angular/auth/password-management/change-password"; import { SetInitialPasswordComponent } from "@bitwarden/angular/auth/password-management/set-initial-password/set-initial-password.component"; +import { canAccessFeature } from "@bitwarden/angular/platform/guard/feature-flag.guard"; import { DevicesIcon, RegistrationUserAddIcon, @@ -39,15 +40,19 @@ import { TwoFactorAuthGuard, NewDeviceVerificationComponent, } from "@bitwarden/auth/angular"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { AnonLayoutWrapperComponent, AnonLayoutWrapperData } from "@bitwarden/components"; import { LockComponent, ConfirmKeyConnectorDomainComponent } from "@bitwarden/key-management-ui"; import { maxAccountsGuardFn } from "../auth/guards/max-accounts.guard"; import { RemovePasswordComponent } from "../key-management/key-connector/remove-password.component"; import { VaultV2Component } from "../vault/app/vault/vault-v2.component"; +import { VaultComponent } from "../vault/app/vault-v3/vault.component"; import { Fido2PlaceholderComponent } from "./components/fido2placeholder.component"; +import { DesktopLayoutComponent } from "./layout/desktop-layout.component"; import { SendComponent } from "./tools/send/send.component"; +import { SendV2Component } from "./tools/send-v2/send-v2.component"; /** * Data properties acceptable for use in route objects in the desktop @@ -99,7 +104,10 @@ const routes: Routes = [ { path: "vault", component: VaultV2Component, - canActivate: [authGuard], + canActivate: [ + authGuard, + canAccessFeature(FeatureFlag.DesktopUiMigrationMilestone1, false, "new-vault", false), + ], }, { path: "send", @@ -325,6 +333,21 @@ const routes: Routes = [ }, ], }, + { + path: "", + component: DesktopLayoutComponent, + canActivate: [authGuard], + children: [ + { + path: "new-vault", + component: VaultComponent, + }, + { + path: "new-sends", + component: SendV2Component, + }, + ], + }, ]; @NgModule({ diff --git a/apps/desktop/src/app/layout/desktop-layout.component.html b/apps/desktop/src/app/layout/desktop-layout.component.html new file mode 100644 index 00000000000..94b9201ae21 --- /dev/null +++ b/apps/desktop/src/app/layout/desktop-layout.component.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/desktop/src/app/layout/desktop-layout.component.spec.ts b/apps/desktop/src/app/layout/desktop-layout.component.spec.ts new file mode 100644 index 00000000000..cc2f7e58dfb --- /dev/null +++ b/apps/desktop/src/app/layout/desktop-layout.component.spec.ts @@ -0,0 +1,61 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { RouterModule } from "@angular/router"; +import { mock } from "jest-mock-extended"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { NavigationModule } from "@bitwarden/components"; + +import { DesktopLayoutComponent } from "./desktop-layout.component"; + +Object.defineProperty(window, "matchMedia", { + writable: true, + value: jest.fn().mockImplementation((query) => ({ + matches: true, + media: query, + onchange: null, + addListener: jest.fn(), + removeListener: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + })), +}); + +describe("DesktopLayoutComponent", () => { + let component: DesktopLayoutComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DesktopLayoutComponent, RouterModule.forRoot([]), NavigationModule], + providers: [ + { + provide: I18nService, + useValue: mock(), + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(DesktopLayoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("creates component", () => { + expect(component).toBeTruthy(); + }); + + it("renders bit-layout component", () => { + const compiled = fixture.nativeElement; + const layoutElement = compiled.querySelector("bit-layout"); + + expect(layoutElement).toBeTruthy(); + }); + + it("supports content projection for side-nav", () => { + const compiled = fixture.nativeElement; + const ngContent = compiled.querySelectorAll("ng-content"); + + expect(ngContent).toBeTruthy(); + }); +}); diff --git a/apps/desktop/src/app/layout/desktop-layout.component.ts b/apps/desktop/src/app/layout/desktop-layout.component.ts new file mode 100644 index 00000000000..5059a6e4d0b --- /dev/null +++ b/apps/desktop/src/app/layout/desktop-layout.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component } from "@angular/core"; +import { RouterModule } from "@angular/router"; + +import { PasswordManagerLogo } from "@bitwarden/assets/svg"; +import { LayoutComponent, NavigationModule } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; + +import { DesktopSideNavComponent } from "./desktop-side-nav.component"; + +@Component({ + selector: "app-layout", + imports: [RouterModule, I18nPipe, LayoutComponent, NavigationModule, DesktopSideNavComponent], + templateUrl: "./desktop-layout.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DesktopLayoutComponent { + protected readonly logo = PasswordManagerLogo; +} diff --git a/apps/desktop/src/app/layout/desktop-side-nav.component.html b/apps/desktop/src/app/layout/desktop-side-nav.component.html new file mode 100644 index 00000000000..ede3f9131b7 --- /dev/null +++ b/apps/desktop/src/app/layout/desktop-side-nav.component.html @@ -0,0 +1,3 @@ + + + diff --git a/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts b/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts new file mode 100644 index 00000000000..59e743f430a --- /dev/null +++ b/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts @@ -0,0 +1,74 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { mock } from "jest-mock-extended"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { NavigationModule } from "@bitwarden/components"; + +import { DesktopSideNavComponent } from "./desktop-side-nav.component"; + +Object.defineProperty(window, "matchMedia", { + writable: true, + value: jest.fn().mockImplementation((query) => ({ + matches: true, + media: query, + onchange: null, + addListener: jest.fn(), + removeListener: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + })), +}); + +describe("DesktopSideNavComponent", () => { + let component: DesktopSideNavComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DesktopSideNavComponent, NavigationModule], + providers: [ + { + provide: I18nService, + useValue: mock(), + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(DesktopSideNavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("creates component", () => { + expect(component).toBeTruthy(); + }); + + it("renders bit-side-nav component", () => { + const compiled = fixture.nativeElement; + const sideNavElement = compiled.querySelector("bit-side-nav"); + + expect(sideNavElement).toBeTruthy(); + }); + + it("uses primary variant by default", () => { + expect(component.variant()).toBe("primary"); + }); + + it("accepts variant input", () => { + fixture.componentRef.setInput("variant", "secondary"); + fixture.detectChanges(); + + expect(component.variant()).toBe("secondary"); + }); + + it("passes variant to bit-side-nav", () => { + fixture.componentRef.setInput("variant", "secondary"); + fixture.detectChanges(); + + const compiled = fixture.nativeElement; + const sideNavElement = compiled.querySelector("bit-side-nav"); + + expect(sideNavElement.getAttribute("ng-reflect-variant")).toBe("secondary"); + }); +}); diff --git a/apps/desktop/src/app/layout/desktop-side-nav.component.ts b/apps/desktop/src/app/layout/desktop-side-nav.component.ts new file mode 100644 index 00000000000..b0d9fd16fcc --- /dev/null +++ b/apps/desktop/src/app/layout/desktop-side-nav.component.ts @@ -0,0 +1,14 @@ +import { CommonModule } from "@angular/common"; +import { ChangeDetectionStrategy, Component, input } from "@angular/core"; + +import { NavigationModule, SideNavVariant } from "@bitwarden/components"; + +@Component({ + selector: "app-side-nav", + templateUrl: "desktop-side-nav.component.html", + imports: [CommonModule, NavigationModule], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DesktopSideNavComponent { + readonly variant = input("primary"); +} diff --git a/apps/desktop/src/app/tools/send-v2/send-v2.component.spec.ts b/apps/desktop/src/app/tools/send-v2/send-v2.component.spec.ts new file mode 100644 index 00000000000..8055bc07667 --- /dev/null +++ b/apps/desktop/src/app/tools/send-v2/send-v2.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { SendV2Component } from "./send-v2.component"; + +describe("SendV2Component", () => { + let component: SendV2Component; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SendV2Component], + }).compileComponents(); + + fixture = TestBed.createComponent(SendV2Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("creates component", () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/desktop/src/app/tools/send-v2/send-v2.component.ts b/apps/desktop/src/app/tools/send-v2/send-v2.component.ts new file mode 100644 index 00000000000..4840cd4cce8 --- /dev/null +++ b/apps/desktop/src/app/tools/send-v2/send-v2.component.ts @@ -0,0 +1,9 @@ +import { Component, ChangeDetectionStrategy } from "@angular/core"; + +@Component({ + selector: "app-send-v2", + imports: [], + template: "

Sends V2 Component

", + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SendV2Component {} diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 6bef882d970..f6f078611c9 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -2228,6 +2228,10 @@ "contactInfo": { "message": "Contact information" }, + "send": { + "message": "Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "allSends": { "message": "All Sends", "description": "'Sends' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -2991,7 +2995,8 @@ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." }, "vault": { - "message": "Vault" + "message": "Vault", + "description": "'Vault' is a noun and refers to the Bitwarden Vault feature." }, "loginWithMasterPassword": { "message": "Log in with master password" diff --git a/apps/desktop/src/vault/app/vault-v3/vault.component.spec.ts b/apps/desktop/src/vault/app/vault-v3/vault.component.spec.ts new file mode 100644 index 00000000000..89ba05055f8 --- /dev/null +++ b/apps/desktop/src/vault/app/vault-v3/vault.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { VaultComponent } from "./vault.component"; + +describe("VaultComponent", () => { + let component: VaultComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VaultComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(VaultComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("creates component", () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/desktop/src/vault/app/vault-v3/vault.component.ts b/apps/desktop/src/vault/app/vault-v3/vault.component.ts new file mode 100644 index 00000000000..b29b66225c7 --- /dev/null +++ b/apps/desktop/src/vault/app/vault-v3/vault.component.ts @@ -0,0 +1,9 @@ +import { ChangeDetectionStrategy, Component } from "@angular/core"; + +@Component({ + selector: "app-vault-v3", + imports: [], + template: "

Vault V3 Component

", + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class VaultComponent {} diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index be2ea75203c..6010110f069 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -72,6 +72,9 @@ export enum FeatureFlag { /* Innovation */ PM19148_InnovationArchive = "pm-19148-innovation-archive", + /* Desktop */ + DesktopUiMigrationMilestone1 = "desktop-ui-migration-milestone-1", + /* UIF */ RouterFocusManagement = "router-focus-management", } @@ -152,6 +155,9 @@ export const DefaultFeatureFlagValue = { /* Innovation */ [FeatureFlag.PM19148_InnovationArchive]: FALSE, + /* Desktop */ + [FeatureFlag.DesktopUiMigrationMilestone1]: FALSE, + /* UIF */ [FeatureFlag.RouterFocusManagement]: FALSE, } satisfies Record; From ee03c8a36aab6246902fff54fc4c93f4415004c8 Mon Sep 17 00:00:00 2001 From: Vijay Oommen Date: Mon, 1 Dec 2025 12:30:51 -0600 Subject: [PATCH 28/37] [PM-28616] Add UsePhishingBlocker in the client against organization (#17681) * PM-28616 Add UsePhishingBlocker in the client against organization * PM-28616 fixed failing unit test --- .../src/admin-console/models/data/organization.data.spec.ts | 1 + libs/common/src/admin-console/models/data/organization.data.ts | 2 ++ libs/common/src/admin-console/models/domain/organization.ts | 2 ++ .../src/admin-console/models/response/organization.response.ts | 2 ++ .../models/response/profile-organization.response.ts | 2 ++ 5 files changed, 9 insertions(+) diff --git a/libs/common/src/admin-console/models/data/organization.data.spec.ts b/libs/common/src/admin-console/models/data/organization.data.spec.ts index 53fc0d5ec3e..4b74e03db8d 100644 --- a/libs/common/src/admin-console/models/data/organization.data.spec.ts +++ b/libs/common/src/admin-console/models/data/organization.data.spec.ts @@ -64,6 +64,7 @@ describe("ORGANIZATIONS state", () => { isAdminInitiated: false, ssoEnabled: false, ssoMemberDecryptionType: undefined, + usePhishingBlocker: false, }, }; const result = sut.deserializer(JSON.parse(JSON.stringify(expectedResult))); diff --git a/libs/common/src/admin-console/models/data/organization.data.ts b/libs/common/src/admin-console/models/data/organization.data.ts index 6424947d004..de0d21fbf17 100644 --- a/libs/common/src/admin-console/models/data/organization.data.ts +++ b/libs/common/src/admin-console/models/data/organization.data.ts @@ -67,6 +67,7 @@ export class OrganizationData { isAdminInitiated: boolean; ssoEnabled: boolean; ssoMemberDecryptionType?: MemberDecryptionType; + usePhishingBlocker: boolean; constructor( response?: ProfileOrganizationResponse, @@ -135,6 +136,7 @@ export class OrganizationData { this.isAdminInitiated = response.isAdminInitiated; this.ssoEnabled = response.ssoEnabled; this.ssoMemberDecryptionType = response.ssoMemberDecryptionType; + this.usePhishingBlocker = response.usePhishingBlocker; this.isMember = options.isMember; this.isProviderUser = options.isProviderUser; diff --git a/libs/common/src/admin-console/models/domain/organization.ts b/libs/common/src/admin-console/models/domain/organization.ts index 458ae1e8f0c..b2153024ef8 100644 --- a/libs/common/src/admin-console/models/domain/organization.ts +++ b/libs/common/src/admin-console/models/domain/organization.ts @@ -98,6 +98,7 @@ export class Organization { isAdminInitiated: boolean; ssoEnabled: boolean; ssoMemberDecryptionType?: MemberDecryptionType; + usePhishingBlocker: boolean; constructor(obj?: OrganizationData) { if (obj == null) { @@ -162,6 +163,7 @@ export class Organization { this.isAdminInitiated = obj.isAdminInitiated; this.ssoEnabled = obj.ssoEnabled; this.ssoMemberDecryptionType = obj.ssoMemberDecryptionType; + this.usePhishingBlocker = obj.usePhishingBlocker; } get canAccess() { diff --git a/libs/common/src/admin-console/models/response/organization.response.ts b/libs/common/src/admin-console/models/response/organization.response.ts index 3f6443678bf..cf3ae6a90f7 100644 --- a/libs/common/src/admin-console/models/response/organization.response.ts +++ b/libs/common/src/admin-console/models/response/organization.response.ts @@ -39,6 +39,7 @@ export class OrganizationResponse extends BaseResponse { limitItemDeletion: boolean; allowAdminAccessToAllCollectionItems: boolean; useAccessIntelligence: boolean; + usePhishingBlocker: boolean; constructor(response: any) { super(response); @@ -82,5 +83,6 @@ export class OrganizationResponse extends BaseResponse { ); // Map from backend API property (UseRiskInsights) to domain model property (useAccessIntelligence) this.useAccessIntelligence = this.getResponseProperty("UseRiskInsights"); + this.usePhishingBlocker = this.getResponseProperty("UsePhishingBlocker") ?? false; } } diff --git a/libs/common/src/admin-console/models/response/profile-organization.response.ts b/libs/common/src/admin-console/models/response/profile-organization.response.ts index 268ec1e4b6e..263e8e7d6b9 100644 --- a/libs/common/src/admin-console/models/response/profile-organization.response.ts +++ b/libs/common/src/admin-console/models/response/profile-organization.response.ts @@ -62,6 +62,7 @@ export class ProfileOrganizationResponse extends BaseResponse { isAdminInitiated: boolean; ssoEnabled: boolean; ssoMemberDecryptionType?: MemberDecryptionType; + usePhishingBlocker: boolean; constructor(response: any) { super(response); @@ -135,5 +136,6 @@ export class ProfileOrganizationResponse extends BaseResponse { this.isAdminInitiated = this.getResponseProperty("IsAdminInitiated"); this.ssoEnabled = this.getResponseProperty("SsoEnabled") ?? false; this.ssoMemberDecryptionType = this.getResponseProperty("SsoMemberDecryptionType"); + this.usePhishingBlocker = this.getResponseProperty("UsePhishingBlocker") ?? false; } } From 79d518fcf716830c15880b2cf3c7aadc988f634c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:47:32 -0700 Subject: [PATCH 29/37] [deps]: Update Rust crate mockall to v0.14.0 (#17747) * [deps]: Update Rust crate mockall to v0.14.0 * fix test cases global expectations --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: neuronull <9162534+neuronull@users.noreply.github.com> --- apps/desktop/desktop_native/Cargo.lock | 8 ++++---- .../desktop_native/autotype/Cargo.toml | 2 +- .../autotype/src/windows/type_input.rs | 13 +++++++++++++ .../autotype/src/windows/window_title.rs | 19 ++++++++++++++++++- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index f6380c747d8..3b9b8c2db27 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -1863,9 +1863,9 @@ dependencies = [ [[package]] name = "mockall" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a6bfcc6c8c7eed5ee98b9c3e33adc726054389233e201c95dab2d41a3839d2" +checksum = "f58d964098a5f9c6b63d0798e5372fd04708193510a7af313c22e9f29b7b620b" dependencies = [ "cfg-if", "downcast", @@ -1877,9 +1877,9 @@ dependencies = [ [[package]] name = "mockall_derive" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ca3004c2efe9011bd4e461bd8256445052b9615405b4f7ea43fc8ca5c20898" +checksum = "ca41ce716dda6a9be188b385aa78ee5260fc25cd3802cb2a8afdc6afbe6b6dbf" dependencies = [ "cfg-if", "proc-macro2", diff --git a/apps/desktop/desktop_native/autotype/Cargo.toml b/apps/desktop/desktop_native/autotype/Cargo.toml index 267074d0bc8..580df30e72d 100644 --- a/apps/desktop/desktop_native/autotype/Cargo.toml +++ b/apps/desktop/desktop_native/autotype/Cargo.toml @@ -9,7 +9,7 @@ publish.workspace = true anyhow = { workspace = true } [target.'cfg(windows)'.dependencies] -mockall = "=0.13.1" +mockall = "=0.14.0" serial_test = "=3.2.0" tracing.workspace = true windows = { workspace = true, features = [ diff --git a/apps/desktop/desktop_native/autotype/src/windows/type_input.rs b/apps/desktop/desktop_native/autotype/src/windows/type_input.rs index 10f30f5ee4f..b2f4c6b82df 100644 --- a/apps/desktop/desktop_native/autotype/src/windows/type_input.rs +++ b/apps/desktop/desktop_native/autotype/src/windows/type_input.rs @@ -272,6 +272,7 @@ mod tests { #[serial] fn send_input_succeeds() { let ctxi = MockInputOperations::send_input_context(); + ctxi.checkpoint(); ctxi.expect().returning(|_| 1); send_input::(vec![build_unicode_input( @@ -279,6 +280,8 @@ mod tests { 0, )]) .unwrap(); + + drop(ctxi); } #[test] @@ -288,9 +291,11 @@ mod tests { )] fn send_input_fails_sent_zero() { let ctxi = MockInputOperations::send_input_context(); + ctxi.checkpoint(); ctxi.expect().returning(|_| 0); let ctxge = MockErrorOperations::get_last_error_context(); + ctxge.checkpoint(); ctxge.expect().returning(|| WIN32_ERROR(1)); send_input::(vec![build_unicode_input( @@ -298,6 +303,9 @@ mod tests { 0, )]) .unwrap(); + + drop(ctxge); + drop(ctxi); } #[test] @@ -305,9 +313,11 @@ mod tests { #[should_panic(expected = "SendInput does not match expected. sent: 2, expected: 1")] fn send_input_fails_sent_mismatch() { let ctxi = MockInputOperations::send_input_context(); + ctxi.checkpoint(); ctxi.expect().returning(|_| 2); let ctxge = MockErrorOperations::get_last_error_context(); + ctxge.checkpoint(); ctxge.expect().returning(|| WIN32_ERROR(1)); send_input::(vec![build_unicode_input( @@ -315,5 +325,8 @@ mod tests { 0, )]) .unwrap(); + + drop(ctxge); + drop(ctxi); } } diff --git a/apps/desktop/desktop_native/autotype/src/windows/window_title.rs b/apps/desktop/desktop_native/autotype/src/windows/window_title.rs index d56a811ab5c..4fc0b3bb3ad 100644 --- a/apps/desktop/desktop_native/autotype/src/windows/window_title.rs +++ b/apps/desktop/desktop_native/autotype/src/windows/window_title.rs @@ -186,6 +186,7 @@ mod tests { let mut mock_handle = MockWindowHandleOperations::new(); let ctxse = MockErrorOperations::set_last_error_context(); + ctxse.checkpoint(); ctxse .expect() .once() @@ -198,6 +199,7 @@ mod tests { .returning(|| Ok(0)); let ctxge = MockErrorOperations::get_last_error_context(); + ctxge.checkpoint(); ctxge.expect().returning(|| WIN32_ERROR(0)); let len = get_window_title_length::( @@ -206,6 +208,9 @@ mod tests { .unwrap(); assert_eq!(len, 0); + + drop(ctxge); + drop(ctxse); } #[test] @@ -215,6 +220,7 @@ mod tests { let mut mock_handle = MockWindowHandleOperations::new(); let ctxse = MockErrorOperations::set_last_error_context(); + ctxse.checkpoint(); ctxse.expect().with(predicate::eq(0)).returning(|_| {}); mock_handle @@ -223,13 +229,18 @@ mod tests { .returning(|| Ok(0)); let ctxge = MockErrorOperations::get_last_error_context(); + ctxge.checkpoint(); ctxge.expect().returning(|| WIN32_ERROR(1)); get_window_title_length::(&mock_handle) .unwrap(); + + drop(ctxge); + drop(ctxse); } #[test] + #[serial] fn get_window_title_succeeds() { let mut mock_handle = MockWindowHandleOperations::new(); @@ -246,11 +257,11 @@ mod tests { .unwrap(); assert_eq!(title.len(), 43); // That extra slot in the buffer for null char - assert_eq!(title, "*******************************************"); } #[test] + #[serial] fn get_window_title_returns_empty_string() { let mock_handle = MockWindowHandleOperations::new(); @@ -273,10 +284,13 @@ mod tests { .returning(|_| Ok(0)); let ctxge = MockErrorOperations::get_last_error_context(); + ctxge.checkpoint(); ctxge.expect().returning(|| WIN32_ERROR(1)); get_window_title::(&mock_handle, 42) .unwrap(); + + drop(ctxge); } #[test] @@ -290,9 +304,12 @@ mod tests { .returning(|_| Ok(0)); let ctxge = MockErrorOperations::get_last_error_context(); + ctxge.checkpoint(); ctxge.expect().returning(|| WIN32_ERROR(0)); get_window_title::(&mock_handle, 42) .unwrap(); + + drop(ctxge); } } From 10424e227b3bfc0749e7614d5bdaf6f56f4d22c7 Mon Sep 17 00:00:00 2001 From: Vicki League Date: Mon, 1 Dec 2025 14:15:58 -0500 Subject: [PATCH 30/37] [CL-717][PM-27966] Update to Angular 20 and Storybook 9 (#17638) --- .github/renovate.json5 | 10 +- .storybook/main.ts | 10 +- .storybook/manager.js | 4 +- .storybook/preview.tsx | 2 +- angular.json | 26 + .../content/components/.lit-storybook/main.ts | 48 +- .../lit-stories/.lit-docs/action-button.mdx | 2 +- .../lit-stories/.lit-docs/badge-button.mdx | 2 +- .../components/lit-stories/.lit-docs/body.mdx | 2 +- .../lit-stories/.lit-docs/close-button.mdx | 2 +- .../lit-stories/.lit-docs/edit-button.mdx | 2 +- .../lit-stories/.lit-docs/footer.mdx | 2 +- .../lit-stories/.lit-docs/header.mdx | 2 +- .../lit-stories/.lit-docs/icons.mdx | 2 +- .../platform/popup/layout/popup-layout.mdx | 2 +- .../src/popup/services/init.service.ts | 3 +- apps/desktop/src/app/services/init.service.ts | 3 +- .../access-selector/storybook-utils.ts | 2 +- apps/web/src/app/core/init.service.ts | 3 +- .../browser-extension-prompt.component.ts | 11 +- .../add-extension-videos.component.ts | 4 +- .../setup-extension.component.ts | 4 +- eslint.config.mjs | 1 + .../src/components/modal/modal-injector.ts | 6 +- .../angular/input-password/input-password.mdx | 2 +- .../input-password/input-password.stories.ts | 2 +- .../registration-start/registration-start.mdx | 2 +- .../aria-disabled-click-capture.service.ts | 3 +- .../src/anon-layout/anon-layout-wrapper.mdx | 2 +- .../src/anon-layout/anon-layout.mdx | 2 +- .../components/src/async-actions/in-forms.mdx | 2 +- .../src/async-actions/in-forms.stories.ts | 2 +- .../components/src/async-actions/overview.mdx | 2 +- .../src/async-actions/standalone.mdx | 2 +- .../src/async-actions/standalone.stories.ts | 2 +- libs/components/src/avatar/avatar.mdx | 2 +- libs/components/src/badge/badge.mdx | 2 +- libs/components/src/banner/banner.mdx | 2 +- .../src/breadcrumbs/breadcrumbs.mdx | 2 +- libs/components/src/button/button.mdx | 2 +- libs/components/src/callout/callout.mdx | 2 +- .../src/card/base-card/base-card.mdx | 2 +- libs/components/src/checkbox/checkbox.mdx | 10 +- .../src/chip-select/chip-select.mdx | 2 +- .../src/chip-select/chip-select.stories.ts | 2 +- .../src/color-password/color-password.mdx | 2 +- libs/components/src/container/container.mdx | 2 +- .../src/dialog/dialog.service.stories.ts | 18 +- libs/components/src/dialog/dialog/dialog.mdx | 2 +- libs/components/src/dialog/dialogs.mdx | 2 +- .../dialog/simple-dialog/simple-dialog.mdx | 2 +- .../simple-dialog.service.stories.ts | 24 +- libs/components/src/disclosure/disclosure.mdx | 2 +- libs/components/src/drawer/drawer.mdx | 2 +- libs/components/src/form-field/form-field.mdx | 2 +- .../src/form-field/multi-select.stories.ts | 2 +- libs/components/src/form/form.stories.ts | 2 +- libs/components/src/form/forms.mdx | 2 +- .../src/icon-button/icon-button.mdx | 2 +- libs/components/src/icon/icon.mdx | 2 +- libs/components/src/input/autofocus.mdx | 2 +- libs/components/src/input/input.mdx | 2 +- libs/components/src/item/item.mdx | 2 +- libs/components/src/layout/layout.stories.ts | 2 +- libs/components/src/link/link.mdx | 2 +- libs/components/src/menu/menu.mdx | 2 +- .../multi-select/multi-select.component.ts | 8 +- libs/components/src/popover/popover.mdx | 2 +- .../components/src/popover/popover.stories.ts | 2 +- libs/components/src/progress/progress.mdx | 2 +- libs/components/src/search/search.mdx | 10 +- libs/components/src/section/section.mdx | 2 +- .../components/src/select/select.component.ts | 6 +- libs/components/src/select/select.mdx | 2 +- libs/components/src/skeleton/skeleton.mdx | 2 +- libs/components/src/stepper/stepper.mdx | 10 +- libs/components/src/stories/colors.mdx | 2 +- libs/components/src/stories/compact-mode.mdx | 2 +- libs/components/src/stories/icons/icons.mdx | 2 +- libs/components/src/stories/introduction.mdx | 2 +- .../src/stories/kitchen-sink/kitchen-sink.mdx | 2 +- .../kitchen-sink/kitchen-sink.stories.ts | 2 +- libs/components/src/stories/migration.mdx | 2 +- .../src/stories/responsive-design.mdx | 2 +- .../src/stories/virtual-scrolling.mdx | 2 +- libs/components/src/switch/switch.mdx | 10 +- libs/components/src/table/table.mdx | 2 +- libs/components/src/tabs/tabs.mdx | 2 +- libs/components/src/toast/toast.mdx | 10 +- libs/components/src/toast/toast.stories.ts | 2 +- .../src/toggle-group/toggle-group.mdx | 2 +- libs/components/src/tooltip/tooltip.mdx | 10 +- .../components/src/tooltip/tooltip.stories.ts | 2 +- libs/components/src/typography/typography.mdx | 2 +- .../cart-summary/cart-summary.component.mdx | 2 +- .../discount-badge.component.mdx | 2 +- .../pricing-card/pricing-card.component.mdx | 2 +- libs/vault/src/cipher-form/cipher-form.mdx | 2 +- .../src/cipher-form/cipher-form.stories.ts | 2 +- package-lock.json | 5997 ++++++++--------- package.json | 58 +- 101 files changed, 2926 insertions(+), 3531 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 6e142edf8a7..997812735de 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -119,7 +119,7 @@ "rimraf", "ssh-encoding", "ssh-key", - "@storybook/web-components-webpack5", + "@storybook/web-components-vite", "tabbable", "tldts", "wait-on", @@ -311,26 +311,24 @@ "@compodoc/compodoc", "@ng-select/ng-select", "@storybook/addon-a11y", - "@storybook/addon-actions", "@storybook/addon-designs", - "@storybook/addon-essentials", - "@storybook/addon-interactions", + "@storybook/addon-docs", "@storybook/addon-links", "@storybook/test-runner", "@storybook/addon-themes", "@storybook/angular", - "@storybook/manager-api", - "@storybook/theming", "@types/react", "autoprefixer", "bootstrap", "chromatic", "ngx-toastr", + "path-browserify", "react", "react-dom", "remark-gfm", "storybook", "tailwindcss", + "vite-tsconfig-paths", "zone.js", "@tailwindcss/container-queries", ], diff --git a/.storybook/main.ts b/.storybook/main.ts index d3811bb178d..e1f3561a1b7 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -28,15 +28,13 @@ const config: StorybookConfig = { ], addons: [ getAbsolutePath("@storybook/addon-links"), - getAbsolutePath("@storybook/addon-essentials"), getAbsolutePath("@storybook/addon-a11y"), getAbsolutePath("@storybook/addon-designs"), - getAbsolutePath("@storybook/addon-interactions"), getAbsolutePath("@storybook/addon-themes"), { // @storybook/addon-docs is part of @storybook/addon-essentials - // eslint-disable-next-line storybook/no-uninstalled-addons - name: "@storybook/addon-docs", + + name: getAbsolutePath("@storybook/addon-docs"), options: { mdxPluginOptions: { mdxCompileOptions: { @@ -60,6 +58,10 @@ const config: StorybookConfig = { webpackFinal: async (config, { configType }) => { if (config.resolve) { config.resolve.plugins = [new TsconfigPathsPlugin()] as any; + config.resolve.fallback = { + ...config.resolve.fallback, + path: require.resolve("path-browserify"), + }; } return config; }, diff --git a/.storybook/manager.js b/.storybook/manager.js index e0ec04fd375..7ba923a0b2d 100644 --- a/.storybook/manager.js +++ b/.storybook/manager.js @@ -1,5 +1,5 @@ -import { addons } from "@storybook/manager-api"; -import { create } from "@storybook/theming/create"; +import { addons } from "storybook/manager-api"; +import { create } from "storybook/theming"; const lightTheme = create({ base: "light", diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 0b14f9d7444..5a75a21dcd8 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -49,7 +49,7 @@ const preview: Preview = { }, }, backgrounds: { - disable: true, + disabled: true, }, }, tags: ["autodocs"], diff --git a/angular.json b/angular.json index 87ee7dc57b2..e1cc2aad82a 100644 --- a/angular.json +++ b/angular.json @@ -220,5 +220,31 @@ } } } + }, + "schematics": { + "@schematics/angular:component": { + "type": "component" + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." + } } } diff --git a/apps/browser/src/autofill/content/components/.lit-storybook/main.ts b/apps/browser/src/autofill/content/components/.lit-storybook/main.ts index 53c06264672..aabf99c5548 100644 --- a/apps/browser/src/autofill/content/components/.lit-storybook/main.ts +++ b/apps/browser/src/autofill/content/components/.lit-storybook/main.ts @@ -1,13 +1,9 @@ import { createRequire } from "module"; -import { dirname, join, resolve } from "path"; -import { fileURLToPath } from "url"; +import { dirname, join } from "path"; -import type { StorybookConfig } from "@storybook/web-components-webpack5"; +import type { StorybookConfig } from "@storybook/web-components-vite"; import remarkGfm from "remark-gfm"; -import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; - -const currentFile = fileURLToPath(import.meta.url); -const currentDirectory = dirname(currentFile); +import tsconfigPaths from "vite-tsconfig-paths"; const require = createRequire(import.meta.url); @@ -21,7 +17,6 @@ const config: StorybookConfig = { getAbsolutePath("@storybook/addon-essentials"), getAbsolutePath("@storybook/addon-a11y"), getAbsolutePath("@storybook/addon-designs"), - getAbsolutePath("@storybook/addon-interactions"), { name: "@storybook/addon-docs", options: { @@ -34,10 +29,8 @@ const config: StorybookConfig = { }, ], framework: { - name: getAbsolutePath("@storybook/web-components-webpack5"), - options: { - legacyRootApi: true, - }, + name: getAbsolutePath("@storybook/web-components-vite"), + options: {}, }, core: { disableTelemetry: true, @@ -46,33 +39,12 @@ const config: StorybookConfig = { ...existingConfig, FLAGS: JSON.stringify({}), }), - webpackFinal: async (config) => { - if (config.resolve) { - config.resolve.plugins = [ - new TsconfigPathsPlugin({ - configFile: resolve(currentDirectory, "../../../../../tsconfig.json"), - }), - ] as any; - } - - if (config.module && config.module.rules) { - config.module.rules.push({ - test: /\.(ts|tsx)$/, - exclude: /node_modules/, - use: [ - { - loader: require.resolve("ts-loader"), - }, - ], - }); - config.module.rules.push({ - test: /\.scss$/, - use: [require.resolve("css-loader"), require.resolve("sass-loader")], - }); - } - return config; + viteFinal: async (config) => { + return { + ...config, + plugins: [...(config.plugins ?? []), tsconfigPaths()], + }; }, - docs: {}, }; export default config; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx index fcec5bb7a82..8193ea01ee5 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./action-button.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx index b5ea41b283c..6a01540b51b 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./badge-button.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx index a298594e17f..f36cb74d684 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./body.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx index 03a7b72001a..0728e44c7b2 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./close-button.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx index a5a791ffbe1..dbe93663726 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./edit-button.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx index 6a816f811e0..a717b34cc33 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./footer.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx index ebe35a3dd9b..376c6c6889f 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls, Primary } from "@storybook/addon-docs"; +import { Meta, Controls, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./header.lit-stories"; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx index 7ec18d0f7bb..e9b328e2967 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx @@ -1,4 +1,4 @@ -import { Meta, Controls } from "@storybook/addon-docs"; +import { Meta, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./icons.lit-stories"; diff --git a/apps/browser/src/platform/popup/layout/popup-layout.mdx b/apps/browser/src/platform/popup/layout/popup-layout.mdx index a2725350a8f..0a1c80b13f6 100644 --- a/apps/browser/src/platform/popup/layout/popup-layout.mdx +++ b/apps/browser/src/platform/popup/layout/popup-layout.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks"; import * as stories from "./popup-layout.stories"; diff --git a/apps/browser/src/popup/services/init.service.ts b/apps/browser/src/popup/services/init.service.ts index 91b6f0ff105..f16d82d0810 100644 --- a/apps/browser/src/popup/services/init.service.ts +++ b/apps/browser/src/popup/services/init.service.ts @@ -1,5 +1,4 @@ -import { DOCUMENT } from "@angular/common"; -import { inject, Inject, Injectable } from "@angular/core"; +import { inject, Inject, Injectable, DOCUMENT } from "@angular/core"; import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/two-factor"; diff --git a/apps/desktop/src/app/services/init.service.ts b/apps/desktop/src/app/services/init.service.ts index 73c4d38d3b2..17115825bf6 100644 --- a/apps/desktop/src/app/services/init.service.ts +++ b/apps/desktop/src/app/services/init.service.ts @@ -1,5 +1,4 @@ -import { DOCUMENT } from "@angular/common"; -import { Inject, Injectable } from "@angular/core"; +import { Inject, Injectable, DOCUMENT } from "@angular/core"; import { firstValueFrom } from "rxjs"; import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction"; diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/storybook-utils.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/storybook-utils.ts index fb8bdef1d8c..9c39ca572fb 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/storybook-utils.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/storybook-utils.ts @@ -1,4 +1,4 @@ -import { action } from "@storybook/addon-actions"; +import { action } from "storybook/actions"; import { AccessItemType, AccessItemView } from "./access-selector.models"; diff --git a/apps/web/src/app/core/init.service.ts b/apps/web/src/app/core/init.service.ts index 71e3578a7c6..929f1489a61 100644 --- a/apps/web/src/app/core/init.service.ts +++ b/apps/web/src/app/core/init.service.ts @@ -1,5 +1,4 @@ -import { DOCUMENT } from "@angular/common"; -import { Inject, Injectable } from "@angular/core"; +import { Inject, Injectable, DOCUMENT } from "@angular/core"; import { firstValueFrom } from "rxjs"; import { AbstractThemingService } from "@bitwarden/angular/platform/services/theming/theming.service.abstraction"; diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts index 505a0df5032..54d62b8414a 100644 --- a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts @@ -1,5 +1,12 @@ -import { CommonModule, DOCUMENT } from "@angular/common"; -import { Component, Inject, OnDestroy, OnInit, ChangeDetectionStrategy } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { + Component, + Inject, + OnDestroy, + OnInit, + DOCUMENT, + ChangeDetectionStrategy, +} from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { ActivatedRoute } from "@angular/router"; import { map, Observable, of, tap } from "rxjs"; diff --git a/apps/web/src/app/vault/components/setup-extension/add-extension-videos.component.ts b/apps/web/src/app/vault/components/setup-extension/add-extension-videos.component.ts index 9a974a395f0..cdee9163480 100644 --- a/apps/web/src/app/vault/components/setup-extension/add-extension-videos.component.ts +++ b/apps/web/src/app/vault/components/setup-extension/add-extension-videos.component.ts @@ -1,5 +1,5 @@ -import { CommonModule, DOCUMENT } from "@angular/common"; -import { Component, ViewChildren, QueryList, ElementRef, inject } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { Component, ViewChildren, QueryList, ElementRef, inject, DOCUMENT } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { debounceTime, fromEvent } from "rxjs"; diff --git a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts index 809e404f5f1..cfc1961c4d8 100644 --- a/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts +++ b/apps/web/src/app/vault/components/setup-extension/setup-extension.component.ts @@ -1,5 +1,5 @@ -import { DOCUMENT, NgIf } from "@angular/common"; -import { Component, DestroyRef, inject, OnDestroy, OnInit } from "@angular/core"; +import { NgIf } from "@angular/common"; +import { Component, DestroyRef, inject, OnDestroy, OnInit, DOCUMENT } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { Router, RouterModule } from "@angular/router"; import { firstValueFrom, pairwise, startWith } from "rxjs"; diff --git a/eslint.config.mjs b/eslint.config.mjs index 1e12e0e1e19..881cd5e1f4d 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -71,6 +71,7 @@ export default tseslint.config( "@angular-eslint/no-output-on-prefix": 0, "@angular-eslint/no-output-rename": "error", "@angular-eslint/no-outputs-metadata-property": "error", + "@angular-eslint/prefer-inject": 0, "@angular-eslint/prefer-on-push-component-change-detection": "error", "@angular-eslint/prefer-output-emitter-ref": "error", "@angular-eslint/prefer-signals": "error", diff --git a/libs/angular/src/components/modal/modal-injector.ts b/libs/angular/src/components/modal/modal-injector.ts index d1f6ac8d8d7..b3eb4d023d0 100644 --- a/libs/angular/src/components/modal/modal-injector.ts +++ b/libs/angular/src/components/modal/modal-injector.ts @@ -1,4 +1,4 @@ -import { InjectFlags, InjectOptions, Injector, ProviderToken } from "@angular/core"; +import { InjectOptions, Injector, ProviderToken } from "@angular/core"; export class ModalInjector implements Injector { constructor( @@ -12,8 +12,8 @@ export class ModalInjector implements Injector { options: InjectOptions & { optional?: false }, ): T; get(token: ProviderToken, notFoundValue: null, options: InjectOptions): T; - get(token: ProviderToken, notFoundValue?: T, options?: InjectOptions | InjectFlags): T; - get(token: ProviderToken, notFoundValue?: T, flags?: InjectFlags): T; + get(token: ProviderToken, notFoundValue?: T, options?: InjectOptions | null): T; + get(token: ProviderToken, notFoundValue?: T, flags?: null): T; get(token: any, notFoundValue?: any): any; get(token: any, notFoundValue?: any, flags?: any): any { return this._additionalTokens.get(token) ?? this._parentInjector.get(token, notFoundValue); diff --git a/libs/auth/src/angular/input-password/input-password.mdx b/libs/auth/src/angular/input-password/input-password.mdx index e272044a215..e3cdcbf08b9 100644 --- a/libs/auth/src/angular/input-password/input-password.mdx +++ b/libs/auth/src/angular/input-password/input-password.mdx @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/addon-docs"; +import { Meta, Story } from "@storybook/addon-docs/blocks"; import * as stories from "./input-password.stories.ts"; diff --git a/libs/auth/src/angular/input-password/input-password.stories.ts b/libs/auth/src/angular/input-password/input-password.stories.ts index 4ffd0e202ee..285ce94b269 100644 --- a/libs/auth/src/angular/input-password/input-password.stories.ts +++ b/libs/auth/src/angular/input-password/input-password.stories.ts @@ -1,8 +1,8 @@ import { importProvidersFrom } from "@angular/core"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -import { action } from "@storybook/addon-actions"; import { Meta, StoryObj, applicationConfig } from "@storybook/angular"; import { of } from "rxjs"; +import { action } from "storybook/actions"; import { ZXCVBNResult } from "zxcvbn"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; diff --git a/libs/auth/src/angular/registration/registration-start/registration-start.mdx b/libs/auth/src/angular/registration/registration-start/registration-start.mdx index a9654de22fc..e4645ca664e 100644 --- a/libs/auth/src/angular/registration/registration-start/registration-start.mdx +++ b/libs/auth/src/angular/registration/registration-start/registration-start.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Controls } from "@storybook/addon-docs"; +import { Meta, Story, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./registration-start.stories"; diff --git a/libs/components/src/a11y/aria-disabled-click-capture.service.ts b/libs/components/src/a11y/aria-disabled-click-capture.service.ts index d828d15c873..78f45acc80a 100644 --- a/libs/components/src/a11y/aria-disabled-click-capture.service.ts +++ b/libs/components/src/a11y/aria-disabled-click-capture.service.ts @@ -1,5 +1,4 @@ -import { DOCUMENT } from "@angular/common"; -import { Injectable, Inject, NgZone, OnDestroy } from "@angular/core"; +import { Injectable, Inject, NgZone, OnDestroy, DOCUMENT } from "@angular/core"; @Injectable({ providedIn: "root" }) export class AriaDisabledClickCaptureService implements OnDestroy { diff --git a/libs/components/src/anon-layout/anon-layout-wrapper.mdx b/libs/components/src/anon-layout/anon-layout-wrapper.mdx index 8fe332b8caf..683c41e491e 100644 --- a/libs/components/src/anon-layout/anon-layout-wrapper.mdx +++ b/libs/components/src/anon-layout/anon-layout-wrapper.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Controls } from "@storybook/addon-docs"; +import { Meta, Story, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./anon-layout-wrapper.stories"; diff --git a/libs/components/src/anon-layout/anon-layout.mdx b/libs/components/src/anon-layout/anon-layout.mdx index 3c6faeccfb0..fef3e9b0761 100644 --- a/libs/components/src/anon-layout/anon-layout.mdx +++ b/libs/components/src/anon-layout/anon-layout.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Controls } from "@storybook/addon-docs"; +import { Meta, Story, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./anon-layout.stories"; diff --git a/libs/components/src/async-actions/in-forms.mdx b/libs/components/src/async-actions/in-forms.mdx index 111a0df06af..27806ec92db 100644 --- a/libs/components/src/async-actions/in-forms.mdx +++ b/libs/components/src/async-actions/in-forms.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/async-actions/in-forms.stories.ts b/libs/components/src/async-actions/in-forms.stories.ts index 7a19908cbbf..623549ca202 100644 --- a/libs/components/src/async-actions/in-forms.stories.ts +++ b/libs/components/src/async-actions/in-forms.stories.ts @@ -1,8 +1,8 @@ import { Component } from "@angular/core"; import { FormsModule, ReactiveFormsModule, Validators, FormBuilder } from "@angular/forms"; -import { action } from "@storybook/addon-actions"; import { Meta, moduleMetadata, StoryObj } from "@storybook/angular"; import { delay, of } from "rxjs"; +import { action } from "storybook/actions"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; diff --git a/libs/components/src/async-actions/overview.mdx b/libs/components/src/async-actions/overview.mdx index 7cffd379b84..9f1638fc15c 100644 --- a/libs/components/src/async-actions/overview.mdx +++ b/libs/components/src/async-actions/overview.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/async-actions/standalone.mdx b/libs/components/src/async-actions/standalone.mdx index a781f40d852..a7699da9977 100644 --- a/libs/components/src/async-actions/standalone.mdx +++ b/libs/components/src/async-actions/standalone.mdx @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/addon-docs"; +import { Meta, Story } from "@storybook/addon-docs/blocks"; import * as stories from "./standalone.stories.ts"; diff --git a/libs/components/src/async-actions/standalone.stories.ts b/libs/components/src/async-actions/standalone.stories.ts index 52c1e990c23..690f746f812 100644 --- a/libs/components/src/async-actions/standalone.stories.ts +++ b/libs/components/src/async-actions/standalone.stories.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; -import { action } from "@storybook/addon-actions"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; import { delay, of } from "rxjs"; +import { action } from "storybook/actions"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/libs/components/src/avatar/avatar.mdx b/libs/components/src/avatar/avatar.mdx index bbf356f96fa..96db771889f 100644 --- a/libs/components/src/avatar/avatar.mdx +++ b/libs/components/src/avatar/avatar.mdx @@ -1,4 +1,4 @@ -import { Description, Meta, Canvas, Primary, Controls, Title } from "@storybook/addon-docs"; +import { Meta, Description, Canvas, Primary, Controls, Title } from "@storybook/addon-docs/blocks"; import * as stories from "./avatar.stories"; diff --git a/libs/components/src/badge/badge.mdx b/libs/components/src/badge/badge.mdx index 957a3256cbb..c8deaeb7643 100644 --- a/libs/components/src/badge/badge.mdx +++ b/libs/components/src/badge/badge.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./badge.stories"; diff --git a/libs/components/src/banner/banner.mdx b/libs/components/src/banner/banner.mdx index f37fe90e117..fe43106f2b9 100644 --- a/libs/components/src/banner/banner.mdx +++ b/libs/components/src/banner/banner.mdx @@ -1,4 +1,4 @@ -import { Canvas, Controls, Description, Meta, Primary, Title } from "@storybook/addon-docs"; +import { Canvas, Controls, Description, Meta, Primary, Title } from "@storybook/addon-docs/blocks"; import * as stories from "./banner.stories"; diff --git a/libs/components/src/breadcrumbs/breadcrumbs.mdx b/libs/components/src/breadcrumbs/breadcrumbs.mdx index cd1d0226387..6713795e854 100644 --- a/libs/components/src/breadcrumbs/breadcrumbs.mdx +++ b/libs/components/src/breadcrumbs/breadcrumbs.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./breadcrumbs.stories"; diff --git a/libs/components/src/button/button.mdx b/libs/components/src/button/button.mdx index b0f347ba337..3080f6ffe4a 100644 --- a/libs/components/src/button/button.mdx +++ b/libs/components/src/button/button.mdx @@ -6,7 +6,7 @@ import { Controls, Title, Description, -} from "@storybook/addon-docs"; +} from "@storybook/addon-docs/blocks"; import * as stories from "./button.stories"; diff --git a/libs/components/src/callout/callout.mdx b/libs/components/src/callout/callout.mdx index 297a2ffd0a3..fa631c18549 100644 --- a/libs/components/src/callout/callout.mdx +++ b/libs/components/src/callout/callout.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./callout.stories"; diff --git a/libs/components/src/card/base-card/base-card.mdx b/libs/components/src/card/base-card/base-card.mdx index df326462906..11753c90f1d 100644 --- a/libs/components/src/card/base-card/base-card.mdx +++ b/libs/components/src/card/base-card/base-card.mdx @@ -1,4 +1,4 @@ -import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs"; +import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./base-card.stories"; diff --git a/libs/components/src/checkbox/checkbox.mdx b/libs/components/src/checkbox/checkbox.mdx index ba5de4d234a..079f7993ea6 100644 --- a/libs/components/src/checkbox/checkbox.mdx +++ b/libs/components/src/checkbox/checkbox.mdx @@ -1,4 +1,12 @@ -import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { + Meta, + Canvas, + Source, + Primary, + Controls, + Title, + Description, +} from "@storybook/addon-docs/blocks"; import * as stories from "./checkbox.stories"; diff --git a/libs/components/src/chip-select/chip-select.mdx b/libs/components/src/chip-select/chip-select.mdx index b09b9664f8e..75ab1ad8a06 100644 --- a/libs/components/src/chip-select/chip-select.mdx +++ b/libs/components/src/chip-select/chip-select.mdx @@ -1,4 +1,4 @@ -import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs"; +import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./chip-select.stories"; diff --git a/libs/components/src/chip-select/chip-select.stories.ts b/libs/components/src/chip-select/chip-select.stories.ts index e9b78235ccb..fbdbd22b5ec 100644 --- a/libs/components/src/chip-select/chip-select.stories.ts +++ b/libs/components/src/chip-select/chip-select.stories.ts @@ -1,6 +1,6 @@ import { FormsModule } from "@angular/forms"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { getAllByRole, userEvent } from "@storybook/test"; +import { getAllByRole, userEvent } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/color-password/color-password.mdx b/libs/components/src/color-password/color-password.mdx index 4deeace9b9e..5397be4f599 100644 --- a/libs/components/src/color-password/color-password.mdx +++ b/libs/components/src/color-password/color-password.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./color-password.stories"; diff --git a/libs/components/src/container/container.mdx b/libs/components/src/container/container.mdx index 35e0c69587f..e64b7969cac 100644 --- a/libs/components/src/container/container.mdx +++ b/libs/components/src/container/container.mdx @@ -1,4 +1,4 @@ -import { Meta, Primary, Title, Description } from "@storybook/addon-docs"; +import { Meta, Primary, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./container.stories"; diff --git a/libs/components/src/dialog/dialog.service.stories.ts b/libs/components/src/dialog/dialog.service.stories.ts index 0921e9a9def..3b5bdc4d4e9 100644 --- a/libs/components/src/dialog/dialog.service.stories.ts +++ b/libs/components/src/dialog/dialog.service.stories.ts @@ -1,9 +1,9 @@ import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog"; -import { Component, Inject } from "@angular/core"; +import { Component, inject } from "@angular/core"; import { NoopAnimationsModule, provideAnimations } from "@angular/platform-browser/animations"; import { RouterTestingModule } from "@angular/router/testing"; import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; -import { getAllByRole, userEvent } from "@storybook/test"; +import { getAllByRole, userEvent } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -36,7 +36,7 @@ interface Animal { imports: [ButtonModule, LayoutComponent], }) class StoryDialogComponent { - constructor(public dialogService: DialogService) {} + dialogService = inject(DialogService); openDialog() { this.dialogService.open(StoryDialogContentComponent, { @@ -85,10 +85,8 @@ class StoryDialogComponent { imports: [DialogModule, ButtonModule], }) class StoryDialogContentComponent { - constructor( - public dialogRef: DialogRef, - @Inject(DIALOG_DATA) private data: Animal, - ) {} + dialogRef = inject(DialogRef); + private data = inject(DIALOG_DATA); get animal() { return this.data?.animal; @@ -118,10 +116,8 @@ class StoryDialogContentComponent { imports: [DialogModule, ButtonModule], }) class NonDismissableContentComponent { - constructor( - public dialogRef: DialogRef, - @Inject(DIALOG_DATA) private data: Animal, - ) {} + dialogRef = inject(DialogRef); + private data = inject(DIALOG_DATA); get animal() { return this.data?.animal; diff --git a/libs/components/src/dialog/dialog/dialog.mdx b/libs/components/src/dialog/dialog/dialog.mdx index 1806958210e..056e4ac79bc 100644 --- a/libs/components/src/dialog/dialog/dialog.mdx +++ b/libs/components/src/dialog/dialog/dialog.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./dialog.stories"; diff --git a/libs/components/src/dialog/dialogs.mdx b/libs/components/src/dialog/dialogs.mdx index 3f44f31a5eb..ee03dda6f57 100644 --- a/libs/components/src/dialog/dialogs.mdx +++ b/libs/components/src/dialog/dialogs.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Source } from "@storybook/addon-docs"; +import { Meta, Canvas, Source } from "@storybook/addon-docs/blocks"; import * as stories from "./dialog.service.stories"; diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.mdx b/libs/components/src/dialog/simple-dialog/simple-dialog.mdx index e3ed2fcf698..1d7a3668719 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.mdx +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./simple-dialog.stories"; diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts index 7e03ad60ca2..3b7fc3deeff 100644 --- a/libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.service.stories.ts @@ -1,8 +1,8 @@ import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; -import { Component, Inject } from "@angular/core"; +import { Component, inject } from "@angular/core"; import { provideAnimations } from "@angular/platform-browser/animations"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { getAllByRole, userEvent } from "@storybook/test"; +import { getAllByRole, userEvent } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -30,7 +30,7 @@ interface Animal { imports: [ButtonModule], }) class StoryDialogComponent { - constructor(public dialogService: DialogService) {} + dialogService = inject(DialogService); openSimpleDialog() { this.dialogService.open(SimpleDialogContentComponent, { @@ -84,10 +84,8 @@ class StoryDialogComponent { imports: [ButtonModule, DialogModule], }) class SimpleDialogContentComponent { - constructor( - public dialogRef: DialogRef, - @Inject(DIALOG_DATA) private data: Animal, - ) {} + dialogRef = inject(DialogRef); + private data = inject(DIALOG_DATA); get animal() { return this.data?.animal; @@ -115,10 +113,8 @@ class SimpleDialogContentComponent { imports: [ButtonModule, DialogModule], }) class NonDismissableWithPrimaryButtonContentComponent { - constructor( - public dialogRef: DialogRef, - @Inject(DIALOG_DATA) private data: Animal, - ) {} + dialogRef = inject(DialogRef); + private data = inject(DIALOG_DATA); get animal() { return this.data?.animal; @@ -141,10 +137,8 @@ class NonDismissableWithPrimaryButtonContentComponent { imports: [ButtonModule, DialogModule], }) class NonDismissableWithNoButtonsContentComponent { - constructor( - public dialogRef: DialogRef, - @Inject(DIALOG_DATA) private data: Animal, - ) {} + dialogRef = inject(DialogRef); + private data = inject(DIALOG_DATA); get animal() { return this.data?.animal; diff --git a/libs/components/src/disclosure/disclosure.mdx b/libs/components/src/disclosure/disclosure.mdx index 9f01df8d3d9..69930261f93 100644 --- a/libs/components/src/disclosure/disclosure.mdx +++ b/libs/components/src/disclosure/disclosure.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./disclosure.stories"; diff --git a/libs/components/src/drawer/drawer.mdx b/libs/components/src/drawer/drawer.mdx index bc99fa290d6..1050ab476f7 100644 --- a/libs/components/src/drawer/drawer.mdx +++ b/libs/components/src/drawer/drawer.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./drawer.stories"; diff --git a/libs/components/src/form-field/form-field.mdx b/libs/components/src/form-field/form-field.mdx index d84535481ac..7d8feaea1d2 100644 --- a/libs/components/src/form-field/form-field.mdx +++ b/libs/components/src/form-field/form-field.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./form-field.stories"; diff --git a/libs/components/src/form-field/multi-select.stories.ts b/libs/components/src/form-field/multi-select.stories.ts index db7507f31a8..85dc09e7f83 100644 --- a/libs/components/src/form-field/multi-select.stories.ts +++ b/libs/components/src/form-field/multi-select.stories.ts @@ -6,8 +6,8 @@ import { FormGroup, } from "@angular/forms"; import { NgSelectModule } from "@ng-select/ng-select"; -import { action } from "@storybook/addon-actions"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; +import { action } from "storybook/actions"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/form/form.stories.ts b/libs/components/src/form/form.stories.ts index 1fc9bbef751..2f1dc652c40 100644 --- a/libs/components/src/form/form.stories.ts +++ b/libs/components/src/form/form.stories.ts @@ -1,6 +1,6 @@ import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { userEvent, getByText } from "@storybook/test"; +import { userEvent, getByText } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/form/forms.mdx b/libs/components/src/form/forms.mdx index 498eb8a3ed2..9efeaadfe6b 100644 --- a/libs/components/src/form/forms.mdx +++ b/libs/components/src/form/forms.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Source } from "@storybook/addon-docs"; +import { Meta, Canvas, Source } from "@storybook/addon-docs/blocks"; import * as formStories from "./form.stories"; import * as fieldStories from "../form-field/form-field.stories"; diff --git a/libs/components/src/icon-button/icon-button.mdx b/libs/components/src/icon-button/icon-button.mdx index 3922f137589..062e3068685 100644 --- a/libs/components/src/icon-button/icon-button.mdx +++ b/libs/components/src/icon-button/icon-button.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./icon-button.stories"; diff --git a/libs/components/src/icon/icon.mdx b/libs/components/src/icon/icon.mdx index 800a4711ff8..4f6f13c895e 100644 --- a/libs/components/src/icon/icon.mdx +++ b/libs/components/src/icon/icon.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Controls } from "@storybook/addon-docs"; +import { Meta, Story, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./icon.stories"; diff --git a/libs/components/src/input/autofocus.mdx b/libs/components/src/input/autofocus.mdx index b65aaff0c0a..fba2a7e9841 100644 --- a/libs/components/src/input/autofocus.mdx +++ b/libs/components/src/input/autofocus.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./autofocus.stories"; diff --git a/libs/components/src/input/input.mdx b/libs/components/src/input/input.mdx index 1cb3d16bc7b..252738bf03a 100644 --- a/libs/components/src/input/input.mdx +++ b/libs/components/src/input/input.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/item/item.mdx b/libs/components/src/item/item.mdx index a5b20dbcb62..8be3c0a8efa 100644 --- a/libs/components/src/item/item.mdx +++ b/libs/components/src/item/item.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./item.stories"; diff --git a/libs/components/src/layout/layout.stories.ts b/libs/components/src/layout/layout.stories.ts index 7ab0ffc7ce9..a059fd61b92 100644 --- a/libs/components/src/layout/layout.stories.ts +++ b/libs/components/src/layout/layout.stories.ts @@ -1,6 +1,6 @@ import { RouterTestingModule } from "@angular/router/testing"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { userEvent } from "@storybook/test"; +import { userEvent } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/link/link.mdx b/libs/components/src/link/link.mdx index 8fb5f693f10..072e0dd84d8 100644 --- a/libs/components/src/link/link.mdx +++ b/libs/components/src/link/link.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Story, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./link.stories"; diff --git a/libs/components/src/menu/menu.mdx b/libs/components/src/menu/menu.mdx index d77dc0a7d7b..61e7b40ce00 100644 --- a/libs/components/src/menu/menu.mdx +++ b/libs/components/src/menu/menu.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./menu.stories"; diff --git a/libs/components/src/multi-select/multi-select.component.ts b/libs/components/src/multi-select/multi-select.component.ts index 4e755d1deda..8faf629c9a0 100644 --- a/libs/components/src/multi-select/multi-select.component.ts +++ b/libs/components/src/multi-select/multi-select.component.ts @@ -108,11 +108,11 @@ export class MultiSelectComponent implements OnInit, BitFormFieldControl, Contro /** Needs to be arrow function to retain `this` scope. */ keyDown = (event: KeyboardEvent) => { const select = this.select(); - if (!select.isOpen && event.key === "Enter" && !hasModifierKey(event)) { + if (!select.isOpen() && event.key === "Enter" && !hasModifierKey(event)) { return false; } - if (select.isOpen && event.key === "Escape" && !hasModifierKey(event)) { + if (select.isOpen() && event.key === "Escape" && !hasModifierKey(event)) { this.selectedItems = []; select.close(); event.stopPropagation(); @@ -198,7 +198,9 @@ export class MultiSelectComponent implements OnInit, BitFormFieldControl, Contro } set ariaDescribedBy(value: string | undefined) { this._ariaDescribedBy = value; - this.select()?.searchInput.nativeElement.setAttribute("aria-describedby", value ?? ""); + this.select() + ?.searchInput() + .nativeElement.setAttribute("aria-describedby", value ?? ""); } private _ariaDescribedBy?: string; diff --git a/libs/components/src/popover/popover.mdx b/libs/components/src/popover/popover.mdx index 2d18303ea78..d56f00b10ae 100644 --- a/libs/components/src/popover/popover.mdx +++ b/libs/components/src/popover/popover.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./popover.stories"; diff --git a/libs/components/src/popover/popover.stories.ts b/libs/components/src/popover/popover.stories.ts index 596381d0777..a3d374c3136 100644 --- a/libs/components/src/popover/popover.stories.ts +++ b/libs/components/src/popover/popover.stories.ts @@ -1,5 +1,5 @@ import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { getByRole, userEvent } from "@storybook/test"; +import { getByRole, userEvent } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/progress/progress.mdx b/libs/components/src/progress/progress.mdx index def2f239129..bb121ca7b47 100644 --- a/libs/components/src/progress/progress.mdx +++ b/libs/components/src/progress/progress.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks"; import * as stories from "./progress.stories"; diff --git a/libs/components/src/search/search.mdx b/libs/components/src/search/search.mdx index 98e91162c94..54144f1591f 100644 --- a/libs/components/src/search/search.mdx +++ b/libs/components/src/search/search.mdx @@ -1,4 +1,12 @@ -import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { + Meta, + Canvas, + Source, + Primary, + Controls, + Title, + Description, +} from "@storybook/addon-docs/blocks"; import * as stories from "./search.stories"; diff --git a/libs/components/src/section/section.mdx b/libs/components/src/section/section.mdx index 81d98101c06..cc46bd6da37 100644 --- a/libs/components/src/section/section.mdx +++ b/libs/components/src/section/section.mdx @@ -1,4 +1,4 @@ -import { Meta, Primary, Controls, Canvas } from "@storybook/addon-docs"; +import { Meta, Primary, Controls, Canvas } from "@storybook/addon-docs/blocks"; import * as stories from "./section.stories"; diff --git a/libs/components/src/select/select.component.ts b/libs/components/src/select/select.component.ts index f6358ccf6c6..0aa18d68702 100644 --- a/libs/components/src/select/select.component.ts +++ b/libs/components/src/select/select.component.ts @@ -158,7 +158,9 @@ export class SelectComponent implements BitFormFieldControl, ControlValueAcce } set ariaDescribedBy(value: string | undefined) { this._ariaDescribedBy = value; - this.select()?.searchInput.nativeElement.setAttribute("aria-describedby", value ?? ""); + this.select() + ?.searchInput() + .nativeElement.setAttribute("aria-describedby", value ?? ""); } private _ariaDescribedBy?: string; @@ -218,7 +220,7 @@ export class SelectComponent implements BitFormFieldControl, ControlValueAcce * Needs to be arrow function to retain `this` scope. */ protected onKeyDown = (event: KeyboardEvent) => { - if (this.select().isOpen && event.key === "Escape" && !hasModifierKey(event)) { + if (this.select().isOpen() && event.key === "Escape" && !hasModifierKey(event)) { event.stopPropagation(); } diff --git a/libs/components/src/select/select.mdx b/libs/components/src/select/select.mdx index 8dfbe4aa526..95f2a28c235 100644 --- a/libs/components/src/select/select.mdx +++ b/libs/components/src/select/select.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./select.stories"; diff --git a/libs/components/src/skeleton/skeleton.mdx b/libs/components/src/skeleton/skeleton.mdx index ab0ba22f43e..161ac7f662e 100644 --- a/libs/components/src/skeleton/skeleton.mdx +++ b/libs/components/src/skeleton/skeleton.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Source } from "@storybook/addon-docs"; +import { Meta, Canvas, Source } from "@storybook/addon-docs/blocks"; import * as skeletonStories from "./skeleton.stories"; import * as skeletonTextStories from "./skeleton-text.stories"; diff --git a/libs/components/src/stepper/stepper.mdx b/libs/components/src/stepper/stepper.mdx index ca4efd97aef..6c340027c69 100644 --- a/libs/components/src/stepper/stepper.mdx +++ b/libs/components/src/stepper/stepper.mdx @@ -1,4 +1,12 @@ -import { Meta, Story, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { + Meta, + Story, + Source, + Primary, + Controls, + Title, + Description, +} from "@storybook/addon-docs/blocks"; import * as stories from "./stepper.stories"; diff --git a/libs/components/src/stories/colors.mdx b/libs/components/src/stories/colors.mdx index 87ca673797b..ca9a97b9071 100644 --- a/libs/components/src/stories/colors.mdx +++ b/libs/components/src/stories/colors.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/stories/compact-mode.mdx b/libs/components/src/stories/compact-mode.mdx index 3cffd45847a..898acc39f71 100644 --- a/libs/components/src/stories/compact-mode.mdx +++ b/libs/components/src/stories/compact-mode.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks"; import * as itemStories from "../item/item.stories"; import * as popupLayoutStories from "../../../../apps/browser/src/platform/popup/layout/popup-layout.stories"; diff --git a/libs/components/src/stories/icons/icons.mdx b/libs/components/src/stories/icons/icons.mdx index 300a424b87d..8adfe6fadee 100644 --- a/libs/components/src/stories/icons/icons.mdx +++ b/libs/components/src/stories/icons/icons.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas } from "@storybook/addon-docs"; +import { Meta, Canvas } from "@storybook/addon-docs/blocks"; import * as stories from "./icons.stories"; diff --git a/libs/components/src/stories/introduction.mdx b/libs/components/src/stories/introduction.mdx index 4401c47551f..5f766f130f3 100644 --- a/libs/components/src/stories/introduction.mdx +++ b/libs/components/src/stories/introduction.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx b/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx index 34e80081887..6eb02880e97 100644 --- a/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx +++ b/libs/components/src/stories/kitchen-sink/kitchen-sink.mdx @@ -1,4 +1,4 @@ -import { Meta, Story } from "@storybook/addon-docs"; +import { Meta, Story } from "@storybook/addon-docs/blocks"; import * as stories from "./kitchen-sink.stories"; diff --git a/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts b/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts index c25eb778d11..fc6be00b0e0 100644 --- a/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts +++ b/libs/components/src/stories/kitchen-sink/kitchen-sink.stories.ts @@ -9,7 +9,7 @@ import { fireEvent, getByText, getAllByLabelText, -} from "@storybook/test"; +} from "storybook/test"; import { PasswordManagerLogo } from "@bitwarden/assets/svg"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/stories/migration.mdx b/libs/components/src/stories/migration.mdx index 1160c602894..b6d7925534d 100644 --- a/libs/components/src/stories/migration.mdx +++ b/libs/components/src/stories/migration.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/stories/responsive-design.mdx b/libs/components/src/stories/responsive-design.mdx index a54baf6a231..a69497c063e 100644 --- a/libs/components/src/stories/responsive-design.mdx +++ b/libs/components/src/stories/responsive-design.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/stories/virtual-scrolling.mdx b/libs/components/src/stories/virtual-scrolling.mdx index ab51d9865db..532d9a31d3f 100644 --- a/libs/components/src/stories/virtual-scrolling.mdx +++ b/libs/components/src/stories/virtual-scrolling.mdx @@ -1,4 +1,4 @@ -import { Meta } from "@storybook/addon-docs"; +import { Meta } from "@storybook/addon-docs/blocks"; diff --git a/libs/components/src/switch/switch.mdx b/libs/components/src/switch/switch.mdx index 71421d6a808..9df97cfba48 100644 --- a/libs/components/src/switch/switch.mdx +++ b/libs/components/src/switch/switch.mdx @@ -1,4 +1,12 @@ -import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { + Meta, + Canvas, + Source, + Primary, + Controls, + Title, + Description, +} from "@storybook/addon-docs/blocks"; import * as stories from "./switch.stories"; diff --git a/libs/components/src/table/table.mdx b/libs/components/src/table/table.mdx index 59bf5b773a3..fe84842e10c 100644 --- a/libs/components/src/table/table.mdx +++ b/libs/components/src/table/table.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Source, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Story, Source, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./table.stories"; diff --git a/libs/components/src/tabs/tabs.mdx b/libs/components/src/tabs/tabs.mdx index bab5fbb52c4..6d80c759f87 100644 --- a/libs/components/src/tabs/tabs.mdx +++ b/libs/components/src/tabs/tabs.mdx @@ -1,4 +1,4 @@ -import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs"; +import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks"; import * as stories from "./tabs.stories"; import * as dialogStories from "../dialog/dialog/dialog.stories"; diff --git a/libs/components/src/toast/toast.mdx b/libs/components/src/toast/toast.mdx index 6d9d80c6ae5..a6aa1ef23fe 100644 --- a/libs/components/src/toast/toast.mdx +++ b/libs/components/src/toast/toast.mdx @@ -1,4 +1,12 @@ -import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { + Meta, + Canvas, + Source, + Primary, + Controls, + Title, + Description, +} from "@storybook/addon-docs/blocks"; import * as stories from "./toast.stories"; diff --git a/libs/components/src/toast/toast.stories.ts b/libs/components/src/toast/toast.stories.ts index f7eeadce971..58451aafbb6 100644 --- a/libs/components/src/toast/toast.stories.ts +++ b/libs/components/src/toast/toast.stories.ts @@ -1,8 +1,8 @@ import { CommonModule } from "@angular/common"; import { Component, Input } from "@angular/core"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -import { action } from "@storybook/addon-actions"; import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; +import { action } from "storybook/actions"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/toggle-group/toggle-group.mdx b/libs/components/src/toggle-group/toggle-group.mdx index d553ae11298..d6fad84a4c4 100644 --- a/libs/components/src/toggle-group/toggle-group.mdx +++ b/libs/components/src/toggle-group/toggle-group.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Primary, Controls, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Primary, Controls, Canvas } from "@storybook/addon-docs/blocks"; import * as stories from "./toggle-group.stories"; diff --git a/libs/components/src/tooltip/tooltip.mdx b/libs/components/src/tooltip/tooltip.mdx index 13e159c98eb..34f40784444 100644 --- a/libs/components/src/tooltip/tooltip.mdx +++ b/libs/components/src/tooltip/tooltip.mdx @@ -1,4 +1,12 @@ -import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs"; +import { + Meta, + Canvas, + Source, + Primary, + Controls, + Title, + Description, +} from "@storybook/addon-docs/blocks"; import * as stories from "./tooltip.stories"; diff --git a/libs/components/src/tooltip/tooltip.stories.ts b/libs/components/src/tooltip/tooltip.stories.ts index 73df08e25fa..2b4998d12f8 100644 --- a/libs/components/src/tooltip/tooltip.stories.ts +++ b/libs/components/src/tooltip/tooltip.stories.ts @@ -1,6 +1,6 @@ import { signal } from "@angular/core"; import { Meta, StoryObj, moduleMetadata } from "@storybook/angular"; -import { getByRole, userEvent } from "@storybook/test"; +import { getByRole, userEvent } from "storybook/test"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; diff --git a/libs/components/src/typography/typography.mdx b/libs/components/src/typography/typography.mdx index d8439481dbc..a200ae68f98 100644 --- a/libs/components/src/typography/typography.mdx +++ b/libs/components/src/typography/typography.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks"; import * as stories from "./typography.stories"; diff --git a/libs/pricing/src/components/cart-summary/cart-summary.component.mdx b/libs/pricing/src/components/cart-summary/cart-summary.component.mdx index 79f36bb2523..a8b599fc66b 100644 --- a/libs/pricing/src/components/cart-summary/cart-summary.component.mdx +++ b/libs/pricing/src/components/cart-summary/cart-summary.component.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks"; import * as CartSummaryStories from "./cart-summary.component.stories"; diff --git a/libs/pricing/src/components/discount-badge/discount-badge.component.mdx b/libs/pricing/src/components/discount-badge/discount-badge.component.mdx index d3df2dcf0f6..deef8fecb73 100644 --- a/libs/pricing/src/components/discount-badge/discount-badge.component.mdx +++ b/libs/pricing/src/components/discount-badge/discount-badge.component.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks"; import * as DiscountBadgeStories from "./discount-badge.component.stories"; diff --git a/libs/pricing/src/components/pricing-card/pricing-card.component.mdx b/libs/pricing/src/components/pricing-card/pricing-card.component.mdx index 355ca71eb80..39e45b3fd25 100644 --- a/libs/pricing/src/components/pricing-card/pricing-card.component.mdx +++ b/libs/pricing/src/components/pricing-card/pricing-card.component.mdx @@ -1,4 +1,4 @@ -import { Meta, Story, Canvas } from "@storybook/addon-docs"; +import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks"; import * as PricingCardStories from "./pricing-card.component.stories"; diff --git a/libs/vault/src/cipher-form/cipher-form.mdx b/libs/vault/src/cipher-form/cipher-form.mdx index 658fcd38d11..da453a655d9 100644 --- a/libs/vault/src/cipher-form/cipher-form.mdx +++ b/libs/vault/src/cipher-form/cipher-form.mdx @@ -1,4 +1,4 @@ -import { Controls, Meta, Primary } from "@storybook/addon-docs"; +import { Controls, Meta, Primary } from "@storybook/addon-docs/blocks"; import * as stories from "./cipher-form.stories"; diff --git a/libs/vault/src/cipher-form/cipher-form.stories.ts b/libs/vault/src/cipher-form/cipher-form.stories.ts index cf52dbc557f..e732513913d 100644 --- a/libs/vault/src/cipher-form/cipher-form.stories.ts +++ b/libs/vault/src/cipher-form/cipher-form.stories.ts @@ -2,7 +2,6 @@ // @ts-strict-ignore import { importProvidersFrom, signal } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { action } from "@storybook/addon-actions"; import { applicationConfig, componentWrapperDecorator, @@ -11,6 +10,7 @@ import { StoryObj, } from "@storybook/angular"; import { BehaviorSubject, of } from "rxjs"; +import { action } from "storybook/actions"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports diff --git a/package-lock.json b/package-lock.json index 71e0d5a0781..6f7b0fb9da8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,15 @@ "libs/**/*" ], "dependencies": { - "@angular/animations": "19.2.14", - "@angular/cdk": "19.2.18", - "@angular/common": "19.2.14", - "@angular/compiler": "19.2.14", - "@angular/core": "19.2.14", - "@angular/forms": "19.2.14", - "@angular/platform-browser": "19.2.14", - "@angular/platform-browser-dynamic": "19.2.14", - "@angular/router": "19.2.14", + "@angular/animations": "20.3.13", + "@angular/cdk": "20.2.14", + "@angular/common": "20.3.13", + "@angular/compiler": "20.3.13", + "@angular/core": "20.3.13", + "@angular/forms": "20.3.13", + "@angular/platform-browser": "20.3.13", + "@angular/platform-browser-dynamic": "20.3.13", + "@angular/router": "20.3.13", "@bitwarden/commercial-sdk-internal": "0.2.0-main.395", "@bitwarden/sdk-internal": "0.2.0-main.395", "@electron/fuses": "1.8.0", @@ -31,16 +31,12 @@ "@koa/router": "14.0.0", "@microsoft/signalr": "8.0.7", "@microsoft/signalr-protocol-msgpack": "8.0.7", - "@ng-select/ng-select": "14.9.0", + "@ng-select/ng-select": "20.7.0", "@nx/devkit": "21.6.9", "@nx/eslint": "21.6.9", "@nx/jest": "21.6.9", "@nx/js": "21.6.9", "@nx/webpack": "21.6.9", - "big-integer": "1.6.52", - "braintree-web-drop-in": "1.46.0", - "buffer": "6.0.3", - "bufferutil": "4.0.9", "chalk": "4.1.2", "commander": "14.0.0", "core-js": "3.45.0", @@ -71,14 +67,15 @@ "tldts": "7.0.18", "ts-node": "10.9.2", "utf-8-validate": "6.0.5", + "vite-tsconfig-paths": "5.1.4", "zone.js": "0.15.1", "zxcvbn": "4.4.2" }, "devDependencies": { - "@angular-devkit/build-angular": "19.2.14", - "@angular-eslint/schematics": "19.6.0", - "@angular/cli": "19.2.14", - "@angular/compiler-cli": "19.2.14", + "@angular-devkit/build-angular": "20.3.11", + "@angular-eslint/schematics": "20.7.0", + "@angular/cli": "20.3.11", + "@angular/compiler-cli": "20.3.13", "@babel/core": "7.28.5", "@babel/preset-env": "7.28.5", "@compodoc/compodoc": "1.1.26", @@ -86,19 +83,15 @@ "@electron/rebuild": "4.0.1", "@eslint/compat": "2.0.0", "@lit-labs/signals": "0.1.2", - "@ngtools/webpack": "19.2.14", - "@storybook/addon-a11y": "8.6.12", - "@storybook/addon-actions": "8.6.12", - "@storybook/addon-designs": "8.2.1", - "@storybook/addon-essentials": "8.6.12", - "@storybook/addon-interactions": "8.6.12", - "@storybook/addon-links": "8.6.12", - "@storybook/addon-themes": "8.6.12", - "@storybook/angular": "8.6.12", - "@storybook/manager-api": "8.6.12", + "@ngtools/webpack": "20.3.11", + "@storybook/addon-a11y": "9.1.16", + "@storybook/addon-designs": "9.0.0-next.3", + "@storybook/addon-docs": "9.1.16", + "@storybook/addon-links": "9.1.16", + "@storybook/addon-themes": "9.1.16", + "@storybook/angular": "9.1.16", "@storybook/test-runner": "0.22.0", - "@storybook/theming": "8.6.12", - "@storybook/web-components-webpack5": "8.6.12", + "@storybook/web-components-vite": "9.1.16", "@tailwindcss/container-queries": "0.1.1", "@types/chrome": "0.1.28", "@types/firefox-webext-browser": "143.0.0", @@ -123,7 +116,7 @@ "@typescript-eslint/utils": "8.31.0", "@webcomponents/custom-elements": "1.6.0", "@yao-pkg/pkg": "6.5.1", - "angular-eslint": "19.6.0", + "angular-eslint": "20.7.0", "autoprefixer": "10.4.21", "axe-playwright": "2.2.2", "babel-loader": "9.2.1", @@ -146,7 +139,7 @@ "eslint-plugin-import": "2.31.0", "eslint-plugin-rxjs": "5.0.3", "eslint-plugin-rxjs-angular": "2.0.1", - "eslint-plugin-storybook": "0.12.0", + "eslint-plugin-storybook": "9.1.16", "eslint-plugin-tailwindcss": "3.18.0", "html-loader": "5.1.0", "html-webpack-injector": "1.1.4", @@ -160,6 +153,7 @@ "lint-staged": "16.0.0", "mini-css-extract-plugin": "2.9.4", "nx": "21.6.9", + "path-browserify": "1.0.1", "postcss": "8.5.6", "postcss-loader": "8.2.0", "prettier": "3.6.2", @@ -167,12 +161,8 @@ "process": "0.11.10", "remark-gfm": "4.0.1", "rimraf": "6.0.1", - "sass": "1.94.2", "sass-loader": "16.0.6", - "storybook": "8.6.12", - "style-loader": "4.0.0", - "tailwindcss": "3.4.17", - "ts-jest": "29.4.5", + "storybook": "9.1.16", "ts-loader": "9.5.4", "tsconfig-paths-webpack-plugin": "4.2.0", "type-fest": "2.19.0", @@ -188,7 +178,7 @@ "webpack-node-externals": "3.0.0" }, "engines": { - "node": "~22", + "node": ">=22.12.0", "npm": "~10" } }, @@ -487,9 +477,9 @@ "license": "GPL-3.0" }, "node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", "dev": true, "license": "MIT" }, @@ -500,6 +490,215 @@ "dev": true, "license": "MIT" }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -528,112 +727,129 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1902.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.15.tgz", - "integrity": "sha512-RbqhStc6ZoRv57ZqLB36VOkBkAdU3nNezCvIs0AJV5V4+vLPMrb0hpIB0sF+9yMlMjWsolnRsj0/Fil+zQG3bw==", + "version": "0.2003.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.11.tgz", + "integrity": "sha512-/56v/Le9UruIPqQXINoggns0//W2/BIaDd54kvjNK5PjQUyKKj6nmhMA1RgB0yDTBFh7lksLf8IyyGx9ZchGRA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.15", - "rxjs": "7.8.1" + "@angular-devkit/core": "20.3.11", + "rxjs": "7.8.2" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/build-angular": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.14.tgz", - "integrity": "sha512-0K8vZxXdkME31fd6/+WACug8j4eLlU7mxR2/XJvS+VQ+a7bqdEsVddZDkwdWE+Y3ccZXvD/aNLZSEuSKmVFsnA==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.11.tgz", + "integrity": "sha512-DCbyw/nnYxjZZHlHDnkShEeLTG7FxNppg3dMq3g+ClonTcjX4X+1TLD78UokM9idTsZikk+1A6WnOxZLDxFt2Q==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.14", - "@angular-devkit/build-webpack": "0.1902.14", - "@angular-devkit/core": "19.2.14", - "@angular/build": "19.2.14", - "@babel/core": "7.26.10", - "@babel/generator": "7.26.10", - "@babel/helper-annotate-as-pure": "7.25.9", + "@angular-devkit/architect": "0.2003.11", + "@angular-devkit/build-webpack": "0.2003.11", + "@angular-devkit/core": "20.3.11", + "@angular/build": "20.3.11", + "@babel/core": "7.28.3", + "@babel/generator": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.26.8", - "@babel/plugin-transform-async-to-generator": "7.25.9", - "@babel/plugin-transform-runtime": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/runtime": "7.26.10", + "@babel/plugin-transform-async-generator-functions": "7.28.0", + "@babel/plugin-transform-async-to-generator": "7.27.1", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "7.28.3", + "@babel/runtime": "7.28.3", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.2.14", - "@vitejs/plugin-basic-ssl": "1.2.0", + "@ngtools/webpack": "20.3.11", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.20", - "babel-loader": "9.2.1", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", "browserslist": "^4.21.5", - "copy-webpack-plugin": "12.0.2", + "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.4", + "esbuild-wasm": "0.25.9", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.2", - "less-loader": "12.2.0", + "less": "4.4.0", + "less-loader": "12.3.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", - "mini-css-extract-plugin": "2.9.2", - "open": "10.1.0", - "ora": "5.4.1", - "picomatch": "4.0.2", - "piscina": "4.8.0", - "postcss": "8.5.2", + "mini-css-extract-plugin": "2.9.4", + "open": "10.2.0", + "ora": "8.2.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "postcss": "8.5.6", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.85.0", + "rxjs": "7.8.2", + "sass": "1.90.0", "sass-loader": "16.0.5", - "semver": "7.7.1", + "semver": "7.7.2", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.39.0", + "terser": "5.43.1", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.98.0", + "webpack": "5.101.2", "webpack-dev-middleware": "7.4.2", - "webpack-dev-server": "5.2.0", + "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.4" + "esbuild": "0.25.9" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", - "@angular/localize": "^19.0.0 || ^19.2.0-next.0", - "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", - "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.14", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.11", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", + "jest": "^29.5.0 || ^30.2.0", + "jest-environment-jsdom": "^29.5.0 || ^30.2.0", "karma": "^6.3.0", - "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "ng-packagr": "^20.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.9" + "typescript": ">=5.8 <6.0" }, "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, "@angular/localize": { "optional": true }, + "@angular/platform-browser": { + "optional": true + }, "@angular/platform-server": { "optional": true }, @@ -669,67 +885,23 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1902.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.14.tgz", - "integrity": "sha512-rgMkqOrxedzqLZ8w59T/0YrpWt7LDmGwt+ZhNHE7cn27jZ876yGC2Bhcn58YZh2+R03WEJ9q0ePblaBYz03SMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.14", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.14.tgz", - "integrity": "sha512-aaPEnRNIBoYT4XrrYcZlHadX8vFDTUR+4wUgcmr0cNDLeWzWtoPFeVq8TQD6kFDeqovSx/UVEblGgg/28WvHyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -755,80 +927,81 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -848,137 +1021,76 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "find-up": "^5.0.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "@babel/core": "^7.12.0", + "webpack": ">=5.61.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/@angular-devkit/build-angular/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { @@ -988,48 +1100,13 @@ "dev": true, "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -1054,147 +1131,27 @@ "node": ">=4.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "node_modules/@angular-devkit/build-angular/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/@angular-devkit/build-angular/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1207,37 +1164,34 @@ "dev": true, "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@angular-devkit/build-angular/node_modules/mime-db": { @@ -1263,48 +1217,14 @@ "node": ">= 0.6" } }, - "node_modules/@angular-devkit/build-angular/node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "node_modules/@angular-devkit/build-angular/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "mimic-function": "^5.0.0" }, "engines": { "node": ">=18" @@ -1313,40 +1233,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@angular-devkit/build-angular/node_modules/postcss-loader": { @@ -1381,68 +1321,37 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/@angular-devkit/build-angular/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=0.6" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1502,9 +1411,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -1514,114 +1423,58 @@ "node": ">=10" } }, - "node_modules/@angular-devkit/build-angular/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/@angular-devkit/build-angular/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node": ">=12" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", + "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -1631,11 +1484,11 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -1653,138 +1506,18 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-dev-server": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", - "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1902.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.14.tgz", - "integrity": "sha512-XDNB8Nlau/v59Ukd6UgBRBRnTnUmC244832SECmMxXHs1ljJMWGlI1img2xPErGd8426rUA9Iws4RkQiqbsybQ==", + "version": "0.2003.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.11.tgz", + "integrity": "sha512-FShY/esFad74pstEFCkin1MgEziXd33fy5Fs0hfMVKxWWKRbtPMSQd8qNd9s+olIYRX/rSOeCuuYXesOtUnodg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1902.14", - "rxjs": "7.8.1" + "@angular-devkit/architect": "0.2003.11", + "rxjs": "7.8.2" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -1793,66 +1526,32 @@ "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1902.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.14.tgz", - "integrity": "sha512-rgMkqOrxedzqLZ8w59T/0YrpWt7LDmGwt+ZhNHE7cn27jZ876yGC2Bhcn58YZh2+R03WEJ9q0ePblaBYz03SMw==", + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@angular-devkit/core": "19.2.14", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.14.tgz", - "integrity": "sha512-aaPEnRNIBoYT4XrrYcZlHadX8vFDTUR+4wUgcmr0cNDLeWzWtoPFeVq8TQD6kFDeqovSx/UVEblGgg/28WvHyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/core": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.15.tgz", - "integrity": "sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.11.tgz", + "integrity": "sha512-KZDhMemUci42D9CNziM+GxQK5wEMP+TDL9ssUHIkvrr1lsFViHIO+pfzs7QfyM8n6hr7at4gQN9IZRV4rRKyQQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -1865,34 +1564,286 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/@angular-devkit/schematics": { - "version": "19.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.15.tgz", - "integrity": "sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.11.tgz", + "integrity": "sha512-ePbARvd3xaN2a+ozFWaoYQHz1pzyzzu247rxRoS4hSOr5jqCsogMqPoGxdBCx6nFlDlP/CYenFR7cFx5OBT4tg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.15", + "@angular-devkit/core": "20.3.11", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" + "ora": "8.2.0", + "rxjs": "7.8.2" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-eslint/builder": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.6.0.tgz", - "integrity": "sha512-hUdYS1mSB09b5ABi2tuWeMTVprYHW+x6KmeAFJfXC6aMOa4NYQBdetIjOLwr7qUDlq1S/+2+HiX/FO76FPHClw==", + "node_modules/@angular-devkit/schematics/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", - "@angular-devkit/core": ">= 19.0.0 < 20.0.0" + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/schematics/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.7.0.tgz", + "integrity": "sha512-qgf4Cfs1z0VsVpzF/OnxDRvBp60OIzeCsp4mzlckWYVniKo19EPIN6kFDol5eTAIOMPgiBQlMIwgQMHgocXEig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", + "@angular-devkit/core": ">= 20.0.0 < 21.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", @@ -1900,21 +1851,22 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.6.0.tgz", - "integrity": "sha512-ro+seaTAg5GvtJ72uWEEnP9J5mT0vtgdqH6YMrmMt4pZbSZxvkLfLjZGkXo/HjVDVcCjPnmZeMwKN+uoEc27Jg==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.7.0.tgz", + "integrity": "sha512-9KPz24YoiL0SvTtTX6sd1zmysU5cKOCcmpEiXkCoO3L2oYZGlVxmMT4hfSaHMt8qmfvV2KzQMoR6DZM84BwRzQ==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.6.0.tgz", - "integrity": "sha512-IOMfFi/rPNrPwxZwIGTqWw0C5pC2Facwg3llmJoQFq8w2sUE0nNBL5uSQv5dT8s6ucum4g+RFNYHNe20SEOvRw==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.7.0.tgz", + "integrity": "sha512-aHH2YTiaonojsKN+y2z4IMugCwdsH/dYIjYBig6kfoSPyf9rGK4zx+gnNGq/pGRjF3bOYrmFgIviYpQVb80inQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.6.0", - "@angular-eslint/utils": "19.6.0" + "@angular-eslint/bundled-angular-compiler": "20.7.0", + "@angular-eslint/utils": "20.7.0", + "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -1923,18 +1875,19 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.6.0.tgz", - "integrity": "sha512-SDGbNSCUuPmqVesy5SvRE2MV7AKvvA/bVJwL9Fz5KYCHYxJz1rrJ8FknjWAfmg0qO2TMs1ZI9hov8JL+Bc4BBw==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.7.0.tgz", + "integrity": "sha512-WFmvW2vBR6ExsSKEaActQTteyw6ikWyuJau9XmWEPFd+2eusEt/+wO21ybjDn3uc5FTp1IcdhfYy+U5OdDjH5w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.6.0", - "@angular-eslint/utils": "19.6.0", + "@angular-eslint/bundled-angular-compiler": "20.7.0", + "@angular-eslint/utils": "20.7.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { + "@angular-eslint/template-parser": "20.7.0", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", @@ -1942,57 +1895,61 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.6.0.tgz", - "integrity": "sha512-lJzwHju7bhJ3p+SZnY0JVwGjxF2q68gUdOYhdU62pglfYkS5lm+A5LM/VznRvdpZOH69vvZ9gizQ8W1P525cdw==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.7.0.tgz", + "integrity": "sha512-S0onfRipDUIL6gFGTFjiWwUDhi42XYrBoi3kJ3wBbKBeIgYv9SP1ppTKDD4ZoDaDU9cQE8nToX7iPn9ifMw6eQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 19.0.0 < 20.0.0", - "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", - "@angular-eslint/eslint-plugin": "19.6.0", - "@angular-eslint/eslint-plugin-template": "19.6.0", - "ignore": "7.0.4", - "semver": "7.7.2", + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/eslint-plugin": "20.7.0", + "@angular-eslint/eslint-plugin-template": "20.7.0", + "ignore": "7.0.5", + "semver": "7.7.3", "strip-json-comments": "3.1.1" } }, - "node_modules/@angular-eslint/schematics/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular-eslint/template-parser": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.6.0.tgz", - "integrity": "sha512-NGxXUZkI5lXjoKnmL51C8DoJx8AjwF9sonieC2EVxgXycK2MYAamFWYGHMiVemzFsg1nIv+JvhHITgjSjyC3HQ==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.7.0.tgz", + "integrity": "sha512-CVskZnF38IIxVVlKWi1VCz7YH/gHMJu2IY9bD1AVoBBGIe0xA4FRXJkW2Y+EDs9vQqZTkZZljhK5gL65Ro1PeQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.6.0", - "eslint-scope": "^8.0.2" + "@angular-eslint/bundled-angular-compiler": "20.7.0", + "eslint-scope": "^9.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.0.0.tgz", + "integrity": "sha512-+Yh0LeQKq+mW/tQArNj67tljR3L1HajDTQPuZOEwC00oBdoIDQrr89yBgjAlzAwRrY/5zDkM3v99iGHwz9y0dw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@angular-eslint/utils": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.6.0.tgz", - "integrity": "sha512-ygtsmRKHNqrzG2mpUj1XwLNRoG+ikYkizsOuq5xPRM8o6dCw03H5eel4s7hnXT4c09WbpnoaVNi9O3xFLIETJQ==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.7.0.tgz", + "integrity": "sha512-B6EJHbsk2W/lnS3kS/gm56VGvX735419z/DzgbRDcOvqMGMLwD1ILzv5OTEcL1rzpnB0AHW+IxOu6y/aCzSNUA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "19.6.0" + "@angular-eslint/bundled-angular-compiler": "20.7.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -2001,81 +1958,90 @@ } }, "node_modules/@angular/animations": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.14.tgz", - "integrity": "sha512-xhl8fLto5HHJdVj8Nb6EoBEiTAcXuWDYn1q5uHcGxyVH3kiwENWy/2OQXgCr2CuWo2e6hNUGzSLf/cjbsMNqEA==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.13.tgz", + "integrity": "sha512-IOiZlb+GK3p70J4vRe3PQ+NHCkoVYaq7fz9Pg2FcQ9Ar3EobVtHyFJFGzdStMFbiYR0B66STBNyZcz+V0AwC0A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/core": "19.2.14" + "@angular/core": "20.3.13" } }, "node_modules/@angular/build": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.14.tgz", - "integrity": "sha512-PAUR8vZpGKXy0Vc5gpJkigOthoj5YeGDpeykl/yLi6sx6yAIlXcE0MD+LGehKeqFSBL56rEpn9n710lI7eTJwg==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.11.tgz", + "integrity": "sha512-0YJGRSXZeH3ncpyCZANN0jDdWaRhIOzKQ54+YcuA1uwLzTAUrla3CsJHSVk6ljItIRWymPuUMDRHjxWE/W6WbA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.14", - "@babel/core": "7.26.10", - "@babel/helper-annotate-as-pure": "7.25.9", + "@angular-devkit/architect": "0.2003.11", + "@babel/core": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.1.6", - "@vitejs/plugin-basic-ssl": "1.2.0", - "beasties": "0.3.2", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", "browserslist": "^4.23.0", - "esbuild": "0.25.4", - "fast-glob": "3.3.3", + "esbuild": "0.25.9", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", "magic-string": "0.30.17", "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.8.0", - "rollup": "4.34.8", - "sass": "1.85.0", - "semver": "7.7.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rollup": "4.52.3", + "sass": "1.90.0", + "semver": "7.7.2", "source-map-support": "0.5.21", - "vite": "6.2.7", - "watchpack": "2.4.2" + "tinyglobby": "0.2.14", + "vite": "7.1.11", + "watchpack": "2.4.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.2.6" + "lmdb": "3.4.2" }, "peerDependencies": { - "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", - "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", - "@angular/localize": "^19.0.0 || ^19.2.0-next.0", - "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", - "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.14", + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.11", "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "ng-packagr": "^20.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.9" + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" }, "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, "@angular/localize": { "optional": true }, + "@angular/platform-browser": { + "optional": true + }, "@angular/platform-server": { "optional": true }, @@ -2099,70 +2065,29 @@ }, "tailwindcss": { "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/@angular-devkit/architect": { - "version": "0.1902.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.14.tgz", - "integrity": "sha512-rgMkqOrxedzqLZ8w59T/0YrpWt7LDmGwt+ZhNHE7cn27jZ876yGC2Bhcn58YZh2+R03WEJ9q0ePblaBYz03SMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.14", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/build/node_modules/@angular-devkit/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.14.tgz", - "integrity": "sha512-aaPEnRNIBoYT4XrrYcZlHadX8vFDTUR+4wUgcmr0cNDLeWzWtoPFeVq8TQD6kFDeqovSx/UVEblGgg/28WvHyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { + }, + "vitest": { "optional": true } } }, "node_modules/@angular/build/node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -2194,10 +2119,23 @@ "dev": true, "license": "MIT" }, + "node_modules/@angular/build/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular/build/node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2216,9 +2154,9 @@ } }, "node_modules/@angular/build/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -2228,194 +2166,108 @@ "node": ">=10" } }, - "node_modules/@angular/build/node_modules/vite": { - "version": "6.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", - "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/@angular/cdk": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.18.tgz", - "integrity": "sha512-aGMHOYK/VV9PhxGTUDwiu/4ozoR/RKz8cimI+QjRxEBhzn4EPqjUDSganvlhmgS7cTN3+aqozdvF/GopMRJjLg==", + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", + "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", "license": "MIT", "dependencies": { - "parse5": "^7.1.2", + "parse5": "^8.0.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^19.0.0 || ^20.0.0", - "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/cli": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.14.tgz", - "integrity": "sha512-jZvNHAwmyhgUqSIs6OW8YH1rX9XKytm4zPxJol1Xk56F8yAhnrUtukcOi3b7Dv19Z+9eXkwV/Db+2dGjWIE0DA==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.11.tgz", + "integrity": "sha512-FmTvBWo32MAhY2rdXbPjCfC71o0tIzYBuzrjE42SU0+brwwWSvWUmRxS6xM+hH87QrF+gzmi26hOql891OfbIg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1902.14", - "@angular-devkit/core": "19.2.14", - "@angular-devkit/schematics": "19.2.14", - "@inquirer/prompts": "7.3.2", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.2.14", + "@angular-devkit/architect": "0.2003.11", + "@angular-devkit/core": "20.3.11", + "@angular-devkit/schematics": "20.3.11", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.17.3", + "@schematics/angular": "20.3.11", "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", - "listr2": "8.2.5", - "npm-package-arg": "12.0.2", - "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.0.0", "resolve": "1.22.10", - "semver": "7.7.1", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "3.25.76" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1902.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.14.tgz", - "integrity": "sha512-rgMkqOrxedzqLZ8w59T/0YrpWt7LDmGwt+ZhNHE7cn27jZ876yGC2Bhcn58YZh2+R03WEJ9q0ePblaBYz03SMw==", + "node_modules/@angular/cli/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.14", - "rxjs": "7.8.1" - }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.14.tgz", - "integrity": "sha512-aaPEnRNIBoYT4XrrYcZlHadX8vFDTUR+4wUgcmr0cNDLeWzWtoPFeVq8TQD6kFDeqovSx/UVEblGgg/28WvHyg==", + "node_modules/@angular/cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=12" }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.14.tgz", - "integrity": "sha512-s89/MWXHy8+GP/cRfFbSECIG3FQQQwNVv44OOmghPVgKQgQ+EoE/zygL2hqKYTUPoPaS/IhNXdXjSE5pS9yLeg==", + "node_modules/@angular/cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@angular-devkit/core": "19.2.14", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=20" } }, + "node_modules/@angular/cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, "node_modules/@angular/cli/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -2425,80 +2277,164 @@ "node": ">=10" } }, + "node_modules/@angular/cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/@angular/common": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.14.tgz", - "integrity": "sha512-NcNklcuyqaTjOVGf7aru8APX9mjsnZ01gFZrn47BxHozhaR0EMRrotYQTdi8YdVjPkeYFYanVntSLfhyobq/jg==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.13.tgz", + "integrity": "sha512-Jy+Qu6760TZyiDJX0+fNzkc70+lwF9ojdkIyCso/Lvbx1v3Fki0+9Wui7Vge56hknkr05xXg1aEUeqMN0966Lg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "19.2.14", + "@angular/core": "20.3.13", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.14.tgz", - "integrity": "sha512-ZqJDYOdhgKpVGNq3+n/Gbxma8DVYElDsoRe0tvNtjkWBVdaOxdZZUqmJ3kdCBsqD/aqTRvRBu0KGo9s2fCChkA==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.13.tgz", + "integrity": "sha512-YEjzHxz9laEcC2YPBA7L09Ys8UIuPrRiBZcGCrOXzXmPATHGYuxqYuhZ8iKmKV0PG/4pP2fxD3Mv5wN0cBaOWg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.14.tgz", - "integrity": "sha512-e9/h86ETjoIK2yTLE9aUeMCKujdg/du2pq7run/aINjop4RtnNOw+ZlSTUa6R65lP5CVwDup1kPytpAoifw8cA==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.13.tgz", + "integrity": "sha512-Cou3G8C60eKpD93SKBJRG5pa/xpmMHe6sc2aanWjneGWjZq1kR4v5eQwwr8LUByIsafcqxHGT7+q1bYXT2p2DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.26.9", + "@babel/core": "7.28.3", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", - "yargs": "^17.2.1" + "yargs": "^18.0.0" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" + "ngc": "bundles/src/bin/ngc.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.14", - "typescript": ">=5.5 <5.9" + "@angular/compiler": "20.3.13", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -2530,55 +2466,192 @@ "semver": "bin/semver.js" } }, + "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@angular/compiler-cli/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/compiler-cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/@angular/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.14.tgz", - "integrity": "sha512-EVErpW9tGqJ/wNcAN3G/ErH8pHCJ8mM1E6bsJ8UJIpDTZkpqqYjBMtZS9YWH5n3KwUd1tAkAB2w8FK125AjDUQ==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.13.tgz", + "integrity": "sha512-12Kou+WAIjAUSG5TkDbypV2kreJ105VylAjlQ09bCvsGNTHjezGgahFa/tLz7iyrozhuivtGiQtiDaYsc79ysw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { + "@angular/compiler": "20.3.13", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } } }, "node_modules/@angular/forms": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.14.tgz", - "integrity": "sha512-hWtDOj2B0AuRTf+nkMJeodnFpDpmEK9OIhIv1YxcRe73ooaxrIdjgugkElO8I9Tj0E4/7m117ezhWDUkbqm1zA==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.13.tgz", + "integrity": "sha512-9vu9MCHJtgXvgPH+ZgXN46N3gpBBAckcmG62P7U+9BKivWvv3rEvkgX+4HvO+Pm2D6x/Jy1xbiQuVq9EDGPSNA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/core": "19.2.14", - "@angular/platform-browser": "19.2.14", + "@angular/common": "20.3.13", + "@angular/core": "20.3.13", + "@angular/platform-browser": "20.3.13", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.14.tgz", - "integrity": "sha512-hzkT5nmA64oVBQl6PRjdL4dIFT1n7lfM9rm5cAoS+6LUUKRgiE2d421Kpn/Hz3jaCJfo+calMIdtSMIfUJBmww==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.13.tgz", + "integrity": "sha512-KyJzzpD4jMPGotDgVHF0cz9psjlVg6wYQrhuWcLeE97VUvp+CdwdOJ9tlxDlGE5tYZ0JrQxAT0l5qdcr6K9iNQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "19.2.14", - "@angular/common": "19.2.14", - "@angular/core": "19.2.14" + "@angular/animations": "20.3.13", + "@angular/common": "20.3.13", + "@angular/core": "20.3.13" }, "peerDependenciesMeta": { "@angular/animations": { @@ -2587,38 +2660,38 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.14.tgz", - "integrity": "sha512-Hfz0z1KDQmIdnFXVFCwCPykuIsHPkr1uW2aY396eARwZ6PK8i0Aadcm1ZOnpd3MR1bMyDrJo30VRS5kx89QWvA==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.13.tgz", + "integrity": "sha512-/kBhzn/TewEPuoUeTh3+uJmviBoaey9g2qegwKj0rrr5XGqoEWurOY6yl8DqZCVHVimLZJdx8bBN7TEi7KlsLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/compiler": "19.2.14", - "@angular/core": "19.2.14", - "@angular/platform-browser": "19.2.14" + "@angular/common": "20.3.13", + "@angular/compiler": "20.3.13", + "@angular/core": "20.3.13", + "@angular/platform-browser": "20.3.13" } }, "node_modules/@angular/router": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.14.tgz", - "integrity": "sha512-cBTWY9Jx7YhbmDYDb7Hqz4Q7UNIMlKTkdKToJd2pbhIXyoS+kHVQrySmyca+jgvYMjWnIjsAEa3dpje12D4mFw==", + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.13.tgz", + "integrity": "sha512-TpNnqmcCFsAnf3tzdtWeGSSmHb9VTKCI6/1NRBgvpiiNSZ4ehQ/rPTy7D4q5uhu50vB0VECUSGkUAygQI8YHdw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.14", - "@angular/core": "19.2.14", - "@angular/platform-browser": "19.2.14", + "@angular/common": "20.3.13", + "@angular/core": "20.3.13", + "@angular/platform-browser": "20.3.13", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2726,16 +2799,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -2743,13 +2816,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -2801,18 +2873,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2839,18 +2899,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2966,18 +3014,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", @@ -3280,12 +3316,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3482,15 +3518,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", - "dev": true, + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -3500,15 +3535,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3599,18 +3633,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", @@ -4085,18 +4107,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", @@ -4159,16 +4169,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", - "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -4282,18 +4292,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", @@ -4441,68 +4439,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4546,13 +4482,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } @@ -6144,9 +6077,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -6161,9 +6094,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -6178,9 +6111,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -6195,9 +6128,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -6212,9 +6145,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -6229,9 +6162,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -6246,9 +6179,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -6263,9 +6196,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -6280,9 +6213,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -6297,9 +6230,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -6314,9 +6247,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -6331,9 +6264,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -6348,9 +6281,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -6365,9 +6298,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -6382,9 +6315,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -6399,9 +6332,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -6416,9 +6349,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -6433,9 +6366,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -6450,9 +6383,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -6467,9 +6400,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -6484,9 +6417,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -6500,10 +6433,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -6518,9 +6468,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -6535,9 +6485,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -6552,9 +6502,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -7020,18 +6970,28 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/checkbox": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz", - "integrity": "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -7046,14 +7006,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", - "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.7", - "@inquirer/type": "^3.0.4" + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" }, "engines": { "node": ">=18" @@ -7068,20 +7028,20 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.13", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", - "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -7096,15 +7056,15 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.13.tgz", - "integrity": "sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "external-editor": "^3.1.0" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -7119,15 +7079,15 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.15.tgz", - "integrity": "sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -7141,10 +7101,56 @@ } } }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/@inquirer/figures": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", - "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", "engines": { @@ -7152,14 +7158,14 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz", - "integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -7174,14 +7180,14 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.15.tgz", - "integrity": "sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -7196,15 +7202,15 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz", - "integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -7219,22 +7225,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.1.2", - "@inquirer/confirm": "^5.1.6", - "@inquirer/editor": "^4.2.7", - "@inquirer/expand": "^4.0.9", - "@inquirer/input": "^4.1.6", - "@inquirer/number": "^3.0.9", - "@inquirer/password": "^4.0.9", - "@inquirer/rawlist": "^4.0.9", - "@inquirer/search": "^3.0.9", - "@inquirer/select": "^4.0.9" + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" }, "engines": { "node": ">=18" @@ -7249,15 +7255,15 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.3.tgz", - "integrity": "sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -7272,16 +7278,16 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz", - "integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -7296,17 +7302,17 @@ } }, "node_modules/@inquirer/select": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz", - "integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.13", - "@inquirer/figures": "^1.0.12", - "@inquirer/type": "^3.0.7", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -7321,9 +7327,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", - "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", "engines": { @@ -8173,42 +8179,20 @@ "license": "MIT" }, "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/type": "^1.5.5" + "@inquirer/type": "^3.0.7" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" } }, "node_modules/@lit-labs/react": { @@ -8245,9 +8229,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", - "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", "cpu": [ "arm64" ], @@ -8259,9 +8243,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", - "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", "cpu": [ "x64" ], @@ -8273,9 +8257,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", - "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", "cpu": [ "arm" ], @@ -8287,9 +8271,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", - "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", "cpu": [ "arm64" ], @@ -8301,9 +8285,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", - "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", "cpu": [ "x64" ], @@ -8314,10 +8298,24 @@ "linux" ] }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", - "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", "cpu": [ "x64" ], @@ -8384,9 +8382,9 @@ } }, "node_modules/@mdx-js/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", - "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "dev": true, "license": "MIT", "dependencies": { @@ -8461,9 +8459,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.13.1.tgz", - "integrity": "sha512-8q6+9aF0yA39/qWT/uaIj6zTpC+Qu07DnN/lb9mjoquCJsAh6l3HyYqc9O3t2j7GilseOQOQimLg7W3By6jqvg==", + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", "license": "MIT", "dependencies": { "ajv": "^6.12.6", @@ -8471,6 +8469,7 @@ "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", @@ -8627,9 +8626,9 @@ } }, "node_modules/@napi-rs/nice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", "dev": true, "license": "MIT", "optional": true, @@ -8641,28 +8640,29 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", "cpu": [ "arm" ], @@ -8677,9 +8677,9 @@ } }, "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", "cpu": [ "arm64" ], @@ -8694,9 +8694,9 @@ } }, "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", "cpu": [ "arm64" ], @@ -8711,9 +8711,9 @@ } }, "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", "cpu": [ "x64" ], @@ -8728,9 +8728,9 @@ } }, "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", "cpu": [ "x64" ], @@ -8745,9 +8745,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", "cpu": [ "arm" ], @@ -8762,9 +8762,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", "cpu": [ "arm64" ], @@ -8779,9 +8779,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", "cpu": [ "arm64" ], @@ -8796,9 +8796,9 @@ } }, "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", "cpu": [ "ppc64" ], @@ -8813,9 +8813,9 @@ } }, "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", "cpu": [ "riscv64" ], @@ -8830,9 +8830,9 @@ } }, "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", "cpu": [ "s390x" ], @@ -8847,9 +8847,9 @@ } }, "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", "cpu": [ "x64" ], @@ -8864,9 +8864,9 @@ } }, "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", "cpu": [ "x64" ], @@ -8880,10 +8880,27 @@ "node": ">= 10" } }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", "cpu": [ "arm64" ], @@ -8898,9 +8915,9 @@ } }, "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", "cpu": [ "ia32" ], @@ -8915,9 +8932,9 @@ } }, "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", "cpu": [ "x64" ], @@ -8943,37 +8960,36 @@ } }, "node_modules/@ng-select/ng-select": { - "version": "14.9.0", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-14.9.0.tgz", - "integrity": "sha512-f/E3EaSVwdKmwvZL43nS961bGaXR90F0Gtb8vA+ub8Hfwqjr1NTI6X7+yu5iMkqfy5ZW5cJdoGvo+kv8zcAkjQ==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-20.7.0.tgz", + "integrity": "sha512-tOAhUnb4LFjTnn9gi6e6tSrUDi1GqCzjwnubBIxxa2XFHXqGOjYlqIMkPcSRByF4G9olzdZM38nLUtZOO3YKqg==", "license": "MIT", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.8.1" }, "engines": { - "node": ">= 18", - "npm": ">= 8" + "node": "^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "^19.0.0", - "@angular/core": "^19.0.0", - "@angular/forms": "^19.0.0" + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/forms": "^20.0.0" } }, "node_modules/@ngtools/webpack": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.14.tgz", - "integrity": "sha512-PqrY+eeSUoF6JC6NCEQRPE/0Y2umSllD/fsDE6pnQrvGfztBpj0Jt1WMhgEI8BBcl4S7QW0LhPynkBmnCvTUmw==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.11.tgz", + "integrity": "sha512-c2/66tObP9YevCt7jyhwiGifS8ldfce6vYQ63Wwj8tlXSSutHk8+3VEQmbW3wW1JH7+0aNf3kF+pA97EbGj6QA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", - "typescript": ">=5.5 <5.9", + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <6.0", "webpack": "^5.54.0" } }, @@ -9253,9 +9269,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -9353,9 +9369,9 @@ } }, "node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz", - "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", "dev": true, "license": "ISC", "dependencies": { @@ -11670,9 +11686,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", + "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", "cpu": [ "arm" ], @@ -11684,9 +11700,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", + "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", "cpu": [ "arm64" ], @@ -11698,9 +11714,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", + "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", "cpu": [ "arm64" ], @@ -11712,9 +11728,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", + "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", "cpu": [ "x64" ], @@ -11726,9 +11742,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", + "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", "cpu": [ "arm64" ], @@ -11740,9 +11756,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", + "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", "cpu": [ "x64" ], @@ -11754,9 +11770,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", + "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", "cpu": [ "arm" ], @@ -11768,9 +11784,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", + "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", "cpu": [ "arm" ], @@ -11782,9 +11798,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", + "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", "cpu": [ "arm64" ], @@ -11796,9 +11812,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", + "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", "cpu": [ "arm64" ], @@ -11809,10 +11825,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", + "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", "cpu": [ "loong64" ], @@ -11823,10 +11839,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", + "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", "cpu": [ "ppc64" ], @@ -11838,9 +11854,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", + "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", "cpu": [ "riscv64" ], @@ -11852,9 +11868,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", - "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", + "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", "cpu": [ "riscv64" ], @@ -11863,13 +11879,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", + "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", "cpu": [ "s390x" ], @@ -11881,9 +11896,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", + "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", "cpu": [ "x64" ], @@ -11895,9 +11910,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", + "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", "cpu": [ "x64" ], @@ -11908,10 +11923,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", + "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", + "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", "cpu": [ "arm64" ], @@ -11923,9 +11952,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", + "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", "cpu": [ "ia32" ], @@ -11936,10 +11965,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", + "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", + "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", "cpu": [ "x64" ], @@ -11958,65 +12001,18 @@ "license": "MIT" }, "node_modules/@schematics/angular": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.14.tgz", - "integrity": "sha512-p/jvMwth67g7tOrziTx+yWRagIPtjx21TF2uU2Pv5bqTY+JjRTczJs3yHPmVpzJN+ptmw47K4/NeLJmVUGuBgA==", + "version": "20.3.11", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.11.tgz", + "integrity": "sha512-9mU8nEsty96LT1t+lShDdcfEhJDVfc2sNHEIQsFY8gUVXspkT7lj570odHLqC5aumDYtWc3B/kRSzPxh8SPWFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.14", - "@angular-devkit/schematics": "19.2.14", + "@angular-devkit/core": "20.3.11", + "@angular-devkit/schematics": "20.3.11", "jsonc-parser": "3.3.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.14.tgz", - "integrity": "sha512-aaPEnRNIBoYT4XrrYcZlHadX8vFDTUR+4wUgcmr0cNDLeWzWtoPFeVq8TQD6kFDeqovSx/UVEblGgg/28WvHyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.14.tgz", - "integrity": "sha512-s89/MWXHy8+GP/cRfFbSECIG3FQQQwNVv44OOmghPVgKQgQ+EoE/zygL2hqKYTUPoPaS/IhNXdXjSE5pS9yLeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.2.14", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -12157,9 +12153,9 @@ } }, "node_modules/@sigstore/sign/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -12271,9 +12267,9 @@ } }, "node_modules/@sigstore/sign/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -12283,26 +12279,10 @@ "node": ">= 18" } }, - "node_modules/@sigstore/sign/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@sigstore/sign/node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -12353,17 +12333,16 @@ } }, "node_modules/@sigstore/sign/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -12454,19 +12433,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -12494,15 +12460,13 @@ "license": "MIT" }, "node_modules/@storybook/addon-a11y": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.6.12.tgz", - "integrity": "sha512-H28zHiL8uuv29XsVNf9VjNWsCeht/l66GPYHT7aom1jh+f3fS9+sutrCGEBC/T7cnRpy8ZyuHCtihUqS+RI4pg==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-9.1.16.tgz", + "integrity": "sha512-DpUqAMOgkC/K/DgB9osqbBYmiWWj7V444HeYLHcx7GdPtg2guq1jAcalsOnQeU3wXgUE+wNuyMm6qZKm7of11g==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/addon-highlight": "8.6.12", "@storybook/global": "^5.0.0", - "@storybook/test": "8.6.12", "axe-core": "^4.2.0" }, "funding": { @@ -12510,106 +12474,26 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-actions": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.12.tgz", - "integrity": "sha512-B5kfiRvi35oJ0NIo53CGH66H471A3XTzrfaa6SxXEJsgxxSeKScG5YeXcCvLiZfvANRQ7QDsmzPUgg0o3hdMXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@types/uuid": "^9.0.1", - "dequal": "^2.0.2", - "polished": "^4.2.2", - "uuid": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-actions/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@storybook/addon-backgrounds": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.12.tgz", - "integrity": "sha512-lmIAma9BiiCTbJ8YfdZkXjpnAIrOUcgboLkt1f6XJ78vNEMnLNzD9gnh7Tssz1qrqvm34v9daDjIb+ggdiKp3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-controls": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.12.tgz", - "integrity": "sha512-9VSRPJWQVb9wLp21uvpxDGNctYptyUX0gbvxIWOHMH3R2DslSoq41lsC/oQ4l4zSHVdL+nq8sCTkhBxIsjKqdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "dequal": "^2.0.2", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, "node_modules/@storybook/addon-designs": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-designs/-/addon-designs-8.2.1.tgz", - "integrity": "sha512-orwihs1D5alhh4Qu3BSJKbSgQOdSagvRX/25m5fYZQAaqVErBY0lRR4vCAU/G/STkcdv+MHwIQ5U+0kX5Tm2+w==", + "version": "9.0.0-next.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-designs/-/addon-designs-9.0.0-next.3.tgz", + "integrity": "sha512-xkpuet68AOYVmO/wGIkhovTpGlDamtdAiPxnm6TaJEBs9sQi5L8KNeLFwcEteloHzSyOXsiKw8Swtu0i600PEQ==", "dev": true, "license": "MIT", "dependencies": { "@figspec/react": "^1.0.0" }, "peerDependencies": { - "@storybook/blocks": "^8.0.0 || ^8.1.0-0 || ^8.2.0-0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0", - "@storybook/components": "^8.0.0 || ^8.1.0-0 || ^8.2.0-0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0", - "@storybook/theming": "^8.0.0 || ^8.1.0-0 || ^8.2.0-0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + "@storybook/addon-docs": "^0.0.0-0 || ^9.0.0 || ^9.0.0-0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^0.0.0-0 || ^9.0.0 || ^9.0.0-0" }, "peerDependenciesMeta": { - "@storybook/blocks": { - "optional": true - }, - "@storybook/components": { - "optional": true - }, - "@storybook/theming": { + "@storybook/addon-docs": { "optional": true }, "react": { @@ -12621,16 +12505,16 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.12.tgz", - "integrity": "sha512-kEezQjAf/p3SpDzLABgg4fbT48B6dkT2LiZCKTRmCrJVtuReaAr4R9MMM6Jsph6XjbIj/SvOWf3CMeOPXOs9sg==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.1.16.tgz", + "integrity": "sha512-JfaUD6fC7ySLg5duRdaWZ0FUUXrgUvqbZe/agCbSyOaIHOtJdhGaPjOC3vuXTAcV8/8/wWmbu0iXFMD08iKvdw==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.6.12", - "@storybook/csf-plugin": "8.6.12", - "@storybook/react-dom-shim": "8.6.12", + "@storybook/csf-plugin": "9.1.16", + "@storybook/icons": "^1.4.0", + "@storybook/react-dom-shim": "9.1.16", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -12640,39 +12524,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, - "node_modules/@storybook/addon-essentials": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.12.tgz", - "integrity": "sha512-Y/7e8KFlttaNfv7q2zoHMPdX6hPXHdsuQMAjYl5NG9HOAJREu4XBy4KZpbcozRe4ApZ78rYsN/MO1EuA+bNMIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addon-actions": "8.6.12", - "@storybook/addon-backgrounds": "8.6.12", - "@storybook/addon-controls": "8.6.12", - "@storybook/addon-docs": "8.6.12", - "@storybook/addon-highlight": "8.6.12", - "@storybook/addon-measure": "8.6.12", - "@storybook/addon-outline": "8.6.12", - "@storybook/addon-toolbars": "8.6.12", - "@storybook/addon-viewport": "8.6.12", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-highlight": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.12.tgz", - "integrity": "sha512-9FITVxdoycZ+eXuAZL9ElWyML/0fPPn9UgnnAkrU7zkMi+Segq/Tx7y+WWanC5zfWZrXAuG6WTOYEXeWQdm//w==", + "node_modules/@storybook/addon-links": { + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-9.1.16.tgz", + "integrity": "sha512-21SJAEuOX4Fh/5VSeakuiJJeSH2ezXBia0cZMTkKYz6GOtoojeGigo3tuebVlsn9myqnkMZxiufnnRa7Zne8vg==", "dev": true, "license": "MIT", "dependencies": { @@ -12682,48 +12540,9 @@ "type": "opencollective", "url": "https://opencollective.com/storybook" }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-interactions": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.12.tgz", - "integrity": "sha512-cTAJlTq6uVZBEbtwdXkXoPQ4jHOAGKQnYSezBT4pfNkdjn/FnEeaQhMBDzf14h2wr5OgBnJa6Lmd8LD9ficz4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.6.12", - "@storybook/test": "8.6.12", - "polished": "^4.2.2", - "ts-dedent": "^2.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-links": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.6.12.tgz", - "integrity": "sha512-AfKujFHoAxhxq4yu+6NwylltS9lf5MPs1eLLXvOlwo3l7Y/c68OdxJ7j68vLQhs9H173WVYjKyjbjFxJWf/YYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.6.12" + "storybook": "^9.1.16" }, "peerDependenciesMeta": { "react": { @@ -12731,46 +12550,10 @@ } } }, - "node_modules/@storybook/addon-measure": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.12.tgz", - "integrity": "sha512-tACmwqqOvutaQSduw8SMb62wICaT1rWaHtMN3vtWXuxgDPSdJQxLP+wdVyRYMAgpxhLyIO7YRf++Hfha9RHgFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-outline": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.12.tgz", - "integrity": "sha512-1ylwm+n1s40S91No0v9T4tCjZORu3GbnjINlyjYTDLLhQHyBQd3nWR1Y1eewU4xH4cW9SnSLcMQFS/82xHqU6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, "node_modules/@storybook/addon-themes": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.6.12.tgz", - "integrity": "sha512-eqE40MUKTz9lLEOusXjRuDC7DwCSIwlgEnlbvhhEEme8IeKf2di6yvlhenY4nn5QfkUwY1POnZxfJ2OpXj0gqQ==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-9.1.16.tgz", + "integrity": "sha512-wAB11HfXmK7KcYI6an1+WQi2m9VPfFnM4EV66VOWR+1e1PUThfwr0LhaPXj1g32lFBWdmTZp/9YLGXTyJqSQwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12781,91 +12564,47 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-toolbars": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.12.tgz", - "integrity": "sha512-HEcSzo1DyFtIu5/ikVOmh5h85C1IvK9iFKSzBR6ice33zBOaehVJK+Z5f487MOXxPsZ63uvWUytwPyViGInj+g==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/addon-viewport": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.12.tgz", - "integrity": "sha512-EXK2LArAnABsPP0leJKy78L/lbMWow+EIJfytEP5fHaW4EhMR6h7Hzaqzre6U0IMMr/jVFa1ci+m0PJ0eQc2bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, "node_modules/@storybook/angular": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-8.6.12.tgz", - "integrity": "sha512-hYbx+CaftAWuomGQ+wXpheodM5C7dTK2m/dpJ0JiWMxhMBt5Jh0SerW7KiFvODHwctXy0KZ8ZUT1PMhqPIldwg==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-9.1.16.tgz", + "integrity": "sha512-QaqMZ+KLqNj0xGiLjuL8l6iMJgQOiWIUwhebjcXC6Z7/k85KCDcBD/igxLQSj7xbzKyQGvgfZ8ykhYljndGUBA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/builder-webpack5": "8.6.12", - "@storybook/components": "8.6.12", - "@storybook/core-webpack": "8.6.12", + "@storybook/builder-webpack5": "9.1.16", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "8.6.12", - "@storybook/preview-api": "8.6.12", - "@storybook/theming": "8.6.12", - "@types/react": "^18.0.37", - "@types/react-dom": "^18.0.11", - "@types/semver": "^7.3.4", - "@types/webpack-env": "^1.18.0", - "fd-package-json": "^1.2.0", - "find-up": "^5.0.0", - "semver": "^7.3.7", - "telejson": "^7.2.0", + "telejson": "8.0.0", "ts-dedent": "^2.0.0", "tsconfig-paths-webpack-plugin": "^4.0.1", - "util-deprecate": "^1.0.2", "webpack": "5" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@angular-devkit/architect": ">=0.1500.0 < 0.2000.0", - "@angular-devkit/build-angular": ">=15.0.0 < 20.0.0", - "@angular-devkit/core": ">=15.0.0 < 20.0.0", - "@angular/animations": ">=15.0.0 < 20.0.0", - "@angular/cli": ">=15.0.0 < 20.0.0", - "@angular/common": ">=15.0.0 < 20.0.0", - "@angular/compiler": ">=15.0.0 < 20.0.0", - "@angular/compiler-cli": ">=15.0.0 < 20.0.0", - "@angular/core": ">=15.0.0 < 20.0.0", - "@angular/forms": ">=15.0.0 < 20.0.0", - "@angular/platform-browser": ">=15.0.0 < 20.0.0", - "@angular/platform-browser-dynamic": ">=15.0.0 < 20.0.0", - "rxjs": "^6.0.0 || ^7.4.0", - "storybook": "^8.6.12", - "typescript": "^4.0.0 || ^5.0.0", - "zone.js": ">= 0.11.1 < 1.0.0" + "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", + "@angular-devkit/build-angular": ">=18.0.0 < 21.0.0", + "@angular-devkit/core": ">=18.0.0 < 21.0.0", + "@angular/animations": ">=18.0.0 < 21.0.0", + "@angular/cli": ">=18.0.0 < 21.0.0", + "@angular/common": ">=18.0.0 < 21.0.0", + "@angular/compiler": ">=18.0.0 < 21.0.0", + "@angular/compiler-cli": ">=18.0.0 < 21.0.0", + "@angular/core": ">=18.0.0 < 21.0.0", + "@angular/forms": ">=18.0.0 < 21.0.0", + "@angular/platform-browser": ">=18.0.0 < 21.0.0", + "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0", + "rxjs": "^6.5.3 || ^7.4.0", + "storybook": "^9.1.16", + "typescript": "^4.9.0 || ^5.0.0", + "zone.js": ">=0.14.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -12879,14 +12618,14 @@ } } }, - "node_modules/@storybook/blocks": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.12.tgz", - "integrity": "sha512-DohlTq6HM1jDbHYiXL4ZvZ00VkhpUp5uftzj/CZDLY1fYHRjqtaTwWm2/OpceivMA8zDitLcq5atEZN+f+siTg==", + "node_modules/@storybook/builder-vite": { + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.1.16.tgz", + "integrity": "sha512-CyvYA5w1BKeSVaRavKi+euWxLffshq0v9Rz/5E9MKCitbYtjwkDH6UMIYmcbTs906mEBuYqrbz3nygDP0ppodw==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/icons": "^1.2.12", + "@storybook/csf-plugin": "9.1.16", "ts-dedent": "^2.0.0" }, "funding": { @@ -12894,46 +12633,28 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^8.6.12" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "storybook": "^9.1.16", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@storybook/builder-webpack5": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.6.12.tgz", - "integrity": "sha512-Z7RsQ/1+HbxdbM69JrEFcTL+pnVKUTMmeURMn5/eOvYTGjBtM18vbQTj0LjCUDIjC+v9U+uX8ZJEUVxFbGcxBw==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-9.1.16.tgz", + "integrity": "sha512-AkhGTLze11XMPTtEpQXFc9pUCCPnWeO3rxwbRKB+H42+WKq0YXFx0rlPVpd1HIaQ6qbBmonasRBa0bvI04O/Rg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/core-webpack": "8.6.12", - "@types/semver": "^7.3.4", - "browser-assert": "^1.2.1", + "@storybook/core-webpack": "9.1.16", "case-sensitive-paths-webpack-plugin": "^2.4.0", "cjs-module-lexer": "^1.2.3", - "constants-browserify": "^1.0.0", "css-loader": "^6.7.1", "es-module-lexer": "^1.5.0", "fork-ts-checker-webpack-plugin": "^8.0.0", "html-webpack-plugin": "^5.5.0", "magic-string": "^0.30.5", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "semver": "^7.3.7", "style-loader": "^3.3.1", "terser-webpack-plugin": "^5.3.1", "ts-dedent": "^2.0.0", - "url": "^0.11.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", "webpack": "5", "webpack-dev-middleware": "^6.1.2", "webpack-hot-middleware": "^2.25.1", @@ -12944,7 +12665,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" }, "peerDependenciesMeta": { "typescript": { @@ -13057,56 +12778,10 @@ } } }, - "node_modules/@storybook/components": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.12.tgz", - "integrity": "sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" - } - }, - "node_modules/@storybook/core": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.12.tgz", - "integrity": "sha512-t+ZuDzAlsXKa6tLxNZT81gEAt4GNwsKP/Id2wluhmUWD/lwYW0uum1JiPUuanw8xD6TdakCW/7ULZc7aQUBLCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/theming": "8.6.12", - "better-opn": "^3.0.2", - "browser-assert": "^1.2.1", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", - "esbuild-register": "^3.5.0", - "jsdoc-type-pratt-parser": "^4.0.0", - "process": "^0.11.10", - "recast": "^0.23.5", - "semver": "^7.6.2", - "util": "^0.12.5", - "ws": "^8.2.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "prettier": "^2 || ^3" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } - } - }, "node_modules/@storybook/core-webpack": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.12.tgz", - "integrity": "sha512-TiE+KOm0hxb/p0JxeGHKxqTNX+xnTOFsBh6uloCSuvodutJ5pR/XpxKVxwo1gtSc0Uq3qpgbMhW6qYlYQetnKA==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-9.1.16.tgz", + "integrity": "sha512-LyvG/MS8PFyZI+PQB6NQK5k5jjLKImxQBl37Yztbb3SjFrB0jQhSccmal1CcNH9RgaSLqUI1DKLeosGylAcbxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13117,7 +12792,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, "node_modules/@storybook/csf": { @@ -13131,9 +12806,9 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.12.tgz", - "integrity": "sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.1.16.tgz", + "integrity": "sha512-GKlNNlmWeFBQxhQY5hZOSnFGbeKq69jal0dYNWoSImTjor28eYRHb9iQkDzRpijLPizBaB9MlxLsLrgFDp7adA==", "dev": true, "license": "MIT", "dependencies": { @@ -13144,7 +12819,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, "node_modules/@storybook/global": { @@ -13155,9 +12830,9 @@ "license": "MIT" }, "node_modules/@storybook/icons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.4.0.tgz", - "integrity": "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.6.0.tgz", + "integrity": "sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==", "dev": true, "license": "MIT", "engines": { @@ -13168,56 +12843,10 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" } }, - "node_modules/@storybook/instrumenter": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.12.tgz", - "integrity": "sha512-VK5fYAF8jMwWP/u3YsmSwKGh+FeSY8WZn78flzRUwirp2Eg1WWjsqPRubAk7yTpcqcC/km9YMF3KbqfzRv2s/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@vitest/utils": "^2.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/manager-api": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.12.tgz", - "integrity": "sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" - } - }, - "node_modules/@storybook/preview-api": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.12.tgz", - "integrity": "sha512-84FE3Hrs0AYKHqpDZOwx1S/ffOfxBdL65lhCoeI8GoWwCkzwa9zEP3kvXBo/BnEDO7nAfxvMhjASTZXbKRJh5Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" - } - }, "node_modules/@storybook/react-dom-shim": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.12.tgz", - "integrity": "sha512-51QvoimkBzYs8s3rCYnY5h0cFqLz/Mh0vRcughwYaXckWzDBV8l67WBO5Xf5nBsukCbWyqBVPpEQLww8s7mrLA==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.1.16.tgz", + "integrity": "sha512-MsI4qTxdT6lMXQmo3IXhw3EaCC+vsZboyEZBx4pOJ+K/5cDJ6ZoQ3f0d4yGpVhumDxaxlnNAg954+f8WWXE1rQ==", "dev": true, "license": "MIT", "funding": { @@ -13227,30 +12856,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.6.12" - } - }, - "node_modules/@storybook/test": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.12.tgz", - "integrity": "sha512-0BK1Eg+VD0lNMB1BtxqHE3tP9FdkUmohtvWG7cq6lWvMrbCmAmh3VWai3RMCCDOukPFpjabOr8BBRLVvhNpv2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.6.12", - "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "6.5.0", - "@testing-library/user-event": "14.5.2", - "@vitest/expect": "2.0.5", - "@vitest/spy": "2.0.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, "node_modules/@storybook/test-runner": { @@ -13290,37 +12896,19 @@ "storybook": "^0.0.0-0 || ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 || ^9.0.0-0" } }, - "node_modules/@storybook/theming": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.12.tgz", - "integrity": "sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" - } - }, "node_modules/@storybook/web-components": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-8.6.12.tgz", - "integrity": "sha512-j+609VT8abBlpV+tB/vqSRO/fKA1QpnKWlbE0JpolzmEbgla//pAZomPysoOnvTLL3lSX3conjiAAaTpwbjyLg==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-9.1.16.tgz", + "integrity": "sha512-YQbJhybF8QBI2yWNrgJbL+eTcZ7IX38xZOlN7U51/yybX40FIunHlLsektGMImI7rvmtf/2AGFHAj5FMqSfYiw==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/components": "8.6.12", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "8.6.12", - "@storybook/preview-api": "8.6.12", - "@storybook/theming": "8.6.12", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "funding": { "type": "opencollective", @@ -13328,29 +12916,28 @@ }, "peerDependencies": { "lit": "^2.0.0 || ^3.0.0", - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, - "node_modules/@storybook/web-components-webpack5": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/@storybook/web-components-webpack5/-/web-components-webpack5-8.6.12.tgz", - "integrity": "sha512-DUrmxufzd9KZdPVaaYS5CG590EL/LM+wjber///sPtI0C/WdUUTCrg+2R5rYkX4f8bfqSH1y/MkJCiD+cW0TKg==", + "node_modules/@storybook/web-components-vite": { + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-9.1.16.tgz", + "integrity": "sha512-WPmyTUy9DlWHP+sJY3eVyxYUtHPIXOQyhhvKU4YKBmihIUz8r0ObxLYnJXFHXWZcFuayn2B46MMHAWrnkXjMhw==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/builder-webpack5": "8.6.12", - "@storybook/web-components": "8.6.12" + "@storybook/builder-vite": "9.1.16", + "@storybook/web-components": "9.1.16" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "lit": "^2.0.0 || ^3.0.0", - "storybook": "^8.6.12" + "storybook": "^9.1.16" } }, "node_modules/@swc/core": { @@ -13611,19 +13198,20 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", - "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", + "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { @@ -13636,23 +13224,23 @@ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "dequal": "^2.0.3" } }, "node_modules/@testing-library/jest-dom": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", - "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", - "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", + "picocolors": "^1.1.1", "redent": "^3.0.0" }, "engines": { @@ -13661,20 +13249,6 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", @@ -13683,9 +13257,9 @@ "license": "MIT" }, "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "dev": true, "license": "MIT", "engines": { @@ -13867,7 +13441,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -13942,6 +13517,17 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/chrome": { "version": "0.1.28", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.28.tgz", @@ -14002,6 +13588,13 @@ "@types/ms": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -14490,7 +14083,8 @@ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/proper-lockfile": { "version": "4.1.4", @@ -14520,21 +14114,12 @@ "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -14634,13 +14219,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/verror": { "version": "1.10.11", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", @@ -14659,13 +14237,6 @@ "@types/node": "*" } }, - "node_modules/@types/webpack-env": { - "version": "1.18.8", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", - "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -15496,99 +15067,98 @@ ] }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", - "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.21.3" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^6.0.0 || ^7.0.0" } }, "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" + "magic-string": "^0.30.17" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^4.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -16272,20 +15842,46 @@ "ajv": "^8.8.2" } }, - "node_modules/angular-eslint": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-19.6.0.tgz", - "integrity": "sha512-9qfP6rR6De5xe9WyviD9Vdpg2F3iHTlo7T1129ms0AQXrG9/U/upIQmNUN+Jz9CiJcHDUsniyd+EL8hjuNYnOg==", + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 19.0.0 < 20.0.0", - "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", - "@angular-eslint/builder": "19.6.0", - "@angular-eslint/eslint-plugin": "19.6.0", - "@angular-eslint/eslint-plugin-template": "19.6.0", - "@angular-eslint/schematics": "19.6.0", - "@angular-eslint/template-parser": "19.6.0", + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/angular-eslint": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.7.0.tgz", + "integrity": "sha512-BCiTCLO3dr8pGPaM7qLcCruWNcoNNHnLn4DPqE5tHk1TAnTx5TcGy0p/FygharZw5RjWfDHLBjFfpeh4XWLMmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/builder": "20.7.0", + "@angular-eslint/eslint-plugin": "20.7.0", + "@angular-eslint/eslint-plugin-template": "20.7.0", + "@angular-eslint/schematics": "20.7.0", + "@angular-eslint/template-parser": "20.7.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, @@ -17168,13 +16764,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -17331,14 +16927,14 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", - "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "css-select": "^5.1.0", - "css-what": "^6.1.0", + "css-select": "^6.0.0", + "css-what": "^7.0.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "htmlparser2": "^10.0.0", @@ -17350,6 +16946,36 @@ "node": ">=14.0.0" } }, + "node_modules/beasties/node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/beasties/node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/bent": { "version": "7.3.12", "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", @@ -17637,12 +17263,6 @@ "braintree-web": "3.123.2" } }, - "node_modules/browser-assert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true - }, "node_modules/browser-hrtime": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/browser-hrtime/-/browser-hrtime-1.1.8.tgz", @@ -18321,9 +17941,9 @@ } }, "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -18334,7 +17954,7 @@ "pathval": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/chalk": { @@ -19238,13 +18858,6 @@ "dev": true, "license": "MIT" }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "license": "MIT" - }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -20615,7 +20228,8 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-converter": { "version": "0.2.0", @@ -21488,9 +21102,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "devOptional": true, "hasInstallScript": true, "license": "MIT", @@ -21501,31 +21115,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/esbuild-register": { @@ -21542,9 +21157,9 @@ } }, "node_modules/esbuild-wasm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.4.tgz", - "integrity": "sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.9.tgz", + "integrity": "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA==", "dev": true, "license": "MIT", "bin": { @@ -21908,21 +21523,20 @@ } }, "node_modules/eslint-plugin-storybook": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.12.0.tgz", - "integrity": "sha512-Lg5I0+npTgiYgZ4KSvGWGDFZi3eOCNJPaWX0c9rTEEXC5wvooOClsP9ZtbI4hhFKyKgYR877KiJxbRTSJq9gWA==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-9.1.16.tgz", + "integrity": "sha512-I8f3DXniPxFbcptVgOjtIHNvW6sDu1O2d1zNsxLKmeAvEaRLus1ij8iFHCgkNzMthrU5U2F4Wdo/aaSpz5kHjA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf": "^0.1.11", - "@typescript-eslint/utils": "^8.8.1", - "ts-dedent": "^2.2.0" + "@typescript-eslint/utils": "^8.8.1" }, "engines": { - "node": ">= 18" + "node": ">=20.0.0" }, "peerDependencies": { - "eslint": ">=8" + "eslint": ">=8", + "storybook": "^9.1.16" } }, "node_modules/eslint-plugin-tailwindcss": { @@ -22578,16 +22192,6 @@ "bser": "2.1.1" } }, - "node_modules/fd-package-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", - "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "walk-up-path": "^3.0.1" - } - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -22599,10 +22203,13 @@ } }, "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -23682,39 +23289,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "license": "MIT" }, "node_modules/gopd": { "version": "1.2.0", @@ -24550,9 +24129,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", - "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -24560,16 +24139,32 @@ } }, "node_modules/ignore-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", - "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, "license": "ISC", "dependencies": { - "minimatch": "^9.0.0" + "minimatch": "^10.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/image-size": { @@ -27556,16 +27151,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/jsdom": { "version": "26.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", @@ -28133,9 +27718,9 @@ "license": "MIT" }, "node_modules/less": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", - "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", + "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==", "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", @@ -28146,7 +27731,7 @@ "lessc": "bin/lessc" }, "engines": { - "node": ">=6" + "node": ">=14" }, "optionalDependencies": { "errno": "^0.1.1", @@ -28159,9 +27744,9 @@ } }, "node_modules/less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.0.tgz", + "integrity": "sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==", "dev": true, "license": "MIT", "engines": { @@ -28520,9 +28105,9 @@ } }, "node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", "dev": true, "license": "MIT", "dependencies": { @@ -28534,13 +28119,13 @@ "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -28551,9 +28136,9 @@ } }, "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -28581,9 +28166,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -28643,9 +28228,9 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -28659,9 +28244,9 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -28708,9 +28293,9 @@ } }, "node_modules/lmdb": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", - "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -28726,22 +28311,15 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.2.6", - "@lmdb/lmdb-darwin-x64": "3.2.6", - "@lmdb/lmdb-linux-arm": "3.2.6", - "@lmdb/lmdb-linux-arm64": "3.2.6", - "@lmdb/lmdb-linux-x64": "3.2.6", - "@lmdb/lmdb-win32-x64": "3.2.6" + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" } }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -29160,6 +28738,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -29327,13 +28906,6 @@ "tmpl": "1.0.5" } }, - "node_modules/map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", - "dev": true, - "license": "MIT" - }, "node_modules/map-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", @@ -29628,16 +29200,6 @@ "node": ">= 4.0.0" } }, - "node_modules/memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-or-similar": "^1.5.0" - } - }, "node_modules/merge-descriptors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", @@ -30725,9 +30287,9 @@ "license": "MIT" }, "node_modules/msgpackr": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.4.tgz", - "integrity": "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", + "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", "dev": true, "license": "MIT", "optional": true, @@ -31061,6 +30623,14 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-api-version": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", @@ -31628,9 +31198,9 @@ } }, "node_modules/npm-install-checks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz", - "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -31651,6 +31221,115 @@ } }, "node_modules/npm-package-arg": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm-package-arg/node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.3.tgz", + "integrity": "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist/node_modules/proc-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.0.0.tgz", + "integrity": "sha512-KG/XsTDN901PNfPfAMmj6N/Ywg9tM+bHK8pAz+27fS4N4Pcr+4zoYBOcGSBu6ceXYNPxkLpa4ohtfxV1XcLAfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", @@ -31666,27 +31345,7 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", - "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/npm-package-arg/node_modules/proc-log": { + "node_modules/npm-pick-manifest/node_modules/proc-log": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", @@ -31696,35 +31355,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-packlist": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", - "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^7.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", - "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", - "npm-package-arg": "^12.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-registry-fetch": { "version": "18.0.2", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", @@ -31806,9 +31436,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -31826,6 +31456,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm-registry-fetch/node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -31920,9 +31563,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -31932,26 +31575,26 @@ "node": ">= 18" } }, - "node_modules/npm-registry-fetch/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm-registry-fetch/node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -32002,17 +31645,16 @@ } }, "node_modules/npm-registry-fetch/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -32878,9 +32520,9 @@ } }, "node_modules/ordered-binary": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", - "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", "dev": true, "license": "MIT", "optional": true @@ -33069,9 +32711,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", - "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", "dev": true, "license": "ISC", "dependencies": { @@ -33084,7 +32726,7 @@ "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", + "npm-packlist": "^10.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", @@ -33097,7 +32739,7 @@ "pacote": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/pacote/node_modules/@npmcli/fs": { @@ -33138,17 +32780,16 @@ } }, "node_modules/pacote/node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -33179,9 +32820,9 @@ } }, "node_modules/pacote/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -33199,6 +32840,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/pacote/node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -33252,9 +32906,9 @@ } }, "node_modules/pacote/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -33264,26 +32918,26 @@ "node": ">= 18" } }, - "node_modules/pacote/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/pacote/node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -33466,20 +33120,33 @@ } }, "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", @@ -33495,13 +33162,13 @@ } }, "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "parse5": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -33603,23 +33270,10 @@ "node": ">=16" } }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -33711,13 +33365,16 @@ } }, "node_modules/piscina": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", - "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20.x" + }, "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "@napi-rs/nice": "^1.0.4" } }, "node_modules/pkce-challenge": { @@ -33967,19 +33624,6 @@ "node": ">=10.4.0" } }, - "node_modules/polished": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", - "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -34896,6 +34540,7 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -34911,6 +34556,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -35297,7 +34943,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/read-binary-file-arch": { "version": "1.0.6", @@ -35472,12 +35119,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/regex-parser": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", @@ -36031,13 +35672,13 @@ } }, "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", - "dev": true, + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", + "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "devOptional": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -36047,35 +35688,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -37701,9 +37338,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true, "license": "CC0-1.0" }, @@ -37851,6 +37488,19 @@ "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/steno": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", @@ -37875,17 +37525,26 @@ } }, "node_modules/storybook": { - "version": "8.6.12", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.12.tgz", - "integrity": "sha512-Z/nWYEHBTLK1ZBtAWdhxC0l5zf7ioJ7G4+zYqtTdYeb67gTnxNj80gehf8o8QY9L2zA2+eyMRGLC2V5fI7Z3Tw==", + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.1.16.tgz", + "integrity": "sha512-339U14K6l46EFyRvaPS2ZlL7v7Pb+LlcXT8KAETrGPxq8v1sAjj2HAOB6zrlAK3M+0+ricssfAwsLCwt7Eg8TQ==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/core": "8.6.12" + "@storybook/global": "^5.0.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/spy": "3.2.4", + "better-opn": "^3.0.2", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", + "esbuild-register": "^3.5.0", + "recast": "^0.23.5", + "semver": "^7.6.2", + "ws": "^8.18.0" }, "bin": { - "getstorybook": "bin/index.cjs", - "sb": "bin/index.cjs", "storybook": "bin/index.cjs" }, "funding": { @@ -38382,16 +38041,6 @@ "node": ">= 10" } }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -38666,14 +38315,11 @@ "license": "ISC" }, "node_modules/telejson": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", - "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-8.0.0.tgz", + "integrity": "sha512-8mCI1dHX80nchOkIEgvyWlGLgeh/SxO7JZPOud0DxvfFdI6MgwxRL8ff7rVdj6436uHhpWaxLQjU74Jb2I0u9g==", "dev": true, - "license": "MIT", - "dependencies": { - "memoizerific": "^1.11.3" - } + "license": "MIT" }, "node_modules/temp": { "version": "0.9.4", @@ -38795,13 +38441,13 @@ } }, "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -39036,9 +38682,9 @@ } }, "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -39046,9 +38692,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -39392,6 +39038,26 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "license": "MIT" }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -39524,15 +39190,15 @@ "license": "0BSD" }, "node_modules/tuf-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", "dev": true, "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -39599,9 +39265,9 @@ } }, "node_modules/tuf-js/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -39713,9 +39379,9 @@ } }, "node_modules/tuf-js/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -39725,26 +39391,10 @@ "node": ">= 18" } }, - "node_modules/tuf-js/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tuf-js/node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -39795,17 +39445,16 @@ } }, "node_modules/tuf-js/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -40256,19 +39905,6 @@ "node": ">=4" } }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -40639,9 +40275,9 @@ } }, "node_modules/validate-npm-package-name": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", - "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", "dev": true, "license": "ISC", "engines": { @@ -40733,25 +40369,24 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -40760,14 +40395,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -40808,330 +40443,53 @@ } } }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", - "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", - "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", - "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", - "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", - "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", - "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", - "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", - "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", - "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", - "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", - "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", - "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", - "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", - "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", - "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", - "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", - "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", - "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", - "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/vite/node_modules/rollup": { - "version": "4.44.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", - "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", - "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "@types/estree": "1.0.8" + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" }, - "bin": { - "rollup": "dist/bin/rollup" + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">=12.0.0" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.0", - "@rollup/rollup-android-arm64": "4.44.0", - "@rollup/rollup-darwin-arm64": "4.44.0", - "@rollup/rollup-darwin-x64": "4.44.0", - "@rollup/rollup-freebsd-arm64": "4.44.0", - "@rollup/rollup-freebsd-x64": "4.44.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", - "@rollup/rollup-linux-arm-musleabihf": "4.44.0", - "@rollup/rollup-linux-arm64-gnu": "4.44.0", - "@rollup/rollup-linux-arm64-musl": "4.44.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", - "@rollup/rollup-linux-riscv64-gnu": "4.44.0", - "@rollup/rollup-linux-riscv64-musl": "4.44.0", - "@rollup/rollup-linux-s390x-gnu": "4.44.0", - "@rollup/rollup-linux-x64-gnu": "4.44.0", - "@rollup/rollup-linux-x64-musl": "4.44.0", - "@rollup/rollup-win32-arm64-msvc": "4.44.0", - "@rollup/rollup-win32-ia32-msvc": "4.44.0", - "@rollup/rollup-win32-x64-msvc": "4.44.0", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/w3c-xmlserializer": { @@ -41315,13 +40673,6 @@ "node": ">=4" } }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true, - "license": "ISC" - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -41332,10 +40683,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -42188,19 +41538,6 @@ "node": ">= 0.6" } }, - "node_modules/webpack/node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -42529,6 +41866,22 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -42666,9 +42019,9 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, "license": "MIT", "engines": { @@ -42679,9 +42032,9 @@ } }, "node_modules/zod": { - "version": "3.25.67", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", - "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 61aefe8ce20..7e7979b6227 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "libs/**/*" ], "devDependencies": { - "@angular-devkit/build-angular": "19.2.14", - "@angular-eslint/schematics": "19.6.0", - "@angular/cli": "19.2.14", - "@angular/compiler-cli": "19.2.14", + "@angular-devkit/build-angular": "20.3.11", + "@angular-eslint/schematics": "20.7.0", + "@angular/cli": "20.3.11", + "@angular/compiler-cli": "20.3.13", "@babel/core": "7.28.5", "@babel/preset-env": "7.28.5", "@compodoc/compodoc": "1.1.26", @@ -49,19 +49,15 @@ "@electron/rebuild": "4.0.1", "@eslint/compat": "2.0.0", "@lit-labs/signals": "0.1.2", - "@ngtools/webpack": "19.2.14", - "@storybook/addon-a11y": "8.6.12", - "@storybook/addon-actions": "8.6.12", - "@storybook/addon-designs": "8.2.1", - "@storybook/addon-essentials": "8.6.12", - "@storybook/addon-interactions": "8.6.12", - "@storybook/addon-links": "8.6.12", - "@storybook/addon-themes": "8.6.12", - "@storybook/angular": "8.6.12", - "@storybook/manager-api": "8.6.12", + "@ngtools/webpack": "20.3.11", + "@storybook/addon-a11y": "9.1.16", + "@storybook/addon-designs": "9.0.0-next.3", + "@storybook/addon-docs": "9.1.16", + "@storybook/addon-links": "9.1.16", + "@storybook/addon-themes": "9.1.16", + "@storybook/angular": "9.1.16", "@storybook/test-runner": "0.22.0", - "@storybook/theming": "8.6.12", - "@storybook/web-components-webpack5": "8.6.12", + "@storybook/web-components-vite": "9.1.16", "@tailwindcss/container-queries": "0.1.1", "@types/chrome": "0.1.28", "@types/firefox-webext-browser": "143.0.0", @@ -86,7 +82,7 @@ "@typescript-eslint/utils": "8.31.0", "@webcomponents/custom-elements": "1.6.0", "@yao-pkg/pkg": "6.5.1", - "angular-eslint": "19.6.0", + "angular-eslint": "20.7.0", "autoprefixer": "10.4.21", "axe-playwright": "2.2.2", "babel-loader": "9.2.1", @@ -109,7 +105,7 @@ "eslint-plugin-import": "2.31.0", "eslint-plugin-rxjs": "5.0.3", "eslint-plugin-rxjs-angular": "2.0.1", - "eslint-plugin-storybook": "0.12.0", + "eslint-plugin-storybook": "9.1.16", "eslint-plugin-tailwindcss": "3.18.0", "html-loader": "5.1.0", "html-webpack-injector": "1.1.4", @@ -123,6 +119,7 @@ "lint-staged": "16.0.0", "mini-css-extract-plugin": "2.9.4", "nx": "21.6.9", + "path-browserify": "1.0.1", "postcss": "8.5.6", "postcss-loader": "8.2.0", "prettier": "3.6.2", @@ -132,7 +129,7 @@ "rimraf": "6.0.1", "sass": "1.94.2", "sass-loader": "16.0.6", - "storybook": "8.6.12", + "storybook": "9.1.16", "style-loader": "4.0.0", "tailwindcss": "3.4.17", "ts-jest": "29.4.5", @@ -151,15 +148,15 @@ "webpack-node-externals": "3.0.0" }, "dependencies": { - "@angular/animations": "19.2.14", - "@angular/cdk": "19.2.18", - "@angular/common": "19.2.14", - "@angular/compiler": "19.2.14", - "@angular/core": "19.2.14", - "@angular/forms": "19.2.14", - "@angular/platform-browser": "19.2.14", - "@angular/platform-browser-dynamic": "19.2.14", - "@angular/router": "19.2.14", + "@angular/animations": "20.3.13", + "@angular/cdk": "20.2.14", + "@angular/common": "20.3.13", + "@angular/compiler": "20.3.13", + "@angular/core": "20.3.13", + "@angular/forms": "20.3.13", + "@angular/platform-browser": "20.3.13", + "@angular/platform-browser-dynamic": "20.3.13", + "@angular/router": "20.3.13", "@bitwarden/sdk-internal": "0.2.0-main.395", "@bitwarden/commercial-sdk-internal": "0.2.0-main.395", "@electron/fuses": "1.8.0", @@ -168,7 +165,7 @@ "@koa/router": "14.0.0", "@microsoft/signalr": "8.0.7", "@microsoft/signalr-protocol-msgpack": "8.0.7", - "@ng-select/ng-select": "14.9.0", + "@ng-select/ng-select": "20.7.0", "@nx/devkit": "21.6.9", "@nx/eslint": "21.6.9", "@nx/jest": "21.6.9", @@ -208,6 +205,7 @@ "tldts": "7.0.18", "ts-node": "10.9.2", "utf-8-validate": "6.0.5", + "vite-tsconfig-paths": "5.1.4", "zone.js": "0.15.1", "zxcvbn": "4.4.2" }, @@ -229,7 +227,7 @@ "*.ts": "eslint --cache --cache-strategy content --fix" }, "engines": { - "node": "~22", + "node": ">=22.12.0", "npm": "~10" } } From 399a5147a9b766f43168a0c7bfc8343990881dd7 Mon Sep 17 00:00:00 2001 From: Leslie Tilton <23057410+Banrion@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:52:03 -0600 Subject: [PATCH 31/37] Remove additional flag from organization layout html component (#17755) --- .../organizations/layouts/organization-layout.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html index accb5f77fdc..e84f78458d6 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html @@ -4,7 +4,7 @@ From aac7ca172b02b838f4b830ffe2d8d832bc84c6cc Mon Sep 17 00:00:00 2001 From: Vicki League Date: Mon, 1 Dec 2025 15:38:09 -0500 Subject: [PATCH 32/37] [CL-717] Skip failing test affected by Angular 20 upgrade (#17761) --- apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts b/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts index 59e743f430a..4d5c3a90253 100644 --- a/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts +++ b/apps/desktop/src/app/layout/desktop-side-nav.component.spec.ts @@ -62,7 +62,7 @@ describe("DesktopSideNavComponent", () => { expect(component.variant()).toBe("secondary"); }); - it("passes variant to bit-side-nav", () => { + it.skip("passes variant to bit-side-nav", () => { fixture.componentRef.setInput("variant", "secondary"); fixture.detectChanges(); From e694ab490c00ef94e7d4d0522308b6443497e3e4 Mon Sep 17 00:00:00 2001 From: Nik Gilmore Date: Mon, 1 Dec 2025 12:50:13 -0800 Subject: [PATCH 33/37] [PM-23562] Prevent closing dialog and window when uploading an attachment (#17287) * Prevent users from cancelling an in-flight upload, and attempt to block them from closing the window. * Add comment for deprecated event.returnValue --- .../cipher-attachments.component.ts | 13 ++++++ .../attachments/attachments-v2.component.html | 2 + .../attachments/attachments-v2.component.ts | 43 ++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) 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 56c3414a12e..a5306606199 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 @@ -108,11 +108,21 @@ export class CipherAttachmentsComponent implements OnInit, AfterViewInit { // eslint-disable-next-line @angular-eslint/prefer-signals @Input() submitBtn?: ButtonComponent; + /** Emits when a file upload is started */ + // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals + // eslint-disable-next-line @angular-eslint/prefer-output-emitter-ref + @Output() onUploadStarted = new EventEmitter(); + /** Emits after a file has been successfully uploaded */ // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals // eslint-disable-next-line @angular-eslint/prefer-output-emitter-ref @Output() onUploadSuccess = new EventEmitter(); + /** Emits when a file upload fails */ + // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals + // eslint-disable-next-line @angular-eslint/prefer-output-emitter-ref + @Output() onUploadFailed = new EventEmitter(); + /** Emits after a file has been successfully removed */ // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals // eslint-disable-next-line @angular-eslint/prefer-output-emitter-ref @@ -196,6 +206,8 @@ export class CipherAttachmentsComponent implements OnInit, AfterViewInit { /** Save the attachments to the cipher */ submit = async () => { + this.onUploadStarted.emit(); + const file = this.attachmentForm.value.file; if (file === null) { this.toastService.showToast({ @@ -253,6 +265,7 @@ export class CipherAttachmentsComponent implements OnInit, AfterViewInit { variant: "error", message: errorMessage, }); + this.onUploadFailed.emit(); } }; diff --git a/libs/vault/src/cipher-view/attachments/attachments-v2.component.html b/libs/vault/src/cipher-view/attachments/attachments-v2.component.html index 3b096634069..a8dc22c75ac 100644 --- a/libs/vault/src/cipher-view/attachments/attachments-v2.component.html +++ b/libs/vault/src/cipher-view/attachments/attachments-v2.component.html @@ -9,7 +9,9 @@ [organizationId]="organizationId" [admin]="admin" [submitBtn]="submitBtn" + (onUploadStarted)="uploadStarted()" (onUploadSuccess)="uploadSuccessful()" + (onUploadFailed)="uploadFailed()" (onRemoveSuccess)="removalSuccessful()" > diff --git a/libs/vault/src/cipher-view/attachments/attachments-v2.component.ts b/libs/vault/src/cipher-view/attachments/attachments-v2.component.ts index 2796cae08d0..218f5b2c6d3 100644 --- a/libs/vault/src/cipher-view/attachments/attachments-v2.component.ts +++ b/libs/vault/src/cipher-view/attachments/attachments-v2.component.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { CommonModule } from "@angular/common"; -import { Component, Inject } from "@angular/core"; +import { Component, HostListener, Inject } from "@angular/core"; import { CipherId, OrganizationId } from "@bitwarden/common/types/guid"; import { UnionOfValues } from "@bitwarden/common/vault/types/union-of-values"; @@ -52,6 +52,7 @@ export class AttachmentsV2Component { admin: boolean = false; organizationId?: OrganizationId; attachmentFormId = CipherAttachmentsComponent.attachmentFormID; + private isUploading = false; /** * Constructor for AttachmentsV2Component. @@ -82,16 +83,54 @@ export class AttachmentsV2Component { }); } + /** + * Prevent browser tab from closing/refreshing during upload. + * Shows a confirmation dialog if user tries to leave during an active upload. + * This provides additional protection beyond dialogRef.disableClose. + * Using arrow function to preserve 'this' context when used as event listener. + */ + @HostListener("window:beforeunload", ["$event"]) + private handleBeforeUnloadEvent = (event: BeforeUnloadEvent): string | undefined => { + if (this.isUploading) { + event.preventDefault(); + // The custom message is not displayed in modern browsers, but MDN docs still recommend setting it for legacy support. + const message = "Upload in progress. Are you sure you want to leave?"; + event.returnValue = message; + return message; + } + return undefined; + }; + + /** + * Called when an attachment upload is started. + * Disables closing the dialog to prevent accidental interruption. + */ + uploadStarted() { + this.isUploading = true; + this.dialogRef.disableClose = true; + } + /** * Called when an attachment is successfully uploaded. - * Closes the dialog with an 'uploaded' result. + * Re-enables dialog closing and closes the dialog with an 'uploaded' result. */ uploadSuccessful() { + this.isUploading = false; + this.dialogRef.disableClose = false; this.dialogRef.close({ action: AttachmentDialogResult.Uploaded, }); } + /** + * Called when an attachment upload fails. + * Re-enables closing the dialog. + */ + uploadFailed() { + this.isUploading = false; + this.dialogRef.disableClose = false; + } + /** * Called when an attachment is successfully removed. * Closes the dialog with a 'removed' result. From 99186e36512d3f85433e74230da0df2a17d078d5 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:52:59 -0800 Subject: [PATCH 34/37] [PM-28514] - fix item copy actions for totp. add specs (#17709) * fix item copy actions for totp. add specs * add test to satisfy claude --- .../item-copy-actions.component.spec.ts | 425 ++++++++++++++++++ .../item-copy-actions.component.ts | 7 +- 2 files changed, 430 insertions(+), 2 deletions(-) create mode 100644 apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.spec.ts diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.spec.ts new file mode 100644 index 00000000000..84ce58913a9 --- /dev/null +++ b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.spec.ts @@ -0,0 +1,425 @@ +import { CommonModule } from "@angular/common"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { of } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + CipherViewLike, + CipherViewLikeUtils, +} from "@bitwarden/common/vault/utils/cipher-view-like-utils"; +import { IconButtonModule, ItemModule, MenuModule } from "@bitwarden/components"; +import { CipherListView, CopyableCipherFields } from "@bitwarden/sdk-internal"; + +import { VaultPopupCopyButtonsService } from "../../../services/vault-popup-copy-buttons.service"; + +import { ItemCopyActionsComponent } from "./item-copy-actions.component"; + +describe("ItemCopyActionsComponent", () => { + let fixture: ComponentFixture; + let component: ItemCopyActionsComponent; + + let i18nService: jest.Mocked; + + beforeEach(async () => { + i18nService = { + t: jest.fn((key: string) => `translated-${key}`), + } as unknown as jest.Mocked; + + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + JslibModule, + ItemModule, + IconButtonModule, + MenuModule, + ItemCopyActionsComponent, // standalone + ], + providers: [ + { provide: I18nService, useValue: i18nService }, + { + provide: VaultPopupCopyButtonsService, + useValue: { + showQuickCopyActions$: of(true), + } satisfies Partial, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(ItemCopyActionsComponent); + component = fixture.componentInstance; + + // Default cipher so tests can override as needed + component.cipher = { + name: "My cipher", + viewPassword: true, + login: { username: null, password: null, totp: null }, + card: { code: null, number: null }, + identity: { + fullAddressForCopy: null, + email: null, + username: null, + phone: null, + }, + sshKey: { + privateKey: null, + publicKey: null, + keyFingerprint: null, + }, + notes: null, + copyableFields: [], + } as unknown as CipherViewLike; + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe("findSingleCopyableItem", () => { + beforeEach(() => { + jest + .spyOn(CipherViewLikeUtils, "hasCopyableValue") + .mockImplementation( + (cipher: CipherViewLike & { __copyable?: Record }, field) => { + return Boolean(cipher.__copyable?.[field]); + }, + ); + }); + + it("returns the single item with value and translates its key", () => { + const items = [ + { key: "copyUsername", field: "username" as const }, + { key: "copyPassword", field: "password" as const }, + ]; + + (component.cipher as any).__copyable = { + username: true, + password: false, + }; + + const result = component.findSingleCopyableItem(items); + + expect(result).toEqual({ + key: "translated-copyUsername", + field: "username", + }); + expect(i18nService.t).toHaveBeenCalledWith("copyUsername"); + }); + + it("returns null when no items have a value", () => { + const items = [ + { key: "copyUsername", field: "username" as const }, + { key: "copyPassword", field: "password" as const }, + ]; + + (component.cipher as any).__copyable = { + username: false, + password: false, + }; + + const result = component.findSingleCopyableItem(items); + + expect(result).toBeNull(); + }); + + it("returns null when more than one item has a value", () => { + const items = [ + { key: "copyUsername", field: "username" as const }, + { key: "copyPassword", field: "password" as const }, + ]; + + (component.cipher as any).__copyable = { + username: true, + password: true, + }; + + const result = component.findSingleCopyableItem(items); + + expect(result).toBeNull(); + }); + }); + + describe("singleCopyableLogin", () => { + beforeEach(() => { + jest + .spyOn(CipherViewLikeUtils, "hasCopyableValue") + .mockImplementation( + (cipher: CipherViewLike & { __copyable?: Record }, field) => { + return Boolean(cipher.__copyable?.[field]); + }, + ); + }); + + it("returns username with special-case logic when password is hidden and both username/password exist and no totp", () => { + (component.cipher as CipherView).viewPassword = false; + + (component.cipher as any).__copyable = { + username: true, + password: true, + totp: false, + }; + + const result = component.singleCopyableLogin; + + expect(result).toEqual({ + key: "translated-copyUsername", + field: "username", + }); + expect(i18nService.t).toHaveBeenCalledWith("copyUsername"); + }); + + it("returns null when password is hidden but multiple fields exist, ensuring username and totp are shown in the menu UI ", () => { + (component.cipher as CipherView).viewPassword = false; + + (component.cipher as any).__copyable = { + username: true, + password: true, + totp: true, + }; + + const result = component.singleCopyableLogin; + + expect(result).toBeNull(); + }); + + it("falls back to findSingleCopyableItem when password is visible", () => { + const findSingleCopyableItemSpy = jest.spyOn(component, "findSingleCopyableItem"); + (component.cipher as CipherView).viewPassword = true; + + void component.singleCopyableLogin; + expect(findSingleCopyableItemSpy).toHaveBeenCalled(); + }); + }); + + describe("singleCopyableCard", () => { + beforeEach(() => { + jest + .spyOn(CipherViewLikeUtils, "hasCopyableValue") + .mockImplementation( + (cipher: CipherViewLike & { __copyable?: Record }, field) => { + return Boolean(cipher.__copyable?.[field]); + }, + ); + }); + + it("returns security code when it is the only available card value", () => { + (component.cipher as any).__copyable = { + securityCode: true, + cardNumber: false, + }; + + const result = component.singleCopyableCard; + + expect(result).toEqual({ + key: "translated-securityCode", + field: "securityCode", + }); + expect(i18nService.t).toHaveBeenCalledWith("securityCode"); + }); + + it("returns null when both card number and security code are available", () => { + (component.cipher as any).__copyable = { + securityCode: true, + cardNumber: true, + }; + + const result = component.singleCopyableCard; + + expect(result).toBeNull(); + }); + }); + + describe("singleCopyableIdentity", () => { + beforeEach(() => { + jest + .spyOn(CipherViewLikeUtils, "hasCopyableValue") + .mockImplementation( + (cipher: CipherViewLike & { __copyable?: Record }, field) => { + return Boolean(cipher.__copyable?.[field]); + }, + ); + }); + + it("returns the only copyable identity field", () => { + (component.cipher as any).__copyable = { + address: false, + email: true, + username: false, + phone: false, + }; + + const result = component.singleCopyableIdentity; + + expect(result).toEqual({ + key: "translated-email", + field: "email", + }); + expect(i18nService.t).toHaveBeenCalledWith("email"); + }); + + it("returns null when multiple identity fields are available", () => { + (component.cipher as any).__copyable = { + address: true, + email: true, + username: false, + phone: false, + }; + + const result = component.singleCopyableIdentity; + + expect(result).toBeNull(); + }); + }); + + describe("has*Values in non-list view", () => { + beforeEach(() => { + jest.spyOn(CipherViewLikeUtils, "isCipherListView").mockReturnValue(false); + }); + + it("computes hasLoginValues from login fields", () => { + (component.cipher as CipherView).login = { + username: "user", + password: null, + totp: null, + } as any; + + expect(component.hasLoginValues).toBe(true); + + (component.cipher as CipherView).login = { + username: null, + password: null, + totp: null, + } as any; + + expect(component.hasLoginValues).toBe(false); + }); + + it("computes hasCardValues from card fields", () => { + (component.cipher as CipherView).card = { code: "123", number: null } as any; + + expect(component.hasCardValues).toBe(true); + + (component.cipher as CipherView).card = { code: null, number: null } as any; + + expect(component.hasCardValues).toBe(false); + }); + + it("computes hasIdentityValues from identity fields", () => { + (component.cipher as CipherView).identity = { + fullAddressForCopy: null, + email: "test@example.com", + username: null, + phone: null, + } as any; + + expect(component.hasIdentityValues).toBe(true); + + (component.cipher as CipherView).identity = { + fullAddressForCopy: null, + email: null, + username: null, + phone: null, + } as any; + + expect(component.hasIdentityValues).toBe(false); + }); + + it("computes hasSecureNoteValue from notes", () => { + (component.cipher as CipherView).notes = "Some note" as any; + expect(component.hasSecureNoteValue).toBe(true); + + (component.cipher as CipherView).notes = null as any; + expect(component.hasSecureNoteValue).toBe(false); + }); + + it("computes hasSshKeyValues from sshKey fields", () => { + (component.cipher as CipherView).sshKey = { + privateKey: "priv", + publicKey: null, + keyFingerprint: null, + } as any; + + expect(component.hasSshKeyValues).toBe(true); + + (component.cipher as CipherView).sshKey = { + privateKey: null, + publicKey: null, + keyFingerprint: null, + } as any; + + expect(component.hasSshKeyValues).toBe(false); + }); + }); + + describe("has*Values in list view", () => { + beforeEach(() => { + jest.spyOn(CipherViewLikeUtils, "isCipherListView").mockReturnValue(true); + }); + + it("uses copyableFields for login values", () => { + (component.cipher as CipherListView).copyableFields = [ + "LoginUsername", + "CardNumber", + ] as CopyableCipherFields[]; + + expect(component.hasLoginValues).toBe(true); + + (component.cipher as CipherListView).copyableFields = [ + "CardNumber", + ] as CopyableCipherFields[]; + + expect(component.hasLoginValues).toBe(false); + }); + + it("uses copyableFields for card values", () => { + (component.cipher as CipherListView).copyableFields = [ + "CardSecurityCode", + ] as CopyableCipherFields[]; + + expect(component.hasCardValues).toBe(true); + + (component.cipher as CipherListView).copyableFields = [ + "LoginUsername", + ] as CopyableCipherFields[]; + + expect(component.hasCardValues).toBe(false); + }); + + it("uses copyableFields for identity values", () => { + (component.cipher as CipherListView).copyableFields = [ + "IdentityEmail", + ] as CopyableCipherFields[]; + + expect(component.hasIdentityValues).toBe(true); + + (component.cipher as CipherListView).copyableFields = [ + "LoginUsername", + ] as CopyableCipherFields[]; + + expect(component.hasIdentityValues).toBe(false); + }); + + it("uses copyableFields for secure note value", () => { + (component.cipher as CipherListView).copyableFields = [ + "SecureNotes", + ] as CopyableCipherFields[]; + expect(component.hasSecureNoteValue).toBe(true); + + (component.cipher as CipherListView).copyableFields = [ + "LoginUsername", + ] as CopyableCipherFields[]; + expect(component.hasSecureNoteValue).toBe(false); + }); + + it("uses copyableFields for ssh key values", () => { + (component.cipher as CipherListView).copyableFields = ["SshKey"] as CopyableCipherFields[]; + expect(component.hasSshKeyValues).toBe(true); + + (component.cipher as CipherListView).copyableFields = [ + "LoginUsername", + ] as CopyableCipherFields[]; + expect(component.hasSshKeyValues).toBe(false); + }); + }); +}); diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts index e24db60a55a..e1398ac9f1f 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.ts @@ -54,17 +54,20 @@ export class ItemCopyActionsComponent { { key: "copyPassword", field: "password" }, { key: "copyVerificationCode", field: "totp" }, ]; - // If both the password and username are visible but the password is hidden, return the username + // If both the password and username are visible but the password is hidden and there's no + // totp code to copy return the username if ( !this.cipher.viewPassword && CipherViewLikeUtils.hasCopyableValue(this.cipher, "username") && - CipherViewLikeUtils.hasCopyableValue(this.cipher, "password") + CipherViewLikeUtils.hasCopyableValue(this.cipher, "password") && + !CipherViewLikeUtils.hasCopyableValue(this.cipher, "totp") ) { return { key: this.i18nService.t("copyUsername"), field: "username" as const, }; } + return this.findSingleCopyableItem(loginItems); } From d4c62495b3ee39aeb4644f809d371d66107cdb16 Mon Sep 17 00:00:00 2001 From: Vicki League Date: Mon, 1 Dec 2025 17:17:00 -0500 Subject: [PATCH 35/37] [CL-717] Bump to higher patch version for security fix (#17759) --- package-lock.json | 217 ++++++++++++++++++++++++++-------------------- package.json | 22 ++--- 2 files changed, 132 insertions(+), 107 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f7b0fb9da8..8e613791c2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,15 @@ "libs/**/*" ], "dependencies": { - "@angular/animations": "20.3.13", + "@angular/animations": "20.3.15", "@angular/cdk": "20.2.14", - "@angular/common": "20.3.13", - "@angular/compiler": "20.3.13", - "@angular/core": "20.3.13", - "@angular/forms": "20.3.13", - "@angular/platform-browser": "20.3.13", - "@angular/platform-browser-dynamic": "20.3.13", - "@angular/router": "20.3.13", + "@angular/common": "20.3.15", + "@angular/compiler": "20.3.15", + "@angular/core": "20.3.15", + "@angular/forms": "20.3.15", + "@angular/platform-browser": "20.3.15", + "@angular/platform-browser-dynamic": "20.3.15", + "@angular/router": "20.3.15", "@bitwarden/commercial-sdk-internal": "0.2.0-main.395", "@bitwarden/sdk-internal": "0.2.0-main.395", "@electron/fuses": "1.8.0", @@ -37,6 +37,10 @@ "@nx/jest": "21.6.9", "@nx/js": "21.6.9", "@nx/webpack": "21.6.9", + "big-integer": "1.6.52", + "braintree-web-drop-in": "1.46.0", + "buffer": "6.0.3", + "bufferutil": "4.0.9", "chalk": "4.1.2", "commander": "14.0.0", "core-js": "3.45.0", @@ -72,10 +76,10 @@ "zxcvbn": "4.4.2" }, "devDependencies": { - "@angular-devkit/build-angular": "20.3.11", + "@angular-devkit/build-angular": "20.3.12", "@angular-eslint/schematics": "20.7.0", - "@angular/cli": "20.3.11", - "@angular/compiler-cli": "20.3.13", + "@angular/cli": "20.3.12", + "@angular/compiler-cli": "20.3.15", "@babel/core": "7.28.5", "@babel/preset-env": "7.28.5", "@compodoc/compodoc": "1.1.26", @@ -161,8 +165,12 @@ "process": "0.11.10", "remark-gfm": "4.0.1", "rimraf": "6.0.1", + "sass": "1.94.2", "sass-loader": "16.0.6", "storybook": "9.1.16", + "style-loader": "4.0.0", + "tailwindcss": "3.4.17", + "ts-jest": "29.4.5", "ts-loader": "9.5.4", "tsconfig-paths-webpack-plugin": "4.2.0", "type-fest": "2.19.0", @@ -727,13 +735,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2003.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.11.tgz", - "integrity": "sha512-/56v/Le9UruIPqQXINoggns0//W2/BIaDd54kvjNK5PjQUyKKj6nmhMA1RgB0yDTBFh7lksLf8IyyGx9ZchGRA==", + "version": "0.2003.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.12.tgz", + "integrity": "sha512-5H40lAFF4CKY32C4HOp6bTlOF1f4WsGCwe7FjFQp9A+T7yoCBiHpIWt2JKTwV4sBoTKVDZOnuf0GG+UVKjQT4A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.11", + "@angular-devkit/core": "20.3.12", "rxjs": "7.8.2" }, "engines": { @@ -753,17 +761,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "20.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.11.tgz", - "integrity": "sha512-DCbyw/nnYxjZZHlHDnkShEeLTG7FxNppg3dMq3g+ClonTcjX4X+1TLD78UokM9idTsZikk+1A6WnOxZLDxFt2Q==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.3.12.tgz", + "integrity": "sha512-HPepPbJA5vprYTWJaSCfpk0s1bPT6Ui6VjFOSb9oY+p9iq+MGkuB1I+swNcRcMLttyMD+FpbMd27F8jSeX5XVw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.11", - "@angular-devkit/build-webpack": "0.2003.11", - "@angular-devkit/core": "20.3.11", - "@angular/build": "20.3.11", + "@angular-devkit/architect": "0.2003.12", + "@angular-devkit/build-webpack": "0.2003.12", + "@angular-devkit/core": "20.3.12", + "@angular/build": "20.3.12", "@babel/core": "7.28.3", "@babel/generator": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", @@ -774,7 +782,7 @@ "@babel/preset-env": "7.28.3", "@babel/runtime": "7.28.3", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "20.3.11", + "@ngtools/webpack": "20.3.12", "ansi-colors": "4.1.3", "autoprefixer": "10.4.21", "babel-loader": "10.0.0", @@ -829,7 +837,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.11", + "@angular/ssr": "^20.3.12", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0 || ^30.2.0", @@ -1021,6 +1029,23 @@ "semver": "bin/semver.js" } }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.3.12.tgz", + "integrity": "sha512-ePuofHOtbgvEq2t+hcmL30s4q9HQ/nv9ABwpLiELdVIObcWUnrnizAvM7hujve/9CQL6gRCeEkxPLPS4ZrK9AQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <6.0", + "webpack": "^5.54.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1507,13 +1532,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2003.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.11.tgz", - "integrity": "sha512-FShY/esFad74pstEFCkin1MgEziXd33fy5Fs0hfMVKxWWKRbtPMSQd8qNd9s+olIYRX/rSOeCuuYXesOtUnodg==", + "version": "0.2003.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2003.12.tgz", + "integrity": "sha512-IkhCU0nAsXYBQOfHu2gQBcYBKhaV1c8wYtu7MmelBcN/iUrG8hRf1sZx+ppUgsdZuBYxCiDiLpcfRVRCIASkvw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2003.11", + "@angular-devkit/architect": "0.2003.12", "rxjs": "7.8.2" }, "engines": { @@ -1537,9 +1562,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "20.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.11.tgz", - "integrity": "sha512-KZDhMemUci42D9CNziM+GxQK5wEMP+TDL9ssUHIkvrr1lsFViHIO+pfzs7QfyM8n6hr7at4gQN9IZRV4rRKyQQ==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.12.tgz", + "integrity": "sha512-ReFxd/UOoVDr3+kIUjmYILQZF89qg62POdY7a7OqBH7plmInFlYVSEDouJvGqj3LVCPiqTk2ZOSChbhS/eLxXA==", "dev": true, "license": "MIT", "dependencies": { @@ -1598,13 +1623,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "20.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.11.tgz", - "integrity": "sha512-ePbARvd3xaN2a+ozFWaoYQHz1pzyzzu247rxRoS4hSOr5jqCsogMqPoGxdBCx6nFlDlP/CYenFR7cFx5OBT4tg==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.12.tgz", + "integrity": "sha512-JqJ1u59y+Ud51k/8MHYzSP+aQOeC2PJBaDmMnvqfWVaIt6n3x4gc/VtuhqhpJ0SKulbFuOWgAfI6QbPFrgUYQQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.11", + "@angular-devkit/core": "20.3.12", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -1958,9 +1983,9 @@ } }, "node_modules/@angular/animations": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.13.tgz", - "integrity": "sha512-IOiZlb+GK3p70J4vRe3PQ+NHCkoVYaq7fz9Pg2FcQ9Ar3EobVtHyFJFGzdStMFbiYR0B66STBNyZcz+V0AwC0A==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.3.15.tgz", + "integrity": "sha512-ikyKfhkxoqQA6JcBN0B9RaN6369sM1XYX81Id0lI58dmWCe7gYfrTp8ejqxxKftl514psQO3pkW8Gn1nJ131Gw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1969,18 +1994,18 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.13" + "@angular/core": "20.3.15" } }, "node_modules/@angular/build": { - "version": "20.3.11", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.11.tgz", - "integrity": "sha512-0YJGRSXZeH3ncpyCZANN0jDdWaRhIOzKQ54+YcuA1uwLzTAUrla3CsJHSVk6ljItIRWymPuUMDRHjxWE/W6WbA==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.12.tgz", + "integrity": "sha512-iAZve4VPviC8y6RFctyh3qFXSlP5mth9K46/0zasB4LV4pcmu8BrzIHERxIn/jCDNdVdPh973kxo1ksO4WpyuA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2003.11", + "@angular-devkit/architect": "0.2003.12", "@babel/core": "7.28.3", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -2022,7 +2047,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.3.11", + "@angular/ssr": "^20.3.12", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^20.0.0", @@ -2182,19 +2207,19 @@ } }, "node_modules/@angular/cli": { - "version": "20.3.11", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.11.tgz", - "integrity": "sha512-FmTvBWo32MAhY2rdXbPjCfC71o0tIzYBuzrjE42SU0+brwwWSvWUmRxS6xM+hH87QrF+gzmi26hOql891OfbIg==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.12.tgz", + "integrity": "sha512-vqVyVjbFPCRMjA5evL7tV2JeR6Anuzb9WcXTMB17fr7uzKNNAvo7KyRaOJjp+TU4JDARTNyGPy0aywfPx7R60A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2003.11", - "@angular-devkit/core": "20.3.11", - "@angular-devkit/schematics": "20.3.11", + "@angular-devkit/architect": "0.2003.12", + "@angular-devkit/core": "20.3.12", + "@angular-devkit/schematics": "20.3.12", "@inquirer/prompts": "7.8.2", "@listr2/prompt-adapter-inquirer": "3.0.1", "@modelcontextprotocol/sdk": "1.17.3", - "@schematics/angular": "20.3.11", + "@schematics/angular": "20.3.12", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.35.0", "ini": "5.0.0", @@ -2358,9 +2383,9 @@ } }, "node_modules/@angular/common": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.13.tgz", - "integrity": "sha512-Jy+Qu6760TZyiDJX0+fNzkc70+lwF9ojdkIyCso/Lvbx1v3Fki0+9Wui7Vge56hknkr05xXg1aEUeqMN0966Lg==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.15.tgz", + "integrity": "sha512-k4mCXWRFiOHK3bUKfWkRQQ8KBPxW8TAJuKLYCsSHPCpMz6u0eA1F0VlrnOkZVKWPI792fOaEAWH2Y4PTaXlUHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2369,14 +2394,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "20.3.13", + "@angular/core": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.13.tgz", - "integrity": "sha512-YEjzHxz9laEcC2YPBA7L09Ys8UIuPrRiBZcGCrOXzXmPATHGYuxqYuhZ8iKmKV0PG/4pP2fxD3Mv5wN0cBaOWg==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.15.tgz", + "integrity": "sha512-lMicIAFAKZXa+BCZWs3soTjNQPZZXrF/WMVDinm8dQcggNarnDj4UmXgKSyXkkyqK5SLfnLsXVzrX6ndVT6z7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2386,9 +2411,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.13.tgz", - "integrity": "sha512-Cou3G8C60eKpD93SKBJRG5pa/xpmMHe6sc2aanWjneGWjZq1kR4v5eQwwr8LUByIsafcqxHGT7+q1bYXT2p2DQ==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.15.tgz", + "integrity": "sha512-8sJoxodxsfyZ8eJ5r6Bx7BCbazXYgsZ1+dE8t5u5rTQ6jNggwNtYEzkyReoD5xvP+MMtRkos3xpwq4rtFnpI6A==", "dev": true, "license": "MIT", "dependencies": { @@ -2409,7 +2434,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.13", + "@angular/compiler": "20.3.15", "typescript": ">=5.8 <6.0" }, "peerDependenciesMeta": { @@ -2595,9 +2620,9 @@ } }, "node_modules/@angular/core": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.13.tgz", - "integrity": "sha512-12Kou+WAIjAUSG5TkDbypV2kreJ105VylAjlQ09bCvsGNTHjezGgahFa/tLz7iyrozhuivtGiQtiDaYsc79ysw==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.15.tgz", + "integrity": "sha512-NMbX71SlTZIY9+rh/SPhRYFJU0pMJYW7z/TBD4lqiO+b0DTOIg1k7Pg9ydJGqSjFO1Z4dQaA6TteNuF99TJCNw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2606,7 +2631,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "20.3.13", + "@angular/compiler": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" }, @@ -2620,9 +2645,9 @@ } }, "node_modules/@angular/forms": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.13.tgz", - "integrity": "sha512-9vu9MCHJtgXvgPH+ZgXN46N3gpBBAckcmG62P7U+9BKivWvv3rEvkgX+4HvO+Pm2D6x/Jy1xbiQuVq9EDGPSNA==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.15.tgz", + "integrity": "sha512-gS5hQkinq52pm/7mxz4yHPCzEcmRWjtUkOVddPH0V1BW/HMni/p4Y6k2KqKBeGb9p8S5EAp6PDxDVLOPukp3mg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2631,16 +2656,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.13", - "@angular/core": "20.3.13", - "@angular/platform-browser": "20.3.13", + "@angular/common": "20.3.15", + "@angular/core": "20.3.15", + "@angular/platform-browser": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.13.tgz", - "integrity": "sha512-KyJzzpD4jMPGotDgVHF0cz9psjlVg6wYQrhuWcLeE97VUvp+CdwdOJ9tlxDlGE5tYZ0JrQxAT0l5qdcr6K9iNQ==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.15.tgz", + "integrity": "sha512-TxRM/wTW/oGXv/3/Iohn58yWoiYXOaeEnxSasiGNS1qhbkcKtR70xzxW6NjChBUYAixz2ERkLURkpx3pI8Q6Dw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2649,9 +2674,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "20.3.13", - "@angular/common": "20.3.13", - "@angular/core": "20.3.13" + "@angular/animations": "20.3.15", + "@angular/common": "20.3.15", + "@angular/core": "20.3.15" }, "peerDependenciesMeta": { "@angular/animations": { @@ -2660,9 +2685,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.13.tgz", - "integrity": "sha512-/kBhzn/TewEPuoUeTh3+uJmviBoaey9g2qegwKj0rrr5XGqoEWurOY6yl8DqZCVHVimLZJdx8bBN7TEi7KlsLg==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.3.15.tgz", + "integrity": "sha512-RizuRdBt0d6ongQ2y8cr8YsXFyjF8f91vFfpSNw+cFj+oiEmRC1txcWUlH5bPLD9qSDied8qazUi0Tb8VPQDGw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2671,16 +2696,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.13", - "@angular/compiler": "20.3.13", - "@angular/core": "20.3.13", - "@angular/platform-browser": "20.3.13" + "@angular/common": "20.3.15", + "@angular/compiler": "20.3.15", + "@angular/core": "20.3.15", + "@angular/platform-browser": "20.3.15" } }, "node_modules/@angular/router": { - "version": "20.3.13", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.13.tgz", - "integrity": "sha512-TpNnqmcCFsAnf3tzdtWeGSSmHb9VTKCI6/1NRBgvpiiNSZ4ehQ/rPTy7D4q5uhu50vB0VECUSGkUAygQI8YHdw==", + "version": "20.3.15", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.15.tgz", + "integrity": "sha512-6+qgk8swGSoAu7ISSY//GatAyCP36hEvvUgvjbZgkXLLH9yUQxdo77ij05aJ5s0OyB25q/JkqS8VTY0z1yE9NQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2689,9 +2714,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "20.3.13", - "@angular/core": "20.3.13", - "@angular/platform-browser": "20.3.13", + "@angular/common": "20.3.15", + "@angular/core": "20.3.15", + "@angular/platform-browser": "20.3.15", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -12001,14 +12026,14 @@ "license": "MIT" }, "node_modules/@schematics/angular": { - "version": "20.3.11", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.11.tgz", - "integrity": "sha512-9mU8nEsty96LT1t+lShDdcfEhJDVfc2sNHEIQsFY8gUVXspkT7lj570odHLqC5aumDYtWc3B/kRSzPxh8SPWFg==", + "version": "20.3.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.12.tgz", + "integrity": "sha512-ikl+nkWUab/Z4eSkBHgq9FLIUH8qh4OcYKeBQ0fyWqIUFHyjjK0JOfwmH1g/3zAmuUMtkthHCehAtyKzCTQjVA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.11", - "@angular-devkit/schematics": "20.3.11", + "@angular-devkit/core": "20.3.12", + "@angular-devkit/schematics": "20.3.12", "jsonc-parser": "3.3.1" }, "engines": { diff --git a/package.json b/package.json index 7e7979b6227..024323a8038 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "libs/**/*" ], "devDependencies": { - "@angular-devkit/build-angular": "20.3.11", + "@angular-devkit/build-angular": "20.3.12", "@angular-eslint/schematics": "20.7.0", - "@angular/cli": "20.3.11", - "@angular/compiler-cli": "20.3.13", + "@angular/cli": "20.3.12", + "@angular/compiler-cli": "20.3.15", "@babel/core": "7.28.5", "@babel/preset-env": "7.28.5", "@compodoc/compodoc": "1.1.26", @@ -148,15 +148,15 @@ "webpack-node-externals": "3.0.0" }, "dependencies": { - "@angular/animations": "20.3.13", + "@angular/animations": "20.3.15", "@angular/cdk": "20.2.14", - "@angular/common": "20.3.13", - "@angular/compiler": "20.3.13", - "@angular/core": "20.3.13", - "@angular/forms": "20.3.13", - "@angular/platform-browser": "20.3.13", - "@angular/platform-browser-dynamic": "20.3.13", - "@angular/router": "20.3.13", + "@angular/common": "20.3.15", + "@angular/compiler": "20.3.15", + "@angular/core": "20.3.15", + "@angular/forms": "20.3.15", + "@angular/platform-browser": "20.3.15", + "@angular/platform-browser-dynamic": "20.3.15", + "@angular/router": "20.3.15", "@bitwarden/sdk-internal": "0.2.0-main.395", "@bitwarden/commercial-sdk-internal": "0.2.0-main.395", "@electron/fuses": "1.8.0", From 37b233aad90a9c9d98b0f4a5a3d38d57abd76a5c Mon Sep 17 00:00:00 2001 From: Vicki League Date: Mon, 1 Dec 2025 17:20:40 -0500 Subject: [PATCH 36/37] [CL-717] Fix autofill storybook config (#17757) --- .../src/autofill/content/components/.lit-storybook/main.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/browser/src/autofill/content/components/.lit-storybook/main.ts b/apps/browser/src/autofill/content/components/.lit-storybook/main.ts index aabf99c5548..4e37cf85244 100644 --- a/apps/browser/src/autofill/content/components/.lit-storybook/main.ts +++ b/apps/browser/src/autofill/content/components/.lit-storybook/main.ts @@ -14,7 +14,6 @@ const config: StorybookConfig = { stories: ["../lit-stories/**/*.lit-stories.@(js|jsx|ts|tsx)", "../lit-stories/**/*.mdx"], addons: [ getAbsolutePath("@storybook/addon-links"), - getAbsolutePath("@storybook/addon-essentials"), getAbsolutePath("@storybook/addon-a11y"), getAbsolutePath("@storybook/addon-designs"), { From 406dbc80666ba95b77b243ebc4c747c6438f75d3 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 1 Dec 2025 22:21:58 +0000 Subject: [PATCH 37/37] Bumped client version(s) --- 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 344a78f2a2c..a5399de920e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2025.12.0", + "version": "2025.12.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 8e613791c2d..878e8b78f1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -292,7 +292,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2025.12.0" + "version": "2025.12.1" }, "libs/admin-console": { "name": "@bitwarden/admin-console",